From b85a3242397d2c63d1185bbc17386520335313cb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 21 Jan 2015 16:56:34 -0500 Subject: [PATCH] re PR c++/64603 (bogus error "no matching function for call to ..." with templates) PR c++/64603 * constexpr.c (cxx_eval_constant_expression): Only shortcut constant CONSTRUCTORs. From-SVN: r219973 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/constexpr.c | 7 ++++--- gcc/testsuite/g++.dg/cpp0x/constexpr-sizeof1.C | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-sizeof1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 526742c0bce..6e3a2e566fa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2015-01-21 Jason Merrill + PR c++/64603 + * constexpr.c (cxx_eval_constant_expression): Only shortcut + constant CONSTRUCTORs. + PR c++/64647 * constexpr.c (ensure_literal_type_for_constexpr_object): Don't give a hard error in a template instantiation. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index decc84d301f..7853d377849 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-sizeof1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-sizeof1.C new file mode 100644 index 00000000000..d9a032b392f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-sizeof1.C @@ -0,0 +1,15 @@ +// PR c++/64603 +// { dg-do compile { target c++11 } } + +template constexpr int find_longest_name() +{ + return sizeof("Main") - 1; +} + +template ()> void create_all_loggers() +{} + +int main() +{ + create_all_loggers<1>(); +} -- 2.30.2