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:
Jakub Jelinek 2016-11-23 19:45:27 +01:00 committed by Jakub Jelinek
parent 6103184e81
commit 25cb6b33f7
4 changed files with 40 additions and 1 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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

View 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 ();
}