diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc index 30e94797f9fd04fa8f13cb18460d05003e199a6f..f3baae6ade7527a1c99626cc7eff268fca9deba5 100644 --- a/gcc/cp/cp-gimplify.cc +++ b/gcc/cp/cp-gimplify.cc @@ -3412,9 +3412,15 @@ cp_fold (tree x, fold_flags_t flags) if (DECL_CONSTRUCTOR_P (callee)) { loc = EXPR_LOCATION (x); - tree s = build_fold_indirect_ref_loc (loc, - CALL_EXPR_ARG (x, 0)); + tree a = CALL_EXPR_ARG (x, 0); + bool return_this = targetm.cxx.cdtor_returns_this (); + if (return_this) + a = cp_save_expr (a); + tree s = build_fold_indirect_ref_loc (loc, a); r = cp_build_init_expr (s, r); + if (return_this) + r = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (x), r, + fold_convert_loc (loc, TREE_TYPE (x), a)); } x = r; break; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-113083.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-113083.C new file mode 100644 index 0000000000000000000000000000000000000000..3829ac589c499f5fd75df6b6f4dbc78e4a4d720a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-113083.C @@ -0,0 +1,16 @@ +// PR c++/113083 +// { dg-do compile { target c++11 } } +// { dg-options "-Os" } + +struct A { constexpr A (); }; + +void +foo () +{ + A b; +} + +constexpr +A::A () +{ +}