mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 13:35:38 +08:00
[clangd] Fix an inlay-hint crash on a broken designator.
Differential Revision: https://reviews.llvm.org/D131696
This commit is contained in:
@@ -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 &&
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user