]> granicus.if.org Git - clang/commitdiff
Make sure we don't accept an @interface inside another objc container
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 23 Mar 2012 23:24:23 +0000 (23:24 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 23 Mar 2012 23:24:23 +0000 (23:24 +0000)
just because there was an attribute in front of it.

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

lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/incomplete-implementation.m
test/SemaObjC/invalid-code.m

index 268ab368ceaf7b21e67ae2010cc39ab766ef7ae9..27500fcd69679a572d58b9aeb0f0b4503a35132f 100644 (file)
@@ -2903,13 +2903,15 @@ Decl *Sema::ActOnMethodDeclaration(
 }
 
 bool Sema::CheckObjCDeclScope(Decl *D) {
-  if (isa<TranslationUnitDecl>(CurContext->getRedeclContext()))
-    return false;
   // Following is also an error. But it is caused by a missing @end
   // and diagnostic is issued elsewhere.
-  if (isa<ObjCContainerDecl>(CurContext->getRedeclContext())) {
+  if (isa<ObjCContainerDecl>(CurContext->getRedeclContext()))
+    return false;
+
+  // If we switched context to translation unit while we are still lexically in
+  // an objc container, it means the parser missed emitting an error.
+  if (isa<TranslationUnitDecl>(getCurLexicalContext()->getRedeclContext()))
     return false;
-  }
   
   Diag(D->getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);
   D->setInvalidDecl();
index df34a43f74aa9d1a146e7ee388699776dd2d2c5c..b10f9f629ec663630c95892bc29ae00d5da5d98b 100644 (file)
@@ -31,7 +31,7 @@
 @implementation Q
 
 __attribute__((visibility("default")))
-@interface QN 
+@interface QN // expected-error {{Objective-C declarations may only appear in global scope}}
 {
 }
 @end
index 4ba34f0e47df09ad56abc9e1a3a8b38279a15ae0..e06c5b566d31f68b79ba89a1270435dfe6ac783e 100644 (file)
@@ -48,3 +48,7 @@ void foo() {
                                     // expected-warning {{cannot find interface declaration for 'SomeI'}}
 -(void)meth {}
 @end
+
+@interface I3
+__attribute__((unavailable)) @interface I4 @end // expected-error {{Objective-C declarations may only appear in global scope}}
+@end