AaronBallman wrote:

> > @tbaederr -- this triggers an assertion with the new constexpr interpreter 
> > in `clang/test/AST/Interp/intap.cpp` but I'm not certain I understand why. 
> > Can you help me figure out how to fix that?
> > https://buildkite.com/llvm-project/github-pull-requests/builds/56785#018ef1ee-1e9c-48be-8944-0bce2c6f441d/6-1940
> 
> In `IntegralAP::truncate()` (which we call when getting the `3` and setting 
> it as the value of the bitfield), we actually truncate the bitwith of the 
> underlying `IntAP`, not just the _value_.
> 
> This fixes things for me:
> 
> ```diff
> diff --git a/clang/lib/AST/Interp/IntegralAP.h 
> b/clang/lib/AST/Interp/IntegralAP.h
> index bab9774288bf..fb7ee1451571 100644
> --- a/clang/lib/AST/Interp/IntegralAP.h
> +++ b/clang/lib/AST/Interp/IntegralAP.h
> @@ -154,7 +154,10 @@ public:
>    }
> 
>    IntegralAP truncate(unsigned BitWidth) const {
> -    return IntegralAP(V.trunc(BitWidth));
> +    if constexpr (Signed)
> +      return IntegralAP(V.trunc(BitWidth).sextOrTrunc(this->bitWidth()));
> +    else
> +      return IntegralAP(V.trunc(BitWidth).zextOrTrunc(this->bitWidth()));
>    }
> 
>    IntegralAP<false> toUnsigned() const {
> ```
> 
> I'd push this (it doesn't break any existing tests), but I'm not 100% sure if 
> this is the right way to do that. Also, I should follow up with a `truncate` 
> -> `truncateValue` rename.

Thank you for the help, that does pass all the tests, so I've added a commit 
for it.

https://github.com/llvm/llvm-project/pull/89254
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to