[lldb-dev] Signedness of scalars built from APInt(s)

Davide Italiano via lldb-dev lldb-dev at lists.llvm.org
Fri Jan 4 13:59:47 PST 2019


On Fri, Jan 4, 2019 at 1:57 PM Davide Italiano <dccitaliano at gmail.com> wrote:
>
> While adding support for 512-bit integers in `Scalar`, I figured I
> could add some coverage.
>
> TEST(ScalarTest, Signedness) {
>  auto s1 = Scalar(APInt(32, 12, false /* isSigned */));
>  auto s2 = Scalar(APInt(32, 12, true /* isSigned */ ));
>  ASSERT_EQ(s1.GetType(), Scalar::e_uint); // fails
>  ASSERT_EQ(s2.GetType(), Scalar::e_sint); // pass
> }
>
> The result of `s1.GetType()` is Scalar::e_sint.
> This is because an APInt can't distinguish between "int patatino = 12"
> and "uint patatino = 12".
> The correct class in `llvm` to do that is `APSInt`.
>

Please note that this is also broken in the case where you have
APInt(32 /* bitWidth */, -323);
because of the way the constructor is implemented.

--
Davide


More information about the lldb-dev mailing list