Commit a2a5f18e by Jason Merrill Committed by Jason Merrill

re PR c++/56901 (lambda with implicit capture by reference)

	PR c++/56901
	* semantics.c (lambda_capture_field_type, lambda_proxy_type):
	Strip references before checking WILDCARD_TYPE_P.

From-SVN: r197819
parent 7b55f98f
2013-04-11 Jason Merrill <jason@redhat.com>
PR c++/56901
* semantics.c (lambda_capture_field_type, lambda_proxy_type):
Strip references before checking WILDCARD_TYPE_P.
2013-04-11 Paolo Carlini <paolo.carlini@oracle.com>
* call.c (build_conditional_expr_1, build_over_call): Protect
......
......@@ -9114,16 +9114,14 @@ lambda_function (tree lambda)
tree
lambda_capture_field_type (tree expr)
{
tree type;
if (!TREE_TYPE (expr) || WILDCARD_TYPE_P (TREE_TYPE (expr)))
tree type = non_reference (unlowered_expr_type (expr));
if (!type || WILDCARD_TYPE_P (type))
{
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = expr;
DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true;
SET_TYPE_STRUCTURAL_EQUALITY (type);
}
else
type = non_reference (unlowered_expr_type (expr));
return type;
}
......@@ -9324,7 +9322,7 @@ lambda_proxy_type (tree ref)
if (REFERENCE_REF_P (ref))
ref = TREE_OPERAND (ref, 0);
type = TREE_TYPE (ref);
if (type && !WILDCARD_TYPE_P (type))
if (type && !WILDCARD_TYPE_P (non_reference (type)))
return type;
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = ref;
......
// PR c++/56901
// { dg-require-effective-target c++11 }
template <typename>
void foo_impl()
{
int data;
auto L = [&](){ return data; };
[&](){ L(); }();
[&L](){ L(); }();
}
void foo()
{
foo_impl<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