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 857040f..5872e1d 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -375,9 +375,9 @@
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 @@
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 0000000..d5554c5
--- /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;
+}