]> granicus.if.org Git - clang/commitdiff
Tighten the rules when deciding if an ivar must be
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 30 Jul 2010 16:59:05 +0000 (16:59 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 30 Jul 2010 16:59:05 +0000 (16:59 +0000)
auto-synthesized (nonfragile-abi2 specific).
Fixes radar 8251648.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109866 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaObjC/synth-provisional-ivars.m

index a934adfb0c4bd764abc7da6949143714e19b3227..1dffa0e64c2c4c3f8ff4246a0af7d80125fe108a 100644 (file)
@@ -1005,8 +1005,8 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
 }
 
 static ObjCPropertyDecl *OkToSynthesizeProvisionalIvar(Sema &SemaRef,
-                                          IdentifierInfo *II,
-                                          SourceLocation NameLoc) {
+                                                       IdentifierInfo *II,
+                                                       SourceLocation NameLoc) {
   ObjCMethodDecl *CurMeth = SemaRef.getCurMethodDecl();
   ObjCInterfaceDecl *IDecl = CurMeth->getClassInterface();
   if (!IDecl)
@@ -1024,9 +1024,21 @@ static ObjCPropertyDecl *OkToSynthesizeProvisionalIvar(Sema &SemaRef,
 }
 
 static ObjCIvarDecl *SynthesizeProvisionalIvar(Sema &SemaRef,
+                                               LookupResult &Lookup,
                                                IdentifierInfo *II,
                                                SourceLocation NameLoc) {
   ObjCMethodDecl *CurMeth = SemaRef.getCurMethodDecl();
+  bool LookForIvars;
+  if (Lookup.empty())
+    LookForIvars = true;
+  else if (CurMeth->isClassMethod())
+    LookForIvars = false;
+  else
+    LookForIvars = (Lookup.isSingleResult() &&
+                    Lookup.getFoundDecl()->isDefinedOutsideFunctionOrMethod());
+  if (!LookForIvars)
+    return 0;
+  
   ObjCInterfaceDecl *IDecl = CurMeth->getClassInterface();
   if (!IDecl)
     return 0;
@@ -1122,7 +1134,7 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S,
       if (Ex) return Owned(Ex);
       // Synthesize ivars lazily
       if (getLangOptions().ObjCNonFragileABI2) {
-        if (SynthesizeProvisionalIvar(*this, II, NameLoc))
+        if (SynthesizeProvisionalIvar(*this, R, II, NameLoc))
           return ActOnIdExpression(S, SS, Id, HasTrailingLParen,
                                    isAddressOfOperand);
       }
index 6ed424dae87e08a2d71a75509dd36d98fb7316c8..973c771ad7797a09291f231966c077f395e8b0f1 100644 (file)
@@ -43,3 +43,8 @@ int bar;
 - (int) Meth { return PROP1; }  // expected-error {{use of undeclared identifier 'PROP1'}}
 @end
 
+@implementation I(r8251648)
+- (int) Meth1: (int) bar {
+  return bar; // expected-warning {{local declaration of 'bar' hides instance variable}}
+}
+@end