Make sure we don't accept an @interface inside another objc container

just because there was an attribute in front of it.

llvm-svn: 153355
This commit is contained in:
Argyrios Kyrtzidis 2012-03-23 23:24:23 +00:00
parent aaf9743f56
commit 822c433a27
3 changed files with 11 additions and 5 deletions

View 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();

View 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

View 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