PR c++/80084 - wrong C++17 decomposition by reference of parameter.
authorJason Merrill <jason@redhat.com>
Mon, 20 Mar 2017 02:22:43 +0000 (22:22 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 Mar 2017 02:22:43 +0000 (22:22 -0400)
* decl.c (cp_finish_decomp): Don't pull out the DECL_INITIAL of a
reference decomposition.

From-SVN: r246273

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp1z/decomp27.C [new file with mode: 0644]

index a7248d93ca37710f2749f90e2eb8a828086b42df..7ffd818bec6c75245129402180dc1fb572afba63 100644 (file)
@@ -1,5 +1,9 @@
 2017-03-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/80084 - wrong C++17 decomposition by reference of parameter.
+       * decl.c (cp_finish_decomp): Don't pull out the DECL_INITIAL of a
+       reference decomposition.
+
        PR c++/80077 - error with constexpr and -fno-elide-constructors.
        * constexpr.c (cxx_eval_call_expression): Set ctx->call while
        expanding trivial constructor.
index bf24e8ba164e063fb11e00f45a37d871659c8466..0a9256680a0ec5a222df9c48e624a07b93c5e90c 100644 (file)
@@ -7439,9 +7439,6 @@ cp_finish_decomp (tree decl, tree first, unsigned int count)
 
   if (TREE_CODE (type) == REFERENCE_TYPE)
     {
-      /* If e is a constant reference, use the referent directly.  */
-      if (DECL_INITIAL (decl))
-       dexp = DECL_INITIAL (decl);
       dexp = convert_from_reference (dexp);
       type = TREE_TYPE (type);
     }
diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp27.C b/gcc/testsuite/g++.dg/cpp1z/decomp27.C
new file mode 100644 (file)
index 0000000..f26722a
--- /dev/null
@@ -0,0 +1,26 @@
+// PR c++/80084
+// { dg-options -std=c++1z }
+// { dg-do run }
+
+struct A
+{
+  A() { }
+  A(const A&) { }
+};
+
+struct B
+{
+  A a;
+};
+
+void f(B b)
+{
+  auto& [a] = b;
+  if (&a != &b.a)
+    __builtin_abort();
+}
+
+int main()
+{
+  f(B());
+}