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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits