aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorHaojian Wu <hokein.wu@gmail.com>2022-08-11 19:26:14 +0200
committerHaojian Wu <hokein.wu@gmail.com>2022-08-12 14:37:46 +0200
commit06b97b4985ad0415f6cde4baad2bc7d73b456244 (patch)
tree5c70b4473a6b27900f901cd7ec64c23f72b44b22 /clang-tools-extra
parent48e1250a91d244741c8677fed248ace1fcd7c41c (diff)
downloadllvm-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.cpp6
-rw-r--r--clang-tools-extra/clangd/unittests/InlayHintTests.cpp11
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;