Fix handling of newlines in clang-query
authorStephen Kelly <steveire@gmail.com>
Sun, 29 Dec 2019 14:38:33 +0000 (14:38 +0000)
committerStephen Kelly <steveire@gmail.com>
Sun, 29 Dec 2019 14:58:56 +0000 (14:58 +0000)
Replace assert with diagnostic for missing newline.

clang-tools-extra/unittests/clang-query/QueryParserTest.cpp
clang/lib/ASTMatchers/Dynamic/Parser.cpp

index 4725789..79fcfca 100644 (file)
@@ -330,4 +330,22 @@ match callExpr
   EXPECT_EQ("1:9: Error parsing matcher. Found token <NewLine> "
             "while looking for '('.",
             cast<InvalidQuery>(Q)->ErrStr);
+
+  Q = parse("let someMatcher\nm parmVarDecl()");
+
+  ASSERT_TRUE(isa<InvalidQuery>(Q));
+  EXPECT_EQ("1:1: Invalid token <NewLine> found when looking for a value.", cast<InvalidQuery>(Q)->ErrStr);
+
+  Q = parse("\nm parmVarDecl()\nlet someMatcher\nm parmVarDecl()");
+
+  ASSERT_TRUE(isa<MatchQuery>(Q));
+  Q = parse(Q->RemainingContent);
+
+  ASSERT_TRUE(isa<InvalidQuery>(Q));
+  EXPECT_EQ("1:1: Invalid token <NewLine> found when looking for a value.", cast<InvalidQuery>(Q)->ErrStr);
+
+  Q = parse("\nlet someMatcher\n");
+
+  ASSERT_TRUE(isa<InvalidQuery>(Q));
+  EXPECT_EQ("1:1: Invalid token <NewLine> found when looking for a value.", cast<InvalidQuery>(Q)->ErrStr);
 }
index caa3a3b..ef209d1 100644 (file)
@@ -607,15 +607,13 @@ bool Parser::parseExpressionImpl(VariantValue *Value) {
     // This error was already reported by the tokenizer.
     return false;
   case TokenInfo::TK_NewLine:
-    llvm_unreachable("Newline should never be found here");
-    return false;
   case TokenInfo::TK_OpenParen:
   case TokenInfo::TK_CloseParen:
   case TokenInfo::TK_Comma:
   case TokenInfo::TK_Period:
   case TokenInfo::TK_InvalidChar:
     const TokenInfo Token = Tokenizer->consumeNextToken();
-    Error->addError(Token.Range, Error->ET_ParserInvalidToken) << Token.Text;
+    Error->addError(Token.Range, Error->ET_ParserInvalidToken) << (Token.Kind == TokenInfo::TK_NewLine ? "NewLine" : Token.Text);
     return false;
   }