mantognini marked an inline comment as done.
mantognini added inline comments.


================
Comment at: clang/lib/CodeGen/CGClass.cpp:496
+      // destroyed should have the expected type.
+      QualType ThisTy = D->getThisType();
       Address Addr =
----------------
rjmccall wrote:
> I think the rule we want is that the type passed here is the (qualified) 
> object type, but `getThisType()` will return a pointer type.  Consider adding 
> a `getThisObjectType()` method to `CXXMethodDecl` which does that computation 
> (and then make `getThisType()` just wrap that in a `PointerType`).
I've done the suggested refactoring, let me know if it needs adjustment.


================
Comment at: clang/lib/CodeGen/CGExprCXX.cpp:103
+  // we ensure a cast is added where necessary.
+  if (ThisTy.isNull()) {
+#ifndef NDEBUG
----------------
rjmccall wrote:
> mantognini wrote:
> > Despite no longer having a default parameter, not all call site can provide 
> > a meaningful value ATM. That is why this check is still required.
> Is that resolved with fixing the FIXME?
> 
> Please assert that `ThisTy->getAsCXXRecordDecl() == Dtor->getParent()` to 
> guard against that pointer/object mixup.
Yes, indeed. I've therefore simplified the code and added the requested 
assertion.


================
Comment at: clang/lib/CodeGen/CGExprCXX.cpp:374
       EmitCXXDestructorCall(GD, Callee, This.getPointer(),
+                            /*ThisTy=*/QualType(),
                             /*ImplicitParam=*/nullptr,
----------------
rjmccall wrote:
> `ThisTy` here can be either `Base->getType()` or 
> `Base->getType()->getPointeeType()` depending on whether this is an arrow 
> access.
Thanks for mentioning it. It should be better now.


================
Comment at: clang/lib/CodeGen/CGExprCXX.cpp:99
+  assert(!ThisTy.isNull());
+  assert(!ThisTy->isPointerType() && "Unexpected pointer type");
+  assert(ThisTy->getAsCXXRecordDecl() == DtorDecl->getParent() &&
----------------
I wasn't 100% sure if this was covered by the next assertion.


================
Comment at: clang/lib/CodeGen/ItaniumCXXABI.cpp:1758
+  // This is suboptimal for correctness purposes. Instead, CE should probably
+  // always be defined.
+  QualType ThisTy;
----------------
rjmccall wrote:
> It looks like the only places that pass down a null CE are the two 
> implementations in `emitVirtualObjectDelete`, which both have a 
> `CXXDeleteExpr`.  You could just have this method take an 
> `llvm::PointerUnion<CXXMethodCallExpr*,CXXDeleteExpr*>` or something, and 
> then someone else could take advantage of that for better source locations on 
> the virtual call eventually.
Alright, makes sense. I've changed the function to take a `PointerUnion` and 
removed the FIXMEs.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D64569



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

Reply via email to