From 28a5d5c365044710ba32510b9bec67dd40562154 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 23 Jan 2020 15:45:36 -0500 Subject: [PATCH] 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. --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/constexpr.c | 2 +- gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C | 12 ++++++++++++ gcc/testsuite/g++.dg/cpp1z/decomp48.C | 8 ++++---- 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c01bece..b1c9e2c 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-23 Paolo Carlini PR c++/92804 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index f6b8f33..8e880634 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::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 0000000..a96fa1c --- /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 3c50b02..35413c7 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 * -- 2.7.4