[PATCH] D126498: [clangd] Fix hover crashing on integral or enumeral casts
Georg Kotheimer via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 31 13:47:20 PDT 2022
gkll updated this revision to Diff 433174.
gkll added a comment.
Changed return type of non-returning function in test code to void.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D126498/new/
https://reviews.llvm.org/D126498
Files:
clang-tools-extra/clangd/Hover.cpp
clang-tools-extra/clangd/unittests/HoverTests.cpp
Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -3206,6 +3206,33 @@
ASSERT_TRUE(H);
EXPECT_EQ(H->Definition, "int arr[]");
}
+
+TEST(Hover, GlobalVarEnumeralCastNoCrash) {
+ Annotations T(R"cpp(
+ enum Test : unsigned long {};
+ unsigned global_var;
+ void foo() { Test v^al = (Test)(unsigned long)&global_var; }
+ )cpp");
+
+ TestTU TU = TestTU::withCode(T.code());
+ auto AST = TU.build();
+ auto HI = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+ ASSERT_TRUE(HI);
+ EXPECT_EQ(*HI->Value, "&global_var");
+}
+
+TEST(Hover, GlobalVarIntCastNoCrash) {
+ Annotations T(R"cpp(
+ unsigned global_var;
+ void foo() { unsigned long a^ddress = (unsigned long)&global_var; }
+ )cpp");
+
+ TestTU TU = TestTU::withCode(T.code());
+ auto AST = TU.build();
+ auto HI = getHover(AST, T.point(), format::getLLVMStyle(), nullptr);
+ ASSERT_TRUE(HI);
+ EXPECT_EQ(*HI->Value, "&global_var");
+}
} // namespace
} // namespace clangd
} // namespace clang
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -429,7 +429,8 @@
return llvm::None;
// Show enums symbolically, not numerically like APValue::printPretty().
- if (T->isEnumeralType() && Constant.Val.getInt().getMinSignedBits() <= 64) {
+ if (T->isEnumeralType() && Constant.Val.isInt() &&
+ Constant.Val.getInt().getMinSignedBits() <= 64) {
// Compare to int64_t to avoid bit-width match requirements.
int64_t Val = Constant.Val.getInt().getExtValue();
for (const EnumConstantDecl *ECD :
@@ -440,7 +441,7 @@
.str();
}
// Show hex value of integers if they're at least 10 (or negative!)
- if (T->isIntegralOrEnumerationType() &&
+ if (T->isIntegralOrEnumerationType() && Constant.Val.isInt() &&
Constant.Val.getInt().getMinSignedBits() <= 64 &&
Constant.Val.getInt().uge(10))
return llvm::formatv("{0} ({1})", Constant.Val.getAsString(Ctx, T),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D126498.433174.patch
Type: text/x-patch
Size: 2238 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220531/c7ed3a44/attachment.bin>
More information about the cfe-commits
mailing list