diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -688,6 +688,29 @@ Not(WithFix(_))))); } +TEST(DiagnosticsTest, Issue890) { + Annotations Header(R"cpp( +template struct S; + +template struct S { + template requires(false) S(U); + template requires(true) S(U); +}; + +template S(T) -> S<>; + )cpp"); + Annotations Main(R"cpp( + #include "a.h" + void foo() { + S(0); // Simply ::x; is enough to crash! + } + )cpp"); + TestTU TU = TestTU::withCode(Main.code()); + TU.ExtraArgs.push_back("-std=c++20"); + TU.AdditionalFiles = {{"a.h", std::string(Header.code())}}; + EXPECT_THAT(*TU.build().getDiagnostics(), IsEmpty()); +} + TEST(ClangdTest, MSAsm) { // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link. // We used to crash here. Now clang emits a diagnostic, which we filter out. diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -3740,6 +3740,9 @@ NamedDecl *FromParam = FromTP->getParam(I); NamedDecl *ToParam = ToTP->getParam(I); + if (FromParam == ToParam) + continue; + if (auto *FTTP = dyn_cast(FromParam)) inheritDefaultTemplateArgument(Context, FTTP, ToParam); else if (auto *FNTTP = dyn_cast(FromParam))