Author: Younan Zhang Date: 2023-03-27T10:27:11+08:00 New Revision: 0b103edf5b2c6178c2725a9ff085c6ccc866bccb
URL: https://github.com/llvm/llvm-project/commit/0b103edf5b2c6178c2725a9ff085c6ccc866bccb DIFF: https://github.com/llvm/llvm-project/commit/0b103edf5b2c6178c2725a9ff085c6ccc866bccb.diff LOG: [clangd] Fix a hover crash on unsigned 64bit value This patch adapts to D140059, which makes an assumption that the caller of `APSInt::getExtValue` promises no narrowing conversion happens, i.e., from unsigned int64 to signed int64. It also fixes clangd/clangd#1557. Reviewed By: nridge Differential Revision: https://reviews.llvm.org/D146874 Added: Modified: clang-tools-extra/clangd/Hover.cpp clang-tools-extra/clangd/unittests/HoverTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index e240c22259f35..27663991a7f3c 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -400,9 +400,9 @@ void fillFunctionTypeAndParams(HoverInfo &HI, const Decl *D, // 100 => 0x64 // Negative numbers are sign-extended to 32/64 bits // -2 => 0xfffffffe -// -2^32 => 0xfffffffeffffffff +// -2^32 => 0xffffffff00000000 static llvm::FormattedNumber printHex(const llvm::APSInt &V) { - uint64_t Bits = V.getExtValue(); + uint64_t Bits = V.getZExtValue(); if (V.isNegative() && V.getSignificantBits() <= 32) return llvm::format_hex(uint32_t(Bits), 0); return llvm::format_hex(Bits, 0); diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 728f5444014dc..df46e2fa09951 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -3045,6 +3045,15 @@ TEST(Hover, NoCrash) { getHover(AST, P, format::getLLVMStyle(), nullptr); } +TEST(Hover, NoCrashAPInt64) { + Annotations T(R"cpp( + constexpr unsigned long value = -1; // wrap around + void foo() { va^lue; } + )cpp"); + auto AST = TestTU::withCode(T.code()).build(); + getHover(AST, T.point(), format::getLLVMStyle(), nullptr); +} + TEST(Hover, DocsFromMostSpecial) { Annotations T(R"cpp( // doc1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits