[PATCH] D144164: [clang][Interp] Handle PtrMemOps

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 20 10:53:09 PDT 2023


aaron.ballman added inline comments.


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:213-214
 
+  if (BO->isPtrMemOp())
+    return this->visit(RHS);
+
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > tbaeder wrote:
> > > aaron.ballman wrote:
> > > > Do we need similar changes for unary operators, pointer arithmetic operators, etc?
> > > In what case would we need similar changes for those?
> > I could use some more explanation for the changes here then; I thought this was to support overloaded binary operators. e.g.,
> > ```
> > struct S {
> >   virtual constexpr int operator+(S s) const {
> >     return 12;
> >   }
> > };
> > 
> > struct T : S {
> >   constexpr int operator+(S s) const override {
> >     return 100;
> >   }
> > };
> > 
> > constexpr T t1, t2;
> > constexpr const S &s1 = t1, &s2 = t2;
> > constexpr const S s3, s4;
> > static_assert(s1 + s2 == 100);
> > static_assert(s3 + s4 == 12);
> > ```
> For this snippet from the tests:
> ```
>   constexpr S s;
>   constexpr decltype(&S::func) foo = &S::func;
>   constexpr int value = (s.*foo)();
>   static_assert(value == 1);
> ```
> `value` is:
> 
> ```
> VarDecl 0x6210000a5180 <array.cpp:131:3, col:34> col:17 value 'const int' constexpr cinit
> `-CXXMemberCallExpr 0x6210000a52d8 <col:25, col:34> 'int'
>   `-ParenExpr 0x6210000a52b0 <col:25, col:32> '<bound member function type>'
>     `-BinaryOperator 0x6210000a5288 <col:26, col:29> '<bound member function type>' '.*'
>       |-DeclRefExpr 0x6210000a51f0 <col:26> 'const S':'const S' lvalue Var 0x6210000a0cf8 's' 'const S':'const S'
>       `-ImplicitCastExpr 0x6210000a5268 <col:29> 'decltype(&S::func)':'int (S::*)() const' <LValueToRValue>
>         `-DeclRefExpr 0x6210000a5240 <col:29> 'const decltype(&S::func)':'int (S::*const)() const' lvalue Var 0x6210000a0fc0 'foo' 'const decltype(&S::func)':'int (S::*const)() const' non_odr_use_constant
> ```
> 
> notice the `BinaryOperator`.
Ah! Now I see why we needed this, thank you!


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

https://reviews.llvm.org/D144164



More information about the cfe-commits mailing list