re PR c++/77907 (Add "const" to argument of constexpr constructor causes the object to be left in unconstructed state)
PR c++/77907 * cp-gimplify.c (cp_fold) <case CALL_EXPR>: When calling constructor and maybe_constant_value returns non-CALL_EXPR, create INIT_EXPR with the object on lhs and maybe_constant_value returned expr on rhs. * g++.dg/cpp0x/pr77907.C: New test. From-SVN: r242790
This commit is contained in:
parent
6103184e81
commit
25cb6b33f7
@ -1,5 +1,10 @@
|
||||
2016-11-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/77907
|
||||
* cp-gimplify.c (cp_fold) <case CALL_EXPR>: When calling constructor
|
||||
and maybe_constant_value returns non-CALL_EXPR, create INIT_EXPR
|
||||
with the object on lhs and maybe_constant_value returned expr on rhs.
|
||||
|
||||
PR c++/71450
|
||||
* pt.c (tsubst_copy): Return error_mark_node when mark_used
|
||||
fails, even when complain & tf_error.
|
||||
|
@ -2340,11 +2340,18 @@ cp_fold (tree x)
|
||||
constant, but the call followed by an INDIRECT_REF is. */
|
||||
if (callee && DECL_DECLARED_CONSTEXPR_P (callee)
|
||||
&& !flag_no_inline)
|
||||
r = maybe_constant_value (x);
|
||||
r = maybe_constant_value (x);
|
||||
optimize = sv;
|
||||
|
||||
if (TREE_CODE (r) != CALL_EXPR)
|
||||
{
|
||||
if (DECL_CONSTRUCTOR_P (callee))
|
||||
{
|
||||
loc = EXPR_LOCATION (x);
|
||||
tree s = build_fold_indirect_ref_loc (loc,
|
||||
CALL_EXPR_ARG (x, 0));
|
||||
r = build2_loc (loc, INIT_EXPR, TREE_TYPE (s), s, r);
|
||||
}
|
||||
x = r;
|
||||
break;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2016-11-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/77907
|
||||
* g++.dg/cpp0x/pr77907.C: New test.
|
||||
|
||||
2016-11-23 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
|
||||
|
||||
PR middle-end/78153
|
||||
|
22
gcc/testsuite/g++.dg/cpp0x/pr77907.C
Normal file
22
gcc/testsuite/g++.dg/cpp0x/pr77907.C
Normal file
@ -0,0 +1,22 @@
|
||||
// PR c++/77907
|
||||
// { dg-do run { target c++11 } }
|
||||
// { dg-options "-O2" }
|
||||
|
||||
struct A {
|
||||
int foo () { return 1; }
|
||||
};
|
||||
|
||||
struct B {
|
||||
using C = int (A::*) ();
|
||||
constexpr explicit B (const C x) : b{x} {}
|
||||
C b;
|
||||
};
|
||||
|
||||
B b{&A::foo};
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (!b.b)
|
||||
__builtin_abort ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user