Commit ea219e6e by Marek Polacek Committed by Marek Polacek

re PR c++/85847 (unexpected expression of kind template_id_expr)

	PR c++/85847
	* init.c (build_new_1): Use fold_non_dependent_expr.  Use a dedicated
	variable for its result.  Fix a condition.
	(build_new): Use fold_non_dependent_expr.  Tweak a condition.

	* g++.dg/cpp0x/new3.C: New test.

From-SVN: r260671
parent 672dfc39
2018-05-24 Marek Polacek <polacek@redhat.com>
PR c++/85847
* init.c (build_new_1): Use fold_non_dependent_expr. Use a dedicated
variable for its result. Fix a condition.
(build_new): Use fold_non_dependent_expr. Tweak a condition.
2018-05-23 Jason Merrill <jason@redhat.com> 2018-05-23 Jason Merrill <jason@redhat.com>
Fix cast to rvalue reference from prvalue. Fix cast to rvalue reference from prvalue.
......
...@@ -2857,10 +2857,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -2857,10 +2857,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
outer_nelts_from_type = true; outer_nelts_from_type = true;
} }
/* Lots of logic below. depends on whether we have a constant number of /* Lots of logic below depends on whether we have a constant number of
elements, so go ahead and fold it now. */ elements, so go ahead and fold it now. */
if (outer_nelts) const_tree cst_outer_nelts = fold_non_dependent_expr (outer_nelts);
outer_nelts = maybe_constant_value (outer_nelts);
/* If our base type is an array, then make sure we know how many elements /* If our base type is an array, then make sure we know how many elements
it has. */ it has. */
...@@ -2912,7 +2911,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -2912,7 +2911,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
/* Warn if we performed the (T[N]) to T[N] transformation and N is /* Warn if we performed the (T[N]) to T[N] transformation and N is
variable. */ variable. */
if (outer_nelts_from_type if (outer_nelts_from_type
&& !TREE_CONSTANT (outer_nelts)) && !TREE_CONSTANT (cst_outer_nelts))
{ {
if (complain & tf_warning_or_error) if (complain & tf_warning_or_error)
{ {
...@@ -3011,9 +3010,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -3011,9 +3010,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts)); size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts));
if (INTEGER_CST == TREE_CODE (outer_nelts)) if (TREE_CODE (cst_outer_nelts) == INTEGER_CST)
{ {
if (tree_int_cst_lt (max_outer_nelts_tree, outer_nelts)) if (tree_int_cst_lt (max_outer_nelts_tree, cst_outer_nelts))
{ {
/* When the array size is constant, check it at compile time /* When the array size is constant, check it at compile time
to make sure it doesn't exceed the implementation-defined to make sure it doesn't exceed the implementation-defined
...@@ -3639,13 +3638,13 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -3639,13 +3638,13 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
/* Try to determine the constant value only for the purposes /* Try to determine the constant value only for the purposes
of the diagnostic below but continue to use the original of the diagnostic below but continue to use the original
value and handle const folding later. */ value and handle const folding later. */
const_tree cst_nelts = maybe_constant_value (nelts); const_tree cst_nelts = fold_non_dependent_expr (nelts);
/* The expression in a noptr-new-declarator is erroneous if it's of /* The expression in a noptr-new-declarator is erroneous if it's of
non-class type and its value before converting to std::size_t is non-class type and its value before converting to std::size_t is
less than zero. ... If the expression is a constant expression, less than zero. ... If the expression is a constant expression,
the program is ill-fomed. */ the program is ill-fomed. */
if (INTEGER_CST == TREE_CODE (cst_nelts) if (TREE_CODE (cst_nelts) == INTEGER_CST
&& tree_int_cst_sgn (cst_nelts) == -1) && tree_int_cst_sgn (cst_nelts) == -1)
{ {
if (complain & tf_error) if (complain & tf_error)
......
2018-05-24 Marek Polacek <polacek@redhat.com>
PR c++/85847
* g++.dg/cpp0x/new3.C: New test.
2018-05-24 Javier Miranda <miranda@adacore.com> 2018-05-24 Javier Miranda <miranda@adacore.com>
* gnat.dg/discr52.adb: New testcase. * gnat.dg/discr52.adb: New testcase.
......
// PR c++/85847
// { dg-do compile { target c++11 } }
template <class>
int f(int b) { return b; }
template <class>
void g()
{
auto a = new int[f<int>(2), 2];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment