PR c++/72766 - ICE with VLA
* constexpr.c (cxx_eval_pointer_plus_expression): Check constancy of nelts. * cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in C++11 and up. From-SVN: r238957
This commit is contained in:
parent
37bce35a7e
commit
1108a48582
@ -1,3 +1,11 @@
|
||||
2016-08-01 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/72766
|
||||
* constexpr.c (cxx_eval_pointer_plus_expression): Check constancy
|
||||
of nelts.
|
||||
* cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in
|
||||
C++11 and up.
|
||||
|
||||
2016-07-30 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c++/60760
|
||||
|
@ -3581,6 +3581,10 @@ cxx_eval_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
|
||||
tree type = TREE_TYPE (op00);
|
||||
t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (op00, 1));
|
||||
tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (op00, 0)));
|
||||
nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
|
||||
overflow_p);
|
||||
if (*non_constant_p)
|
||||
return NULL_TREE;
|
||||
/* Don't fold an out-of-bound access. */
|
||||
if (!tree_int_cst_le (t, nelts))
|
||||
return NULL_TREE;
|
||||
|
@ -1967,7 +1967,8 @@ cp_fully_fold (tree x)
|
||||
return x;
|
||||
/* FIXME cp_fold ought to be a superset of maybe_constant_value so we don't
|
||||
have to call both. */
|
||||
x = maybe_constant_value (x);
|
||||
if (cxx_dialect >= cxx11)
|
||||
x = maybe_constant_value (x);
|
||||
return cp_fold (x);
|
||||
}
|
||||
|
||||
|
8
gcc/testsuite/g++.dg/ext/vla16.C
Normal file
8
gcc/testsuite/g++.dg/ext/vla16.C
Normal file
@ -0,0 +1,8 @@
|
||||
// PR c++/72766
|
||||
// { dg-options "-Wno-vla" }
|
||||
|
||||
long fn1() {
|
||||
const int a = fn1();
|
||||
int b[a];
|
||||
int c = *(&b[0] + sizeof(0));
|
||||
}
|
Loading…
Reference in New Issue
Block a user