diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -137,6 +137,8 @@ if (!Fields) return; for (const Expr *Init : Sem->inits()) { + if (!Init) + continue; auto Next = llvm::make_scope_exit([&, Size(Prefix.size())] { Fields.next(); // Always advance to the next subobject name. Prefix.resize(Size); // Erase any designator we appended. diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -1417,6 +1417,19 @@ )cpp" /*no designator hints expected (but param hints!)*/); } +TEST(DesignatorHints, NoCrash) { + assertDesignatorHints(R"cpp( + /*error-ok*/ + class A {}; + struct Foo { int b; }; + Foo foo() { + return { + .b = A(), + }; + } + )cpp" /*no crash*/); +} + TEST(InlayHints, RestrictRange) { Annotations Code(R"cpp( auto a = false;