aaron.ballman added a comment.

In D156027#4544346 <https://reviews.llvm.org/D156027#4544346>, @tbaeder wrote:

> Do you want me to squash the patches I abandoned into this one?

I think that could help us to see the bigger picture; I'm assuming that only 
adds a bit of code rather than three full patches' worth of code.



================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:240
+    return Initializing ? this->visitInitializer(SubExpr)
+                        : this->visit(SubExpr);
 
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > tbaeder wrote:
> > > This pattern shows up a few times, so it might make sense to add a 
> > > function that simply passes on all the flags and doesn't do anything 
> > > else. I'm just not sure what to call it.
> > It's not clear to me when you should use this pattern to begin with.
> Whenever you just pass on the visit, essentially ignoring the current node. 
> Another good example is `ConstantExpr`s, where we don't do anything for the 
> node and then just pass move on to the `SubExpr`.
Ah, I see, so it's basically when you want to delegate the visit to a child 
node? If so, perhaps that's a reasonable name (`delegateVisit()`)?


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:2090
+      assert(Initializing);
+      if (!isa<CXXMemberCallExpr>(E)) {
+        if (!this->emitDupPtr(E))
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > And if it is a member call expression?
> For member calls, the layout at this point is:
> 
> ```
> ThisPtr
> RVOPtr
> RVOPtr
> ```
> (top of the stack is where we're at). The dup here is supposed to dup the RVO 
> ptr, but we can't do that for member calls because the top is currently the 
> instance pointer. Tha'ts why `VisitCXXMemberCallExpr()` handles this 
> separately.
Thank you for the explanation!


================
Comment at: clang/lib/AST/Interp/Context.cpp:131
   if (T->isFunctionPointerType() || T->isFunctionReferenceType() ||
-      T->isFunctionType())
+      T->isFunctionType() || 
T->isSpecificBuiltinType(BuiltinType::BoundMember))
     return PT_FnPtr;
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > tbaeder wrote:
> > > I've removed this change in https://reviews.llvm.org/D144164 since it 
> > > didn't  seem necessary, but it //is// necessary after applying this patch.
> > Which test case exercises this bit?
> We have this line in `records.cpp`:
> 
> ```
>   constexpr int value = (s.*foo)();
> ```
> and its type is:
> 
> ```
> BuiltinType 0x62100001fbe0 '<bound member function type>'
> ```
> 
> it just so happens that we _now_ call `classify()` on this earlier in the 
> code path while before we didn't do that, so we need to know that the bound 
> member function type is now some composite type.
Ah, thank you! That makes sense.


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

https://reviews.llvm.org/D156027

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to