Commit 25cb6b33 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/77907 (Add "const" to argument of constexpr constructor causes the…

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
parent 6103184e
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;
}
......
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
......
// 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment