From: Jason Merrill Date: Thu, 23 Jan 2020 20:45:36 +0000 (-0500) Subject: c++: Unshare expressions from constexpr cache. X-Git-Tag: releases/gcc-9.3.0~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4b7cf5865823df4b4df1d840d692dfc83fd0672;p=thirdparty%2Fgcc.git c++: Unshare expressions from constexpr cache. Another place we need to unshare cached expressions. PR c++/92852 - ICE with generic lambda and reference var. * constexpr.c (maybe_constant_value): Likewise. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b3008ffab2f5..9961a6f7f64d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-01-24 Jason Merrill + + PR c++/92852 - ICE with generic lambda and reference var. + * constexpr.c (maybe_constant_value): Likewise. + 2020-01-22 Jakub Jelinek Backported from mainline diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index e2ca305aaca0..f0d4cb5e8e77 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -5582,7 +5582,7 @@ maybe_constant_value (tree t, tree decl, bool manifestly_const_eval) if (cv_cache == NULL) cv_cache = hash_map::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, 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 000000000000..a96fa1ce237c --- /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 3c50b02a6c24..35413c79a9da 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 *