Fix parsing of return statements.
authorManuel Klimek <klimek@google.com>
Mon, 21 Jan 2013 10:07:49 +0000 (10:07 +0000)
committerManuel Klimek <klimek@google.com>
Mon, 21 Jan 2013 10:07:49 +0000 (10:07 +0000)
Previously, we would not detect brace initializer lists in return
statements, thus:
 return (a)(b) { 1, 2, 3 };
would put the semicolon onto the next line.

llvm-svn: 173017

clang/lib/Format/UnwrappedLineParser.cpp
clang/lib/Format/UnwrappedLineParser.h
clang/unittests/Format/FormatTest.cpp

index 393416d..3fd1ff9 100644 (file)
@@ -308,6 +308,9 @@ void UnwrappedLineParser::parseStructuralElement() {
   case tok::kw_case:
     parseCaseLabel();
     return;
+  case tok::kw_return:
+    parseReturn();
+    return;
   default:
     break;
   }
@@ -380,6 +383,32 @@ void UnwrappedLineParser::parseBracedList() {
   } while (!eof());
 }
 
+void UnwrappedLineParser::parseReturn() {
+  nextToken();
+
+  do {
+    switch (FormatTok.Tok.getKind()) {
+    case tok::l_brace:
+      parseBracedList();
+      break;
+    case tok::l_paren:
+      parseParens();
+      break;
+    case tok::r_brace:
+      // Assume missing ';'.
+      addUnwrappedLine();
+      return;
+    case tok::semi:
+      nextToken();
+      addUnwrappedLine();
+      return;
+    default:
+      nextToken();
+      break;
+    }
+  } while (!eof());
+}
+
 void UnwrappedLineParser::parseParens() {
   assert(FormatTok.Tok.is(tok::l_paren) && "'(' expected.");
   nextToken();
index 010569a..47148ef 100644 (file)
@@ -131,6 +131,7 @@ private:
   void parseComments();
   void parseStructuralElement();
   void parseBracedList();
+  void parseReturn();
   void parseParens();
   void parseIfThenElse();
   void parseForOrWhileLoop();
index c9319d5..1d3463c 100644 (file)
@@ -1474,6 +1474,10 @@ TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
       "};", getLLVMStyleWithColumns(25));
 }
 
+TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
+  verifyFormat("return (a)(b) { 1, 2, 3 };");
+}
+
 TEST_F(FormatTest, LayoutTokensFollowingBlockInParentheses) {
   verifyFormat(
       "Aaa({\n"