aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-07-19 16:14:33 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-07-19 16:14:33 +0000
commit84ef4b20b323e76b3eb51e436b300bc877aee5c0 (patch)
treee0d9a1ad0badb6b7a181eed23cb09f8ab3be9c4f
parent8a1af325b424c3cf62a6164a43466b473ec5a666 (diff)
Categories cannot synthesize property ivars,
and a minor cleanup. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108707 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExpr.cpp10
-rw-r--r--test/SemaObjC/synth-provisional-ivars.m5
2 files changed, 10 insertions, 5 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 2d3aaf6edc..447dc38732 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1006,7 +1006,6 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
}
static ObjCIvarDecl *SynthesizeProvisionalIvar(Sema &SemaRef,
- ASTContext &Context,
IdentifierInfo *II,
SourceLocation NameLoc) {
ObjCMethodDecl *CurMeth = SemaRef.getCurMethodDecl();
@@ -1014,7 +1013,8 @@ static ObjCIvarDecl *SynthesizeProvisionalIvar(Sema &SemaRef,
if (!IDecl)
return 0;
ObjCImplementationDecl *ClassImpDecl = IDecl->getImplementation();
- assert(ClassImpDecl && "Method not inside @implementation");
+ if (!ClassImpDecl)
+ return 0;
bool DynamicImplSeen = false;
ObjCPropertyDecl *property = SemaRef.LookupPropertyDecl(IDecl, II);
if (!property)
@@ -1023,8 +1023,8 @@ static ObjCIvarDecl *SynthesizeProvisionalIvar(Sema &SemaRef,
DynamicImplSeen =
(PIDecl->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
if (!DynamicImplSeen) {
- QualType PropType = Context.getCanonicalType(property->getType());
- ObjCIvarDecl *Ivar = ObjCIvarDecl::Create(Context, ClassImpDecl,
+ QualType PropType = SemaRef.Context.getCanonicalType(property->getType());
+ ObjCIvarDecl *Ivar = ObjCIvarDecl::Create(SemaRef.Context, ClassImpDecl,
NameLoc,
II, PropType, /*Dinfo=*/0,
ObjCIvarDecl::Protected,
@@ -1104,7 +1104,7 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S,
if (Ex) return Owned(Ex);
// Synthesize ivars lazily
if (getLangOptions().ObjCNonFragileABI2) {
- if (SynthesizeProvisionalIvar(*this, Context, II, NameLoc))
+ if (SynthesizeProvisionalIvar(*this, II, NameLoc))
return ActOnIdExpression(S, SS, Id, HasTrailingLParen,
isAddressOfOperand);
}
diff --git a/test/SemaObjC/synth-provisional-ivars.m b/test/SemaObjC/synth-provisional-ivars.m
index 2a1a6b15fa..6ed424dae8 100644
--- a/test/SemaObjC/synth-provisional-ivars.m
+++ b/test/SemaObjC/synth-provisional-ivars.m
@@ -38,3 +38,8 @@ int bar;
- (int) Meth6 { return bar1; }
@end
+
+@implementation I(CAT)
+- (int) Meth { return PROP1; } // expected-error {{use of undeclared identifier 'PROP1'}}
+@end
+