[PATCH] D101870: [clangd] Check if macro is already in the IdentifierTable before loading it
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 5 23:32:36 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rG16c7829784f0: [clangd] Check if macro is already in the IdentifierTable before loading it (authored by qdelacru, committed by kadircet).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101870/new/
https://reviews.llvm.org/D101870
Files:
clang-tools-extra/clangd/CodeComplete.cpp
clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
Index: clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -3139,6 +3139,15 @@
Kind(CompletionItemKind::Constructor))));
}
+TEST(CompletionTest, NoCrashDueToMacroOrdering) {
+ EXPECT_THAT(completions(R"cpp(
+ #define ECHO(X) X
+ #define ECHO2(X) ECHO(X)
+ int finish_preamble = EC^HO(2);)cpp")
+ .Completions,
+ UnorderedElementsAre(Labeled("ECHO(X)"), Labeled("ECHO2(X)")));
+}
+
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/CodeComplete.cpp
===================================================================
--- clang-tools-extra/clangd/CodeComplete.cpp
+++ clang-tools-extra/clangd/CodeComplete.cpp
@@ -1105,14 +1105,19 @@
ExternalPreprocessorSource *PreambleMacros = PP.getExternalSource();
// As we have the names of the macros, we can look up their IdentifierInfo
// and then use this to load just the macros we want.
+ const auto &ITable = PP.getIdentifierTable();
IdentifierInfoLookup *PreambleIdentifiers =
- PP.getIdentifierTable().getExternalIdentifierLookup();
+ ITable.getExternalIdentifierLookup();
+
if (!PreambleIdentifiers || !PreambleMacros)
return;
- for (const auto &MacroName : Preamble.Macros.Names)
+ for (const auto &MacroName : Preamble.Macros.Names) {
+ if (ITable.find(MacroName.getKey()) != ITable.end())
+ continue;
if (auto *II = PreambleIdentifiers->get(MacroName.getKey()))
if (II->isOutOfDate())
PreambleMacros->updateOutOfDateIdentifier(*II);
+ }
}
// Invokes Sema code completion on a file.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101870.343294.patch
Type: text/x-patch
Size: 1805 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210506/870ecb98/attachment.bin>
More information about the cfe-commits
mailing list