Another place we need to unshare cached expressions. Tested x86_64-pc-linux-gnu, applying to trunk.
PR c++/92852 - ICE with generic lambda and reference var. * constexpr.c (maybe_constant_value): Likewise. --- gcc/cp/constexpr.c | 2 +- gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C | 12 ++++++++++++ gcc/testsuite/g++.dg/cpp1z/decomp48.C | 8 ++++---- 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index f6b8f331bc9..8e8806345c1 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -6598,7 +6598,7 @@ maybe_constant_value (tree t, tree decl, bool manifestly_const_eval) if (cv_cache == NULL) cv_cache = hash_map<tree, tree>::create_ggc (101); if (tree *cached = cv_cache->get (t)) - return *cached; + return unshare_expr_without_location (*cached); r = cxx_eval_outermost_constant_expr (t, true, true, false, false, decl); gcc_checking_assert (r == t diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C new file mode 100644 index 00000000000..a96fa1ce237 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C @@ -0,0 +1,12 @@ +// PR c++/92852 +// { dg-do compile { target c++14 } } + +struct S { int operator<<(const int &); } glob; +void foo() +{ + S& message_stream = glob; + auto format = [&message_stream](auto && x) + { message_stream << x ; }; + format(3); + format(4u); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp48.C b/gcc/testsuite/g++.dg/cpp1z/decomp48.C index 3c50b02a6c2..35413c79a9d 100644 --- a/gcc/testsuite/g++.dg/cpp1z/decomp48.C +++ b/gcc/testsuite/g++.dg/cpp1z/decomp48.C @@ -18,7 +18,7 @@ f2 () { S v {1, 2}; auto& [s, t] = v; // { dg-warning "structured bindings only available with" "" { target c++14_down } } - return s; // { dg-warning "reference to local variable 'v' returned" "" { target *-*-* } .-1 } + return s; // { dg-warning "reference to local variable 'v' returned" } } int & @@ -33,7 +33,7 @@ f4 () { int a[3] = {1, 2, 3}; auto& [s, t, u] = a; // { dg-warning "structured bindings only available with" "" { target c++14_down } } - return s; // { dg-warning "reference to local variable 'a' returned" "" { target *-*-* } .-1 } + return s; // { dg-warning "reference to local variable 'a' returned" } } int & @@ -78,7 +78,7 @@ f10 () { S v {1, 2}; auto& [s, t] = v; // { dg-warning "structured bindings only available with" "" { target c++14_down } } - return &s; // { dg-warning "address of local variable 'v' returned" "" { target *-*-* } .-1 } + return &s; // { dg-warning "address of local variable 'v' returned" } } int * @@ -93,7 +93,7 @@ f12 () { int a[3] = {1, 2, 3}; auto& [s, t, u] = a; // { dg-warning "structured bindings only available with" "" { target c++14_down } } - return &s; // { dg-warning "address of local variable 'a' returned" "" { target *-*-* } .-1 } + return &s; // { dg-warning "address of local variable 'a' returned" } } int * base-commit: 64c9f2d9972ad359a32f0a97ee0a806c2532db15 -- 2.18.1