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
This commit is contained in:
Jason Merrill 2015-01-21 16:56:34 -05:00 committed by Jason Merrill
parent d2632e47fc
commit b85a324239
3 changed files with 23 additions and 3 deletions

View File

@ -1,5 +1,9 @@
2015-01-21 Jason Merrill <jason@redhat.com>
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.

View File

@ -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;

View File

@ -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>();
}