[clang] ff6e444 - [clang-format][tests] Fix MacroExpander lexer not parsing C++ keywords
Alex Richardson via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 7 09:18:18 PDT 2020
Author: Alex Richardson
Date: 2020-10-07T17:17:41+01:00
New Revision: ff6e4441b93953efb2c52995e79e211a49ffac06
URL: https://github.com/llvm/llvm-project/commit/ff6e4441b93953efb2c52995e79e211a49ffac06
DIFF: https://github.com/llvm/llvm-project/commit/ff6e4441b93953efb2c52995e79e211a49ffac06.diff
LOG: [clang-format][tests] Fix MacroExpander lexer not parsing C++ keywords
While debugging a different clang-format failure, I tried to reuse the
MacroExpander lexer, but was surprised to see that it marks all C++
keywords (e.g. const, decltype) as being of type identifier. After stepping
through the ::format() code, I noticed that the difference between these
two is that the identifier table was not being initialized based on the
FormatStyle, so only basic tokens such as tok::semi, tok::plus, etc. were
being handled.
Reviewed By: klimek
Differential Revision: https://reviews.llvm.org/D88952
Added:
Modified:
clang/unittests/Format/MacroExpanderTest.cpp
clang/unittests/Format/TestLexer.h
Removed:
################################################################################
diff --git a/clang/unittests/Format/MacroExpanderTest.cpp b/clang/unittests/Format/MacroExpanderTest.cpp
index 59c67f29bedde..20e1dba0d49a0 100644
--- a/clang/unittests/Format/MacroExpanderTest.cpp
+++ b/clang/unittests/Format/MacroExpanderTest.cpp
@@ -182,6 +182,22 @@ TEST_F(MacroExpanderTest, SingleExpansion) {
EXPECT_ATTRIBUTES(Result, Attributes);
}
+TEST_F(MacroExpanderTest, UnderstandsCppTokens) {
+ auto Macros = create({"A(T,name)=T name = 0;"});
+ auto *A = Lex.id("A");
+ auto Args = lexArgs({"const int", "x"});
+ auto Result = uneof(Macros->expand(A, Args));
+ std::vector<MacroAttributes> Attributes = {
+ {tok::kw_const, MR_ExpandedArg, 1, 0, {A}},
+ {tok::kw_int, MR_ExpandedArg, 0, 0, {A}},
+ {tok::identifier, MR_ExpandedArg, 0, 0, {A}},
+ {tok::equal, MR_Hidden, 0, 0, {A}},
+ {tok::numeric_constant, MR_Hidden, 0, 0, {A}},
+ {tok::semi, MR_Hidden, 0, 1, {A}},
+ };
+ EXPECT_ATTRIBUTES(Result, Attributes);
+}
+
} // namespace
} // namespace format
} // namespace clang
diff --git a/clang/unittests/Format/TestLexer.h b/clang/unittests/Format/TestLexer.h
index 8c5eb2b029fb3..2b56f10dd3793 100644
--- a/clang/unittests/Format/TestLexer.h
+++ b/clang/unittests/Format/TestLexer.h
@@ -55,7 +55,9 @@ inline std::string text(llvm::ArrayRef<FormatToken *> Tokens) {
class TestLexer {
public:
- TestLexer() : SourceMgr("test.cpp", "") {}
+ TestLexer(FormatStyle Style = getLLVMStyle())
+ : Style(Style), SourceMgr("test.cpp", ""),
+ IdentTable(getFormattingLangOpts(Style)) {}
TokenList lex(llvm::StringRef Code) {
Buffers.push_back(
@@ -74,7 +76,7 @@ class TestLexer {
return Result[0];
}
- FormatStyle Style = getLLVMStyle();
+ FormatStyle Style;
encoding::Encoding Encoding = encoding::Encoding_UTF8;
std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
clang::SourceManagerForFile SourceMgr;
More information about the cfe-commits
mailing list