aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/Lex/LexerTest.cpp
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2022-01-28 16:18:24 +0100
committerKadir Cetinkaya <kadircet@google.com>2022-01-31 16:15:16 +0100
commitff77071a4d672fab7c8b30bea8525b89be8596fc (patch)
tree53d79281604ef1c1cd8e3e371b4045e5d74c5950 /clang/unittests/Lex/LexerTest.cpp
parent8faad296347a2c6d0567f28b307bfc40acc26e07 (diff)
downloadllvm-ff77071a4d672fab7c8b30bea8525b89be8596fc.zip
llvm-ff77071a4d672fab7c8b30bea8525b89be8596fc.tar.gz
llvm-ff77071a4d672fab7c8b30bea8525b89be8596fc.tar.bz2
[clang][Lexer] Make raw and normal lexer behave the same for line comments
Normally there are heruistics in lexer to treat `//*` specially in language modes that don't have line comments (to emit `/`). Unfortunately this only applied to the first occurence of a line comment inside the file, as the subsequent line comments were treated as if language had support for them. This unfortunately only holds in normal lexing mode, as in raw mode all occurences of line comments received this treatment, which created discrepancies when comparing expanded and spelled tokens. The proper fix would be to just make sure we treat all the line comments with a subsequent `*` the same way, but it would imply breaking some code that's accepted by clang today. So instead we introduce the same bug into raw lexing mode. Fixes https://github.com/clangd/clangd/issues/1003. Differential Revision: https://reviews.llvm.org/D118471
Diffstat (limited to 'clang/unittests/Lex/LexerTest.cpp')
-rw-r--r--clang/unittests/Lex/LexerTest.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/unittests/Lex/LexerTest.cpp b/clang/unittests/Lex/LexerTest.cpp
index 319c63f..df22e77 100644
--- 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 <memory>
@@ -632,4 +634,27 @@ TEST_F(LexerTest, CreatedFIDCountForPredefinedBuffer) {
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