r199772 - Fix regression in r197623: only diagnose a by-copy capture of an incomplete
Richard Smith
richard-llvm at metafoo.co.uk
Tue Jan 21 15:27:47 PST 2014
Author: rsmith
Date: Tue Jan 21 17:27:46 2014
New Revision: 199772
URL: http://llvm.org/viewvc/llvm-project?rev=199772&view=rev
Log:
Fix regression in r197623: only diagnose a by-copy capture of an incomplete
type if the capture is, actually, by copy.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/SemaCXX/lambda-expressions.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=199772&r1=199771&r2=199772&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 21 17:27:46 2014
@@ -11660,15 +11660,6 @@ static ExprResult addAsFieldToClosureTyp
bool RefersToEnclosingLocal) {
CXXRecordDecl *Lambda = LSI->Lambda;
- // Make sure that by-copy captures are of a complete type.
- if (!DeclRefType->isDependentType() &&
- !DeclRefType->isReferenceType() &&
- S.RequireCompleteType(Loc, DeclRefType,
- diag::err_capture_of_incomplete_type,
- Var->getDeclName())) {
- return ExprError();
- }
-
// Build the non-static data member.
FieldDecl *Field
= FieldDecl::Create(S.Context, Lambda, Loc, Loc, 0, FieldType,
@@ -11844,9 +11835,18 @@ static bool captureInLambda(LambdaScopeI
return false;
}
- if (S.RequireNonAbstractType(Loc, CaptureType,
- diag::err_capture_of_abstract_type))
- return false;
+ // Make sure that by-copy captures are of a complete and non-abstract type.
+ if (BuildAndDiagnose) {
+ if (!CaptureType->isDependentType() &&
+ S.RequireCompleteType(Loc, CaptureType,
+ diag::err_capture_of_incomplete_type,
+ Var->getDeclName()))
+ return false;
+
+ if (S.RequireNonAbstractType(Loc, CaptureType,
+ diag::err_capture_of_abstract_type))
+ return false;
+ }
}
// Capture this variable in the lambda.
Modified: cfe/trunk/test/SemaCXX/lambda-expressions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=199772&r1=199771&r2=199772&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/lambda-expressions.cpp (original)
+++ cfe/trunk/test/SemaCXX/lambda-expressions.cpp Tue Jan 21 17:27:46 2014
@@ -294,3 +294,33 @@ namespace NSDMIs_in_lambdas {
auto y = [&]{ struct S { int n, m = n; }; };
void g() { auto z = [&]{ struct S { int n, m = n; }; }; }
}
+
+namespace CaptureIncomplete {
+ struct Incomplete; // expected-note 2{{forward decl}}
+ void g(const Incomplete &a);
+ void f(Incomplete &a) {
+ (void) [a] {}; // expected-error {{incomplete}}
+ (void) [&a] {};
+
+ (void) [=] { g(a); }; // expected-error {{incomplete}}
+ (void) [&] { f(a); };
+ }
+}
+
+namespace CaptureAbstract {
+ struct S {
+ virtual void f() = 0; // expected-note {{unimplemented}}
+ int n = 0;
+ };
+ struct T : S {
+ constexpr T() {}
+ void f();
+ };
+ void f() {
+ constexpr T t = T();
+ S &s = const_cast<T&>(t);
+ // FIXME: Once we properly compute odr-use per DR712, this should be
+ // accepted (and should not capture 's').
+ [=] { return s.n; }; // expected-error {{abstract}}
+ }
+}
More information about the cfe-commits
mailing list