ObjectiveC: ObjC declarations, including forward class

and protocols can be at global scope only.

llvm-svn: 191155
This commit is contained in:
Fariborz Jahanian 2013-09-22 00:02:16 +00:00
parent 829aec5900
commit aa78931e91
2 changed files with 16 additions and 4 deletions

View File

@ -809,6 +809,12 @@ Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc,
unsigned NumElts,
AttributeList *attrList) {
SmallVector<Decl *, 8> DeclsInGroup;
if (isa<ObjCContainerDecl>(CurContext)) {
Diag(AtProtocolLoc,
diag::err_objc_decls_may_only_appear_in_global_scope);
return BuildDeclaratorGroup(DeclsInGroup, false);
}
for (unsigned i = 0; i != NumElts; ++i) {
IdentifierInfo *Ident = IdentList[i].first;
ObjCProtocolDecl *PrevDecl = LookupProtocol(Ident, IdentList[i].second,
@ -1927,6 +1933,12 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
SourceLocation *IdentLocs,
unsigned NumElts) {
SmallVector<Decl *, 8> DeclsInGroup;
if (isa<ObjCContainerDecl>(CurContext)) {
Diag(AtClassLoc,
diag::err_objc_decls_may_only_appear_in_global_scope);
return BuildDeclaratorGroup(DeclsInGroup, false);
}
for (unsigned i = 0; i != NumElts; ++i) {
// Check for another declaration kind with the same name.
NamedDecl *PrevDecl

View File

@ -32,9 +32,9 @@
@interface I
@end
@implementation I
@protocol P; // forward declarations of protocols in @implementations is allowed
@class C; // forward declarations of classes in @implementations is allowed
- (C<P>*) MyMeth {}
@protocol P; // expected-error {{Objective-C declarations may only appear in global scope}}
@class C; // expected-error {{Objective-C declarations may only appear in global scope}}
- (C<P>*) MyMeth {} // expected-error {{expected a type}}
@end
@interface I2 {}
@ -47,5 +47,5 @@
@implementation I3
- Meth {}
+ Cls {}
@protocol P3;
@protocol P3; // expected-error {{Objective-C declarations may only appear in global scope}}
@end