mirror of https://github.com/microsoft/clang.git
objective-c parsing. Don't crash when selector name
is missing in method prototype. // rdar://11939584 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160789 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
559b928b05
commit
d30ec7076f
|
@ -375,9 +375,9 @@ void Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey,
|
|||
while (1) {
|
||||
// If this is a method prototype, parse it.
|
||||
if (Tok.is(tok::minus) || Tok.is(tok::plus)) {
|
||||
Decl *methodPrototype =
|
||||
ParseObjCMethodPrototype(MethodImplKind, false);
|
||||
allMethods.push_back(methodPrototype);
|
||||
if (Decl *methodPrototype =
|
||||
ParseObjCMethodPrototype(MethodImplKind, false))
|
||||
allMethods.push_back(methodPrototype);
|
||||
// Consume the ';' here, since ParseObjCMethodPrototype() is re-used for
|
||||
// method definitions.
|
||||
if (ExpectAndConsumeSemi(diag::err_expected_semi_after_method_proto)) {
|
||||
|
@ -1001,8 +1001,8 @@ Decl *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
|
|||
if (!SelIdent && Tok.isNot(tok::colon)) { // missing selector name.
|
||||
Diag(Tok, diag::err_expected_selector_for_method)
|
||||
<< SourceRange(mLoc, Tok.getLocation());
|
||||
// Skip until we get a ; or {}.
|
||||
SkipUntil(tok::r_brace);
|
||||
// Skip until we get a ; or @.
|
||||
SkipUntil(tok::at, true /*StopAtSemi*/, true /*don't consume*/);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
|
||||
// rdar://11939584
|
||||
|
||||
@interface PodiumWalkerController
|
||||
@property (assign) id PROP;
|
||||
- (void) // expected-error {{expected ';' after method prototype}}
|
||||
@end // expected-error {{expected selector for Objective-C method}}
|
||||
|
||||
|
||||
id GVAR;
|
||||
|
||||
id StopProgressAnimation()
|
||||
{
|
||||
|
||||
PodiumWalkerController *controller;
|
||||
return controller.PROP;
|
||||
}
|
||||
|
||||
@interface P1
|
||||
@property (assign) id PROP;
|
||||
- (void); // expected-error {{expected selector for Objective-C method}}
|
||||
@end
|
||||
|
||||
id GG=0;
|
||||
|
||||
id Stop1()
|
||||
{
|
||||
|
||||
PodiumWalkerController *controller;
|
||||
return controller.PROP;
|
||||
}
|
||||
|
||||
@interface P2
|
||||
@property (assign) id PROP;
|
||||
- (void)Meth {} // expected-error {{expected ';' after method prototype}}
|
||||
@end
|
||||
|
||||
@interface P3
|
||||
@property (assign) id PROP;
|
||||
- (void)
|
||||
- (void)Meth {} // expected-error {{expected selector for Objective-C method}} \
|
||||
// expected-error {{expected ';' after method prototype}}
|
||||
@end
|
||||
|
||||
id HH=0;
|
||||
|
||||
id Stop2()
|
||||
{
|
||||
|
||||
PodiumWalkerController *controller;
|
||||
return controller.PROP;
|
||||
}
|
Loading…
Reference in New Issue