re PR c++/77907 (Add "const" to argument of constexpr constructor causes the object...
authorJakub Jelinek <jakub@redhat.com>
Wed, 23 Nov 2016 18:45:27 +0000 (19:45 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 23 Nov 2016 18:45:27 +0000 (19:45 +0100)
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

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr77907.C [new file with mode: 0644]

index 7418b22498b96fb470be100ce115edf218105a30..1386d4efa540269bcd769b100e279b17e0364749 100644 (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.
index 0b8f9fcb5f2c411bd5ddfd38a8331364041a980e..0678243b36f0e4d7b91f53e76a5d8a5fd65fc47a 100644 (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;
          }
index 084f3663562df471e60f678c3459a1229c51b084..c74a422c2515b013b1d861d2352f42e25da914fa 100644 (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
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77907.C b/gcc/testsuite/g++.dg/cpp0x/pr77907.C
new file mode 100644 (file)
index 0000000..d46c707
--- /dev/null
@@ -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 ();
+}