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:
parent
0f19e7adef
commit
fb899e32c1
3 changed files with 43 additions and 2 deletions
|
@ -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.
|
||||
|
|
16
gcc/cp/cvt.c
16
gcc/cp/cvt.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
26
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem4.C
Normal file
26
gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem4.C
Normal 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;
|
Loading…
Add table
Reference in a new issue