Commit 28a5d5c3 by Jason Merrill

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.
parent 6ad405c4
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
......
......@@ -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
......
// 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);
}
......@@ -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 *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment