diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -2378,8 +2378,9 @@ bool &TokAtPhysicalStartOfLine) { // If Line comments aren't explicitly enabled for this language, emit an // extension warning. - if (!LangOpts.LineComment && !isLexingRawMode()) { - Diag(BufferPtr, diag::ext_line_comment); + if (!LangOpts.LineComment) { + if (!isLexingRawMode()) // There's no PP in raw mode, so can't emit diags. + Diag(BufferPtr, diag::ext_line_comment); // Mark them enabled so we only emit one warning for this translation // unit. diff --git a/clang/unittests/Lex/LexerTest.cpp b/clang/unittests/Lex/LexerTest.cpp --- a/clang/unittests/Lex/LexerTest.cpp +++ b/clang/unittests/Lex/LexerTest.cpp @@ -23,6 +23,8 @@ #include "clang/Lex/ModuleLoader.h" #include "clang/Lex/Preprocessor.h" #include "clang/Lex/PreprocessorOptions.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/StringRef.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include @@ -632,4 +634,27 @@ EXPECT_EQ(SourceMgr.getNumCreatedFIDsForFileID(PP->getPredefinesFileID()), 1U); } + +TEST_F(LexerTest, RawAndNormalLexSameForLineComments) { + const llvm::StringLiteral Source = R"cpp( + // First line comment. + //* Second line comment which is ambigious. + )cpp"; + LangOpts.LineComment = false; + auto Toks = Lex(Source); + auto &SM = PP->getSourceManager(); + auto SrcBuffer = SM.getBufferData(SM.getMainFileID()); + Lexer L(SM.getLocForStartOfFile(SM.getMainFileID()), PP->getLangOpts(), + SrcBuffer.data(), SrcBuffer.data(), + SrcBuffer.data() + SrcBuffer.size()); + + auto ToksView = llvm::makeArrayRef(Toks); + clang::Token T; + while (!L.LexFromRawLexer(T)) { + ASSERT_TRUE(!ToksView.empty()); + EXPECT_EQ(T.getKind(), ToksView.front().getKind()); + ToksView = ToksView.drop_front(); + } + EXPECT_TRUE(ToksView.empty()); +} } // anonymous namespace