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

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 19 05:03:16 PDT 2022


aaron.ballman added inline comments.


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:620
+  case UO_Deref:  // *x
+  case UO_Not:    // ~x
+  case UO_Real:   // __real x
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > This is reachable and will always return true thanks to the magic of integer promotions:
> > ```
> > void func() {
> >   bool b = true;
> >   b = ~b;
> > }
> > ```
> This code path is not just for boolean values though.
All the more reason to be worried about `~` being marked as unreachable (I mostly worry because people often try to make bit fiddling operations constant expressions when possible, so this seems pretty likely to be hit). Perhaps make it into an `assert(false && "operation not supported yet");` or something more loud?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:129-130
+    return this->emitCast(*FromT, *ToT, CE);
+  }
+    return false;
+
----------------



================
Comment at: clang/lib/AST/Interp/Integral.h:173
+  }
+
   template <bool SrcSign> static Integral from(Integral<0, SrcSign> Value) {
----------------
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?


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

https://reviews.llvm.org/D132098



More information about the cfe-commits mailing list