Commit a25b76d8 by Jason Merrill Committed by Jason Merrill

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
parent c0221884
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.
......
......@@ -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)
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
......
// PR c++/61661
// { dg-do compile { target c++11 } }
struct Outer {
void Bar();
struct Foo {
void (Outer::*ptr)() ;
};
static constexpr Foo foo = { &Outer::Bar };
};
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