re PR c++/65695 (NSDMI calling constexpr constructor with pointer-to-member is not a constant expression)

PR c++/65695
	* cvt.c (cp_fold_convert): Avoid wrapping PTRMEM_CST in NOP_EXPR.

From-SVN: r222097
This commit is contained in:
Jason Merrill 2015-04-14 12:02:41 -04:00 committed by Jason Merrill
parent 0f19e7adef
commit fb899e32c1
3 changed files with 43 additions and 2 deletions

View file

@ -1,5 +1,8 @@
2015-04-14 Jason Merrill <jason@redhat.com>
PR c++/65695
* cvt.c (cp_fold_convert): Avoid wrapping PTRMEM_CST in NOP_EXPR.
PR c++/65721
* name-lookup.c (do_class_using_decl): Complain about specifying
the current class even if there are dependent bases.

View file

@ -603,8 +603,20 @@ ignore_overflows (tree expr, tree orig)
tree
cp_fold_convert (tree type, tree expr)
{
tree conv = fold_convert (type, expr);
conv = ignore_overflows (conv, expr);
tree conv;
if (TREE_TYPE (expr) == type)
conv = expr;
else if (TREE_CODE (expr) == PTRMEM_CST)
{
/* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */
conv = copy_node (expr);
TREE_TYPE (conv) = type;
}
else
{
conv = fold_convert (type, expr);
conv = ignore_overflows (conv, expr);
}
return conv;
}

View file

@ -0,0 +1,26 @@
// PR c++/65695
// { dg-do compile { target c++11 } }
struct Foo;
struct Bar
{
using MemberFuncT = int (Foo::*)();
MemberFuncT h_;
constexpr Bar(MemberFuncT h) : h_{h}
{
}
};
struct Foo
{
int test()
{
return -1;
}
static constexpr Bar bar {&Foo::test};
};
constexpr Bar Foo::bar;