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

================
Comment at: lib/CodeGen/CGExprCXX.cpp:1871
+                                             CGF.CGM.getLangOpts().AppleKext)))
+          Dtor = DevirtualizedDtor;
+        else {
----------------
rsmith wrote:
> `Dtor` could be the destructor for a type derived from `ElementPtr`. We'll 
> either need to somehow emit a cast to the correct derived type here, or just 
> abort the devirtualization and emit a virtual call in that case. (The latter 
> is what `EmitCXXMemberOrOperatorMemberCallExpr` does -- see its checks on 
> `getCXXRecord(Base)` and `getCXXRecord(Inner)`.)
> 
> Eg, for:
> 
> ```
> struct SomethingElse { virtual void f(); };
> struct A {
>   virtual ~A();
> };
> struct B : SomethingElse, A {
>   ~B() final;
> };
> void f(B *p) {
>   delete (A*)p;
> }
> ```
> 
> ... `Ptr` will be a pointer to an `A` subobject of a `B` object, but 
> `getDevirtualizedMethod` will still be able to work out that `B::~B` is the 
> right thing to call here (by looking through the cast and finding that the 
> pointer must actually point to a `B` object whose destructor is `final`). We 
> need to either convert `Ptr` back from an `A*` to a `B*` or just not 
> devirtualize this call.
Should be good now.


Repository:
  rC Clang

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

https://reviews.llvm.org/D63161



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

Reply via email to