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> 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 PR c++/71450
* pt.c (tsubst_copy): Return error_mark_node when mark_used * pt.c (tsubst_copy): Return error_mark_node when mark_used
fails, even when complain & tf_error. fails, even when complain & tf_error.
......
...@@ -2345,6 +2345,13 @@ cp_fold (tree x) ...@@ -2345,6 +2345,13 @@ cp_fold (tree x)
if (TREE_CODE (r) != CALL_EXPR) 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; x = r;
break; 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> 2016-11-23 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
PR middle-end/78153 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