commit e8254e33cb727aebc874d1508b13386a6cbd093b
Author: Jason Merrill <jason@redhat.com>
Date: Wed Jan 21 07:45:02 2015 -0500
PR c++/64603
* constexpr.c (cxx_eval_constant_expression): Only shortcut
constant CONSTRUCTORs.
@@ -2943,9 +2943,6 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
*overflow_p = true;
return t;
}
- if (TREE_CODE (t) != NOP_EXPR
- && reduced_constant_expression_p (t))
- return fold (t);
switch (TREE_CODE (t))
{
@@ -3315,6 +3312,10 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
break;
case CONSTRUCTOR:
+ if (TREE_CONSTANT (t))
+ /* Don't re-process a constant CONSTRUCTOR, but do fold it to
+ VECTOR_CST if applicable. */
+ return fold (t);
r = cxx_eval_bare_aggregate (ctx, t, lval,
non_constant_p, overflow_p);
break;
new file mode 100644
@@ -0,0 +1,15 @@
+// PR c++/64603
+// { dg-do compile { target c++11 } }
+
+template <int i> constexpr int find_longest_name()
+{
+ return sizeof("Main") - 1;
+}
+
+template <int i, int l = find_longest_name<i>()> void create_all_loggers()
+{}
+
+int main()
+{
+ create_all_loggers<1>();
+}