[PATCH] D120315: [clang-format] fix preprocessor nesting afterhttps://github.com/llvm/llvm-project/commit/529aa4b011c4ae808d658022ef643c44dd9b2c9c
Krasimir Georgiev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 22 03:22:26 PST 2022
krasimir created this revision.
krasimir requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
In https://github.com/llvm/llvm-project/commit/529aa4b011c4ae808d658022ef643c44dd9b2c9c
by setting the identifier info to nullptr, we started to subtly
interfere with the parts in the beginning of the function,
https://github.com/llvm/llvm-project/blob/529aa4b011c4ae808d658022ef643c44dd9b2c9c/clang/lib/Format/UnwrappedLineParser.cpp#L991
causing the preprocessor nesting to change in some cases. E.g., for the
added regression test, clang-format started incorrectly guessing the
language as C++.
This tries to address this by introducing an internal identifier info
element to use instead.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D120315
Files:
clang/lib/Format/FormatToken.h
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -22724,6 +22724,13 @@
EXPECT_EQ(
FormatStyle::LK_Cpp,
guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
+ // Only only one of the two preprocessor regions has ObjC-like code.
+ EXPECT_EQ(FormatStyle::LK_ObjC,
+ guessLanguage("foo.h", "#if A\n"
+ "#define B() C\n"
+ "#else\n"
+ "#define B() [NSString a:@\"\"]\n"
+ "#endif\n"));
}
TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -1089,9 +1089,11 @@
// In the context of a define, even keywords should be treated as normal
// identifiers. Setting the kind to identifier is not enough, because we need
// to treat additional keywords like __except as well, which are already
- // identifiers.
+ // identifiers. Setting the identifier info to null interferes with include
+ // guard processing above, and changes preprocessing nesting.
FormatTok->Tok.setKind(tok::identifier);
- FormatTok->Tok.setIdentifierInfo(nullptr);
+ FormatTok->Tok.setIdentifierInfo(
+ Keywords.kw_clang_format_internal_ident_after_define);
nextToken();
if (FormatTok->Tok.getKind() == tok::l_paren &&
!FormatTok->hasWhitespaceBefore())
Index: clang/lib/Format/FormatToken.h
===================================================================
--- clang/lib/Format/FormatToken.h
+++ clang/lib/Format/FormatToken.h
@@ -949,6 +949,10 @@
kw_slots = &IdentTable.get("slots");
kw_qslots = &IdentTable.get("Q_SLOTS");
+ // For internal clang-format use.
+ kw_clang_format_internal_ident_after_define =
+ &IdentTable.get("__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
+
// C# keywords
kw_dollar = &IdentTable.get("dollar");
kw_base = &IdentTable.get("base");
@@ -1069,6 +1073,9 @@
IdentifierInfo *kw_slots;
IdentifierInfo *kw_qslots;
+ // For internal use by clang-format.
+ IdentifierInfo *kw_clang_format_internal_ident_after_define;
+
// C# keywords
IdentifierInfo *kw_dollar;
IdentifierInfo *kw_base;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120315.410497.patch
Type: text/x-patch
Size: 2531 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220222/f36938b0/attachment-0001.bin>
More information about the cfe-commits
mailing list