===================================================================
@@ -10377,15 +10377,15 @@ cp_parser_lambda_introducer (cp_parser* parser, tr
unqualified_name_lookup_error (capture_id);
continue;
}
- else if (DECL_P (capture_init_expr)
- && (!VAR_P (capture_init_expr)
- && TREE_CODE (capture_init_expr) != PARM_DECL))
+ else if (!VAR_P (capture_init_expr)
+ && TREE_CODE (capture_init_expr) != PARM_DECL)
{
error_at (capture_token->location,
- "capture of non-variable %qD ",
+ "capture of non-variable %qE ",
capture_init_expr);
- inform (DECL_SOURCE_LOCATION (capture_init_expr),
- "%q#D declared here", capture_init_expr);
+ if (DECL_P (capture_init_expr))
+ inform (DECL_SOURCE_LOCATION (capture_init_expr),
+ "%q#D declared here", capture_init_expr);
continue;
}
if (VAR_P (capture_init_expr)
===================================================================
@@ -5,7 +5,7 @@ void foo (int);
void foo (void)
{
- [&foo] // { dg-error "cannot capture" }
+ [&foo] // { dg-error "5:capture of non-variable" }
{
foo (0);
};
===================================================================
@@ -3,7 +3,7 @@
template <typename T>
constexpr int r(T x) {
- auto f = [r,x]() { return r(x); }; // { dg-error "incomplete type" }
+ auto f = [r,x]() { return r(x); }; // { dg-error "13:capture of non-variable" }
return 0;
}
===================================================================
@@ -0,0 +1,8 @@
+// PR c++/84618
+// { dg-do compile { target c++11 } }
+
+template <int>
+struct S {
+ void b() const;
+ void b() { [b] {}; } // { dg-error "15:capture of non-variable" }
+};