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.
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
--- /dev/null
+// 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 ();
+}