[PATCH] D132098: [clang][Interp] Implement inv and neg unary operations

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 19 05:47:02 PDT 2022


erichkeane added inline comments.


================
Comment at: clang/lib/AST/Interp/Integral.h:173
+  }
+
   template <bool SrcSign> static Integral from(Integral<0, SrcSign> Value) {
----------------
aaron.ballman wrote:
> tbaeder wrote:
> > aaron.ballman wrote:
> > > tbaeder wrote:
> > > > I'm a bit out of my element with the template magic here.
> > > It mostly looks correct to me, but the part I'm struggling with is `static_cast<Integral::T>`; can you explain what you're trying to do there?
> > I was trying to implement creating an Integral from a Boolean; the `static_cast` casts to `Integral::T` (which in my case is `int`). It might not be needed.
> Oh!!! I see now why there's so much confusion. You have `template <typename T>` and I was wondering why you were trying to use that here. I see now that there's `Integral::T` as a private member.
> 
> Can we please rename `Integral::T` to be something mildly descriptive? (I'm fine if that's done in a follow-up as an NFC change.)
As Aaron said separately, the 'T' name of the integral member is bonkers and confusing!

So it appears the intent here is to take a non-integral 'Value', cast it to the underlying representation, and then call the version of this on 159.  

>From a 'style' perspective, I'd prefer this live right next to that version (since it is the inverse SFINAE).  In fact, I'd probably prefer you switch this to an 'if constexpr' instead:


``` 
    template <typename ValTy>
    static Integral from (ValTy Value) {
        if constexpr (std::is_integral_v<T>) {
           return Integral(Value);
        } else {
           return Integral(static_cast<Integral::RepTy>(Value));
        }
     }
```
    }
```



CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132098/new/

https://reviews.llvm.org/D132098



More information about the cfe-commits mailing list