From a4dfaae1051ed23cea9aefaefdef156d0f02c1cd Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sun, 19 Mar 2017 22:22:43 -0400 Subject: [PATCH] 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. From-SVN: r246273 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl.c | 3 --- gcc/testsuite/g++.dg/cpp1z/decomp27.C | 26 ++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/decomp27.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a7248d9..7ffd818 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-03-19 Jason Merrill + 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. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index bf24e8b..0a92566 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 0000000..f26722a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp27.C @@ -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()); +} -- 2.7.4