mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-01 01:31:26 +00:00
Fix: allow @protocol forward declarations inside @implementation-s.
llvm-svn: 146147
This commit is contained in:
parent
311084734d
commit
f988785dc0
@ -1343,7 +1343,6 @@ Decl *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc,
|
|||||||
ParsedAttributes &attrs) {
|
ParsedAttributes &attrs) {
|
||||||
assert(Tok.isObjCAtKeyword(tok::objc_protocol) &&
|
assert(Tok.isObjCAtKeyword(tok::objc_protocol) &&
|
||||||
"ParseObjCAtProtocolDeclaration(): Expected @protocol");
|
"ParseObjCAtProtocolDeclaration(): Expected @protocol");
|
||||||
CheckNestedObjCContexts(AtLoc);
|
|
||||||
ConsumeToken(); // the "protocol" identifier
|
ConsumeToken(); // the "protocol" identifier
|
||||||
|
|
||||||
if (Tok.is(tok::code_completion)) {
|
if (Tok.is(tok::code_completion)) {
|
||||||
@ -1367,6 +1366,8 @@ Decl *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc,
|
|||||||
attrs.getList());
|
attrs.getList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckNestedObjCContexts(AtLoc);
|
||||||
|
|
||||||
if (Tok.is(tok::comma)) { // list of forward declarations.
|
if (Tok.is(tok::comma)) { // list of forward declarations.
|
||||||
SmallVector<IdentifierLocPair, 8> ProtocolRefs;
|
SmallVector<IdentifierLocPair, 8> ProtocolRefs;
|
||||||
ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc));
|
ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc));
|
||||||
|
51
clang/test/Parser/missing-end-4.m
Normal file
51
clang/test/Parser/missing-end-4.m
Normal 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
|
Loading…
Reference in New Issue
Block a user