зеркало из https://github.com/microsoft/clang-1.git
Make sure we don't accept an @interface inside another objc container
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
This commit is contained in:
Родитель
30a2805c2c
Коммит
fce79ebc6c
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче