Revert my patch in r191155 to allow forward

class/protocol decls in @implementation and
fixup modern rewriter to handle that.
// rdar://15066233

llvm-svn: 191311
This commit is contained in:
Fariborz Jahanian 2013-09-24 17:03:07 +00:00
parent fd4777c046
commit 0dded8ab04
4 changed files with 28 additions and 26 deletions

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

View 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

View 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

View 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