diff --git a/llvm/include/llvm/MC/MCParser/MCAsmLexer.h b/llvm/include/llvm/MC/MCParser/MCAsmLexer.h --- a/llvm/include/llvm/MC/MCParser/MCAsmLexer.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmLexer.h @@ -57,6 +57,7 @@ bool UseMasmDefaultRadix = false; unsigned DefaultRadix = 10; bool LexHLASMIntegers = false; + bool LexHLASMStrings = false; AsmCommentConsumer *CommentConsumer = nullptr; MCAsmLexer(); @@ -180,6 +181,11 @@ /// Set whether to lex HLASM-flavour integers. For now this is only [0-9]* void setLexHLASMIntegers(bool V) { LexHLASMIntegers = V; } + + /// Set whether to "lex" HLASM-flavour character and string literals. For now, + /// setting this option to true, will disable lexing for character and string + /// literals. + void setLexHLASMStrings(bool V) { LexHLASMStrings = V; } }; } // end namespace llvm diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -567,6 +567,9 @@ AsmToken AsmLexer::LexSingleQuote() { int CurChar = getNextChar(); + if (LexHLASMStrings) + return ReturnError(TokStart, "invalid usage of character literals"); + if (LexMasmStrings) { while (CurChar != EOF) { if (CurChar != '\'') { @@ -621,6 +624,9 @@ /// LexQuote: String: "..." AsmToken AsmLexer::LexQuote() { int CurChar = getNextChar(); + if (LexHLASMStrings) + return ReturnError(TokStart, "invalid usage of string literals"); + if (LexMasmStrings) { while (CurChar != EOF) { if (CurChar != '"') { diff --git a/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp b/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp --- a/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp +++ b/llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp @@ -700,4 +700,36 @@ EXPECT_EQ(ParsePrimaryExpr, true); EXPECT_EQ(Parser->hasPendingError(), true); } + +TEST_F(SystemZAsmLexerTest, CheckRejectCharLiterals) { + StringRef AsmStr = "abc 'd'"; + + // Setup. + setupCallToAsmParser(AsmStr); + Parser->getLexer().setLexHLASMStrings(true); + + // Lex initially to get the string. + Parser->getLexer().Lex(); + + SmallVector ExpectedTokens( + {AsmToken::Identifier, AsmToken::Error, AsmToken::Error, + AsmToken::EndOfStatement, AsmToken::Eof}); + lexAndCheckTokens(AsmStr, ExpectedTokens); +} + +TEST_F(SystemZAsmLexerTest, CheckRejectStringLiterals) { + StringRef AsmStr = "abc \"ef\""; + + // Setup. + setupCallToAsmParser(AsmStr); + Parser->getLexer().setLexHLASMStrings(true); + + // Lex initially to get the string. + Parser->getLexer().Lex(); + + SmallVector ExpectedTokens( + {AsmToken::Identifier, AsmToken::Error, AsmToken::Identifier, + AsmToken::Error, AsmToken::EndOfStatement, AsmToken::Eof}); + lexAndCheckTokens(AsmStr, ExpectedTokens); +} } // end anonymous namespace