From: Serge Pavlov Date: Wed, 4 Dec 2013 03:51:59 +0000 (+0000) Subject: Fix error recovery in return statement. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5af430ac5b89cb1e6e422ee23a1399bc5d68c9e;p=clang Fix error recovery in return statement. This patch fixes PR16989. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196352 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 35c71889c1..8026f78e80 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1730,8 +1730,8 @@ StmtResult Parser::ParseReturnStatement() { << R.get()->getSourceRange(); } else R = ParseExpression(); - if (R.isInvalid()) { // Skip to the semicolon, but don't consume it. - SkipUntil(tok::semi, StopBeforeMatch); + if (R.isInvalid()) { + SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); return StmtError(); } } diff --git a/test/SemaCXX/crashes.cpp b/test/SemaCXX/crashes.cpp index 0b15bb0386..1570d12eeb 100644 --- a/test/SemaCXX/crashes.cpp +++ b/test/SemaCXX/crashes.cpp @@ -218,3 +218,16 @@ namespace pr12791 { template class basic_stringbuf; } +namespace pr16989 { + class C { + template + C tpl_mem(T *) { return } // expected-error{{expected expression}} + void mem(int *p) { + tpl_mem(p); + } + }; + class C2 { + void f(); + }; + void C2::f() {} +}