summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-04-07 22:56:58 +0000
committerSteve Naroff <snaroff@apple.com>2009-04-07 22:56:58 +0000
commit65a0089eb786cb8c3da95bb5dda3cf9fe033f97c (patch)
tree302f027875ac1713abf04221a4bcf763780bb185
parentea10ab668f8b6cdaa17723b37af32f1a7cb36e46 (diff)
downloadbcm5719-llvm-65a0089eb786cb8c3da95bb5dda3cf9fe033f97c.tar.gz
bcm5719-llvm-65a0089eb786cb8c3da95bb5dda3cf9fe033f97c.zip
Fix <rdar://problem/6764172> [sema] crash on invalid.
llvm-svn: 68568
-rw-r--r--clang/lib/Parse/ParseObjc.cpp8
-rw-r--r--clang/test/SemaObjC/exception-go-boom.m9
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp
index 05c919cbea9..8a942c77027 100644
--- a/clang/lib/Parse/ParseObjc.cpp
+++ b/clang/lib/Parse/ParseObjc.cpp
@@ -1294,8 +1294,14 @@ Parser::OwningStmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
FirstPart = Actions.ActOnParamDeclarator(CurScope, ParmDecl);
} else
ConsumeToken(); // consume '...'
- SourceLocation RParenLoc = ConsumeParen();
+
+ SourceLocation RParenLoc;
+ if (Tok.is(tok::r_paren))
+ RParenLoc = ConsumeParen();
+ else // Skip over garbage, until we get to ')'. Eat the ')'.
+ SkipUntil(tok::r_paren, true, false);
+
OwningStmtResult CatchBody(Actions, true);
if (Tok.is(tok::l_brace))
CatchBody = ParseCompoundStatementBody();
diff --git a/clang/test/SemaObjC/exception-go-boom.m b/clang/test/SemaObjC/exception-go-boom.m
new file mode 100644
index 00000000000..32dc82dba03
--- /dev/null
+++ b/clang/test/SemaObjC/exception-go-boom.m
@@ -0,0 +1,9 @@
+// RUN: clang-cc %s -verify -fsyntax-only
+
+// Note: NSException is not declared.
+void f0(id x) {
+ @try {
+ } @catch (NSException *x) { // expected-warning{{type specifier missing, defaults to 'int'}} expected-error{{@catch parameter is not an Objective-C class type}}
+ }
+}
+
OpenPOWER on IntegriCloud