diff options
author | Haojian Wu <hokein.wu@gmail.com> | 2022-08-11 19:26:14 +0200 |
---|---|---|
committer | Haojian Wu <hokein.wu@gmail.com> | 2022-08-12 14:37:46 +0200 |
commit | 06b97b4985ad0415f6cde4baad2bc7d73b456244 (patch) | |
tree | 5c70b4473a6b27900f901cd7ec64c23f72b44b22 /clang-tools-extra | |
parent | 48e1250a91d244741c8677fed248ace1fcd7c41c (diff) | |
download | llvm-06b97b4985ad0415f6cde4baad2bc7d73b456244.zip llvm-06b97b4985ad0415f6cde4baad2bc7d73b456244.tar.gz llvm-06b97b4985ad0415f6cde4baad2bc7d73b456244.tar.bz2 |
[clangd] Fix an inlay-hint crash on a broken designator.
Differential Revision: https://reviews.llvm.org/D131696
Diffstat (limited to 'clang-tools-extra')
-rw-r--r-- | clang-tools-extra/clangd/InlayHints.cpp | 6 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/InlayHintTests.cpp | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index 8983f6b..bff07dd 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -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 && diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index 87bb0cf..a429c08 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -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; |