re PR c++/61661 (Bogus error: ‘const Outer::Foo{&Outer::Bar}’ is not a constant expression)

PR c++/61661
	* semantics.c (reduced_constant_expression_p): Handle CONSTRUCTOR.

From-SVN: r212439
This commit is contained in:
Jason Merrill 2014-07-10 17:48:26 -04:00 committed by Jason Merrill
parent c0221884ec
commit a25b76d802
3 changed files with 34 additions and 5 deletions

View file

@ -1,5 +1,8 @@
2014-07-10 Jason Merrill <jason@redhat.com>
PR c++/61661
* semantics.c (reduced_constant_expression_p): Handle CONSTRUCTOR.
PR c++/61659
PR c++/61687
* decl2.c (mark_all_virtuals): New variable.

View file

@ -8519,11 +8519,24 @@ cxx_eval_call_expression (const constexpr_call *old_call, tree t,
bool
reduced_constant_expression_p (tree t)
{
if (TREE_CODE (t) == PTRMEM_CST)
/* Even if we can't lower this yet, it's constant. */
return true;
/* FIXME are we calling this too much? */
return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
switch (TREE_CODE (t))
{
case PTRMEM_CST:
/* Even if we can't lower this yet, it's constant. */
return true;
case CONSTRUCTOR:
/* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
tree elt; unsigned HOST_WIDE_INT idx;
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, elt)
if (!reduced_constant_expression_p (elt))
return false;
return true;
default:
/* FIXME are we calling this too much? */
return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
}
}
/* Some expressions may have constant operands but are not constant

View file

@ -0,0 +1,13 @@
// PR c++/61661
// { dg-do compile { target c++11 } }
struct Outer {
void Bar();
struct Foo {
void (Outer::*ptr)() ;
};
static constexpr Foo foo = { &Outer::Bar };
};