PR c++/78495 - wrong code inherited ctor and invisi-ref parm
authorNathan Sidwell <nathan@acm.org>
Fri, 20 Jan 2017 17:53:44 +0000 (17:53 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 20 Jan 2017 17:53:44 +0000 (17:53 +0000)
PR c++/78495 - wrong code inherited ctor and invisi-ref parm
* cp-gimplify.c (cp_generize_r): Don't skip thunks.

PR c++/79495
* g++.dg/cpp1z/inh-ctor38.C: New.

From-SVN: r244728

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

index 9b71c90f742053a36ef91d45e35ada6057978b3d..d1ad2eb5c72fa8a098fc21bda12d9c7b6ff67de9 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-20  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/78495 - wrong code inherited ctor and invisi-ref parm
+       * cp-gimplify.c (cp_generize_r): Don't skip thunks.
+
 2017-01-20  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/77829
index e792cfde71b9891718d949f81b33881afb0630f3..2c59c07627079f487a54da6083528d863fbaa7c1 100644 (file)
@@ -1103,15 +1103,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
       && omp_var_to_track (stmt))
     omp_cxx_notice_variable (wtd->omp_ctx, stmt);
 
-  /* Don't dereference parms in a thunk, pass the references through. */
-  if ((TREE_CODE (stmt) == CALL_EXPR && CALL_FROM_THUNK_P (stmt))
-      || (TREE_CODE (stmt) == AGGR_INIT_EXPR && AGGR_INIT_FROM_THUNK_P (stmt)))
-    {
-      *walk_subtrees = 0;
-      return NULL;
-    }
-
-  /* Otherwise, do dereference invisible reference parms.  */
+  /* Dereference invisible reference parms.  */
   if (wtd->handle_invisiref_parm_p && is_invisiref_parm (stmt))
     {
       *stmt_p = convert_from_reference (stmt);
index 69ba36cc7e8f14f4fc53ede842166344f6406e30..dbbe3455c7934967c377ed11f720f4f12c527ce1 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-20  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/79495
+       * g++.dg/cpp1z/inh-ctor38.C: New.
+
 2017-01-20  Marek Polacek  <polacek@redhat.com>
 
        PR c/79152
diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor38.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor38.C
new file mode 100644 (file)
index 0000000..fbee8ca
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do run { target c++11 } }
+// PR78495 failed to propagate pass-by-value struct to base ctor.
+
+struct Ptr {
+  void *ptr = 0;
+
+  Ptr() {}
+  Ptr(Ptr const&) = delete;
+  Ptr(Ptr&& other) : ptr (other.ptr) {}
+};
+
+struct Base {
+  Ptr val;
+  Base(Ptr val_) : val(static_cast<Ptr&&>(val_)) {}
+};
+
+struct Derived: Base {
+  using Base::Base;
+};
+
+void *Foo () {
+  Ptr ptr;
+
+  Derived d(static_cast<Ptr&&>(ptr));
+
+  return d.val.ptr;
+}
+
+int main () {
+  return Foo () != 0;
+}