]> granicus.if.org Git - clang/commitdiff
Revert my patch in r191155 to allow forward
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 24 Sep 2013 17:03:07 +0000 (17:03 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 24 Sep 2013 17:03:07 +0000 (17:03 +0000)
class/protocol decls in @implementation and
fixup modern rewriter to handle that.
// rdar://15066233

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

lib/Rewrite/Frontend/RewriteModernObjC.cpp
lib/Sema/SemaDeclObjC.cpp
test/Parser/missing-end-4.m
test/Rewriter/rewrite-forward-class.mm

index ecd509610a71d60bce9444153075329b7bb35a32..af9cda3faddf8b85910b013fb6f1bc7826938d17 100644 (file)
@@ -1066,16 +1066,19 @@ void RewriteModernObjC::RewriteForwardClassEpilogue(ObjCInterfaceDecl *ClassDecl
 void RewriteModernObjC::RewriteForwardClassDecl(DeclGroupRef D) {
   std::string typedefString;
   for (DeclGroupRef::iterator I = D.begin(), E = D.end(); I != E; ++I) {
-    ObjCInterfaceDecl *ForwardDecl = cast<ObjCInterfaceDecl>(*I);
-    if (I == D.begin()) {
-      // Translate to typedef's that forward reference structs with the same name
-      // as the class. As a convenience, we include the original declaration
-      // as a comment.
-      typedefString += "// @class ";
-      typedefString += ForwardDecl->getNameAsString();
-      typedefString += ";";
+    if (ObjCInterfaceDecl *ForwardDecl = dyn_cast<ObjCInterfaceDecl>(*I)) {
+      if (I == D.begin()) {
+        // Translate to typedef's that forward reference structs with the same name
+        // as the class. As a convenience, we include the original declaration
+        // as a comment.
+        typedefString += "// @class ";
+        typedefString += ForwardDecl->getNameAsString();
+        typedefString += ";";
+      }
+      RewriteOneForwardClassDecl(ForwardDecl, typedefString);
     }
-    RewriteOneForwardClassDecl(ForwardDecl, typedefString);
+    else
+      HandleTopLevelSingleDecl(*I);
   }
   DeclGroupRef::iterator I = D.begin();
   RewriteForwardClassEpilogue(cast<ObjCInterfaceDecl>(*I), typedefString);
index ec822212899309e776ccc031905fe240062dabe5..b938bd6f8b072508c41b71706bd43f721cf93368 100644 (file)
@@ -809,12 +809,6 @@ 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,
@@ -1933,12 +1927,6 @@ 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 058daf91f455a52ab37fc6552bf85418a4e20299..8a96e64421c133a2d335826de26c6a1d57891f3d 100644 (file)
@@ -32,9 +32,9 @@
 @interface I
 @end
 @implementation I
-@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}}
+@protocol P; // forward declarations of protocols in @implementations is allowed
+@class C; // forward declarations of classes in @implementations is allowed
+- (C<P>*) MyMeth {}
 @end
 
 @interface I2 {}
@@ -47,5 +47,5 @@
 @implementation I3
 - Meth {}
 + Cls {}
-@protocol P3; // expected-error {{Objective-C declarations may only appear in global scope}}
+@protocol P3;
 @end
index 9f4e7e21e862b0978fed576d097d33e13cc031bd..3d3ef3e6c9afc7938a0a9770e5500778c55b13f7 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc -fobjc-runtime=macosx-fragile-10.5 %s -o %t-rw.cpp
+// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
 // RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
 
 extern "C" {
@@ -42,3 +42,14 @@ int I,J,K;
 };
 
 
+// rdar://15027032
+@interface ISDPropertyChangeGroup
+@end
+
+@implementation ISDPropertyChangeGroup
+@class ISDClientState;
+- (id)lastModifiedGeneration : (ISDClientState *) obj
+{
+  return obj ;
+}
+@end