From: Fariborz Jahanian Date: Thu, 26 Jul 2012 17:32:28 +0000 (+0000) Subject: objective-c parsing. Don't crash when selector name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d30ec7076fef736754206ac87a4f2c67251cc4d8;p=clang 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 --- diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 857040f265..5872e1dc8a 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -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; } diff --git a/test/Parser/missing-selector-name.mm b/test/Parser/missing-selector-name.mm new file mode 100644 index 0000000000..d5554c5e65 --- /dev/null +++ b/test/Parser/missing-selector-name.mm @@ -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; +}