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:
parent
c0221884ec
commit
a25b76d802
3 changed files with 34 additions and 5 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
13
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C
Normal file
13
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C
Normal 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 };
|
||||
};
|
Loading…
Add table
Reference in a new issue