[clangd] Fix an inlay-hint crash on a broken designator.

Differential Revision: https://reviews.llvm.org/D131696
This commit is contained in:
Haojian Wu
2022-08-11 19:26:14 +02:00
parent 48e1250a91
commit 06b97b4985
2 changed files with 15 additions and 2 deletions

View File

@@ -141,8 +141,10 @@ void collectDesignators(const InitListExpr *Sem,
Fields.next(); // Always advance to the next subobject name.
Prefix.resize(Size); // Erase any designator we appended.
});
if (llvm::isa<ImplicitValueInitExpr>(Init))
continue; // a "hole" for a subobject that was not explicitly initialized
// Skip for a broken initializer or if it is a "hole" in a subobject that
// was not explicitly initialized.
if (!Init || llvm::isa<ImplicitValueInitExpr>(Init))
continue;
const auto *BraceElidedSubobject = llvm::dyn_cast<InitListExpr>(Init);
if (BraceElidedSubobject &&

View File

@@ -1417,6 +1417,17 @@ TEST(DesignatorHints, OnlyAggregateInit) {
)cpp" /*no designator hints expected (but param hints!)*/);
}
TEST(DesignatorHints, NoCrash) {
assertDesignatorHints(R"cpp(
/*error-ok*/
struct A {};
struct Foo {int a; int b;};
void test() {
Foo f{A(), $b[[1]]};
}
)cpp", ExpectedHint{".b=", "b"});
}
TEST(InlayHints, RestrictRange) {
Annotations Code(R"cpp(
auto a = false;