This revision was automatically updated to reflect the committed changes. hokein marked an inline comment as done. Closed by commit rG6a78c55e3af0: [clangd] Fix a crash for accessing a null field decl returned by… (authored by hokein).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D78181/new/ https://reviews.llvm.org/D78181 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -1273,7 +1273,20 @@ "5: targets = {Bar}\n" "6: targets = {bar}, decl\n" "7: targets = {foo()::Bar::Foo}\n" - "8: targets = {foo()::Baz::Field}\n"}}; + "8: targets = {foo()::Baz::Field}\n"}, + {R"cpp( + template<typename T> + void crash(T); + template<typename T> + void foo() { + $0^crash({.$1^x = $2^T()}); + } + )cpp", + "0: targets = {crash}\n" + "1: targets = {}\n" + "2: targets = {T}\n" + }, + }; for (const auto &C : Cases) { llvm::StringRef ExpectedCode = C.first; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -714,10 +714,12 @@ for (const DesignatedInitExpr::Designator &D : DIE->designators()) { if (!D.isFieldDesignator()) continue; - Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), - D.getFieldLoc(), - /*IsDecl=*/false, - {D.getField()}}); + + llvm::SmallVector<const NamedDecl *, 1> Targets; + if (D.getField()) + Targets.push_back(D.getField()); + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), D.getFieldLoc(), + /*IsDecl=*/false, std::move(Targets)}); } } };
Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -1273,7 +1273,20 @@ "5: targets = {Bar}\n" "6: targets = {bar}, decl\n" "7: targets = {foo()::Bar::Foo}\n" - "8: targets = {foo()::Baz::Field}\n"}}; + "8: targets = {foo()::Baz::Field}\n"}, + {R"cpp( + template<typename T> + void crash(T); + template<typename T> + void foo() { + $0^crash({.$1^x = $2^T()}); + } + )cpp", + "0: targets = {crash}\n" + "1: targets = {}\n" + "2: targets = {T}\n" + }, + }; for (const auto &C : Cases) { llvm::StringRef ExpectedCode = C.first; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -714,10 +714,12 @@ for (const DesignatedInitExpr::Designator &D : DIE->designators()) { if (!D.isFieldDesignator()) continue; - Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), - D.getFieldLoc(), - /*IsDecl=*/false, - {D.getField()}}); + + llvm::SmallVector<const NamedDecl *, 1> Targets; + if (D.getField()) + Targets.push_back(D.getField()); + Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), D.getFieldLoc(), + /*IsDecl=*/false, std::move(Targets)}); } } };
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits