]> granicus.if.org Git - clang/commitdiff
ObjectiveC: ObjC declarations, including forward class
authorFariborz Jahanian <fjahanian@apple.com>
Sun, 22 Sep 2013 00:02:16 +0000 (00:02 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sun, 22 Sep 2013 00:02:16 +0000 (00:02 +0000)
and protocols can be at global scope only.

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

lib/Sema/SemaDeclObjC.cpp
test/Parser/missing-end-4.m

index b938bd6f8b072508c41b71706bd43f721cf93368..ec822212899309e776ccc031905fe240062dabe5 100644 (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
index 8a96e64421c133a2d335826de26c6a1d57891f3d..058daf91f455a52ab37fc6552bf85418a4e20299 100644 (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