Commit aa613a81 by Jason Merrill

c++: constexpr and lambda capture [PR90212]

This is the same issue as PR86429, just in potential_constant_expression_1
rather than cxx_eval_constant_expression.  As in that case, when we're
trying to evaluate a constant expression within a lambda, we don't have a
constant closure object to refer to, but we can try to refer directly to the
captured variable.

gcc/cp/ChangeLog
2020-05-05  Jason Merrill  <jason@redhat.com>

	PR c++/90212
	* constexpr.c (potential_constant_expression_1): In a lambda
	function, consider a captured variable directly.
parent c79e664b
2020-05-25 Jason Merrill <jason@redhat.com>
PR c++/90212
* constexpr.c (potential_constant_expression_1): In a lambda
function, consider a captured variable directly.
2020-05-25 Jason Merrill <jason@redhat.com>
PR c++/90479
* init.c (get_nsdmi): Don't push_to_top_level for a local class.
......
......@@ -7520,12 +7520,18 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
variable with automatic storage duration defined outside that
lambda-expression, where the reference would be an
odr-use. */
if (want_rval)
/* Since we're doing an lvalue-rvalue conversion, this might
not be an odr-use, so evaluate the variable directly. */
return RECUR (DECL_CAPTURED_VARIABLE (t), rval);
if (flags & tf_error)
{
tree cap = DECL_CAPTURED_VARIABLE (t);
error ("lambda capture of %qE is not a constant expression",
cap);
if (!want_rval && decl_constant_var_p (cap))
if (decl_constant_var_p (cap))
inform (input_location, "because it is used as a glvalue");
}
return false;
......
// PR c++/90212
// { dg-do compile { target c++11 } }
template<typename T> struct tuple {
constexpr tuple(T&& t) : t(t) { }
int t;
};
void foo() {
constexpr tuple<int> v1{1};
constexpr auto v2 = v1;
[&]{ constexpr auto v2 = v1; };
}
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