Fix: allow @protocol forward declarations inside @implementation-s.

llvm-svn: 146147
This commit is contained in:
Erik Verbruggen 2011-12-08 09:58:43 +00:00
parent 311084734d
commit f988785dc0
2 changed files with 53 additions and 1 deletions

View File

@ -1343,7 +1343,6 @@ Decl *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc,
ParsedAttributes &attrs) {
assert(Tok.isObjCAtKeyword(tok::objc_protocol) &&
"ParseObjCAtProtocolDeclaration(): Expected @protocol");
CheckNestedObjCContexts(AtLoc);
ConsumeToken(); // the "protocol" identifier
if (Tok.is(tok::code_completion)) {
@ -1367,6 +1366,8 @@ Decl *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc,
attrs.getList());
}
CheckNestedObjCContexts(AtLoc);
if (Tok.is(tok::comma)) { // list of forward declarations.
SmallVector<IdentifierLocPair, 8> ProtocolRefs;
ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc));

View File

@ -0,0 +1,51 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
@interface X1
@end
@implementation X1 // expected-note {{implementation started here}}
@interface Y1 // expected-error {{missing '@end'}}
@end
@end // expected-error {{'@end' must appear in an Objective-C context}}
@interface X2
@end
@implementation X2 // expected-note {{implementation started here}}
@protocol Y2 // expected-error {{missing '@end'}}
@end
@end // expected-error {{'@end' must appear in an Objective-C context}}
@interface X6 // expected-note {{class started here}}
@interface X7 // expected-error {{missing '@end'}}
@end
@end // expected-error {{'@end' must appear in an Objective-C context}}
@protocol P1 // expected-note {{protocol started here}}
@interface P2 // expected-error {{missing '@end'}}
@end
@end // expected-error {{'@end' must appear in an Objective-C context}}
@interface X4 // expected-note {{class started here}}
@implementation X4 // expected-error {{missing '@end'}}
@end
@end // expected-error {{'@end' must appear in an Objective-C context}}
@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 {}
@end
@interface I2 {}
@protocol P2; // expected-error {{illegal interface qualifier}}
@class C2; // expected-error {{illegal interface qualifier}}
@end
@interface I3
@end
@implementation I3
- Meth {}
+ Cls {}
@protocol P3;
@end