]> granicus.if.org Git - clang/commitdiff
Fix error recovery in return statement.
authorSerge Pavlov <sepavloff@gmail.com>
Wed, 4 Dec 2013 03:51:59 +0000 (03:51 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Wed, 4 Dec 2013 03:51:59 +0000 (03:51 +0000)
This patch fixes PR16989.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196352 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseStmt.cpp
test/SemaCXX/crashes.cpp

index 35c71889c1c4836c5dfcf35c21698532b351fd62..8026f78e80d3881d882d829c5fa377091d0bbade 100644 (file)
@@ -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();
     }
   }
index 0b15bb0386c218dbe56abb591d7dc39d6e2932c8..1570d12eeb2fb53c0624ee9ee666f4a194380f7a 100644 (file)
@@ -218,3 +218,16 @@ namespace pr12791 {
   template class basic_stringbuf<char>;
 }
 
+namespace pr16989 {
+  class C {
+    template <class T>
+    C tpl_mem(T *) { return }    // expected-error{{expected expression}}
+    void mem(int *p) {
+      tpl_mem(p);
+    }
+  };
+  class C2 {
+    void f();
+  };
+  void C2::f() {}
+}