qdelacru updated this revision to Diff 343141.
qdelacru added a comment.
Added suggested new test case
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.
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.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits