]> granicus.if.org Git - clang/commitdiff
Objective-C: Fixes an ivar lookup bug where
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 31 May 2013 21:51:12 +0000 (21:51 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 31 May 2013 21:51:12 +0000 (21:51 +0000)
'ivar' was used inside a record/union used
as argument to __typeof. // rdar14037151 pr5984

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

lib/Sema/Sema.cpp
test/SemaObjC/ivar-lookup.m

index b7810da98e7297a766a0f81a6459eb2d20384a93..c5f689fe493083b6dd87d67e1c7aafa7ccc06056 100644 (file)
@@ -824,6 +824,8 @@ FunctionDecl *Sema::getCurFunctionDecl() {
 
 ObjCMethodDecl *Sema::getCurMethodDecl() {
   DeclContext *DC = getFunctionLevelDeclContext();
+  while (isa<RecordDecl>(DC))
+    DC = DC->getParent();
   return dyn_cast<ObjCMethodDecl>(DC);
 }
 
index df9d8bac9077ff180b1570d3df7234112236234f..a8620caf21edb2c71ad987d4d1a8948460cd9581 100644 (file)
@@ -80,3 +80,34 @@ extern struct foo x;
   int IVAR; // expected-error {{instance variable is already declared}}
 }
 @end
+
+// PR5984
+// rdar://14037151
+@interface Radar14037151 {
+  int myStatus;
+}
+- (int) test;
+@end
+
+@implementation Radar14037151
+- (int) test
+{
+  myStatus = 1;     // works
+   __typeof(myStatus) __in;  // works.
+  union U {
+    __typeof(myStatus) __in;  // fails.
+  };
+  struct S {
+    __typeof(myStatus) __in;  // fails.
+    struct S1 {
+      __typeof(myStatus) __in;  // fails.
+      struct S {
+        __typeof(myStatus) __in;  // fails.
+      };
+    };
+  };
+
+  return 0;
+}
+@end
+