diff options
author | Jason Merrill <jason@redhat.com> | 2020-01-23 15:45:36 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-01-24 12:34:02 -0500 |
commit | 28a5d5c365044710ba32510b9bec67dd40562154 (patch) | |
tree | 0f1d332f9ea3b9b71905c754e94626b25ff471aa /gcc | |
parent | 6ad405c430f40424a53fc93e5ea12b91453e1daf (diff) | |
download | gcc-28a5d5c365044710ba32510b9bec67dd40562154.zip gcc-28a5d5c365044710ba32510b9bec67dd40562154.tar.gz gcc-28a5d5c365044710ba32510b9bec67dd40562154.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-ref1.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/decomp48.C | 8 |
4 files changed, 22 insertions, 5 deletions
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 <jason@redhat.com> + + PR c++/92852 - ICE with generic lambda and reference var. + * constexpr.c (maybe_constant_value): Likewise. + 2020-01-23 Paolo Carlini <paolo.carlini@oracle.com> 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<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 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 * |