This revision was automatically updated to reflect the committed changes. Closed by commit rL284624: MS ABI: Fix assert when generating virtual function call with virtual bases and… (authored by hans).
Changed prior to commit: https://reviews.llvm.org/D25779?vs=75171&id=75177#toc Repository: rL LLVM https://reviews.llvm.org/D25779 Files: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp cfe/trunk/test/CodeGenCXX/pr30731.cpp Index: cfe/trunk/test/CodeGenCXX/pr30731.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/pr30731.cpp +++ cfe/trunk/test/CodeGenCXX/pr30731.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o - %s | FileCheck %s + +struct A { + virtual ~A(); +}; + +struct B {}; + +struct C { + virtual void f(); +}; + +struct S : A, virtual B, C { + void f() override; +}; + +void f(S* s) { s->f(); } + +// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z" +// CHECK: call +// CHECK: ret void Index: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1773,15 +1773,8 @@ CharUnits MaxBaseOffset; for (auto &&B : RD->bases()) { const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); - CharUnits BaseOffset = Layout.getBaseClassOffset(Base); - if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { - MaxBase = Base; - MaxBaseOffset = BaseOffset; - } - } - for (auto &&B : RD->vbases()) { - const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); - CharUnits BaseOffset = Layout.getVBaseClassOffset(Base); + CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Base) + : Layout.getBaseClassOffset(Base); if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { MaxBase = Base; MaxBaseOffset = BaseOffset;
Index: cfe/trunk/test/CodeGenCXX/pr30731.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/pr30731.cpp +++ cfe/trunk/test/CodeGenCXX/pr30731.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple i386-pc-win32 -emit-llvm -flto -std=c++11 -o - %s | FileCheck %s + +struct A { + virtual ~A(); +}; + +struct B {}; + +struct C { + virtual void f(); +}; + +struct S : A, virtual B, C { + void f() override; +}; + +void f(S* s) { s->f(); } + +// CHECK-LABEL: define void @"\01?f@@YAXPAUS@@@Z" +// CHECK: call +// CHECK: ret void Index: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp =================================================================== --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1773,15 +1773,8 @@ CharUnits MaxBaseOffset; for (auto &&B : RD->bases()) { const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); - CharUnits BaseOffset = Layout.getBaseClassOffset(Base); - if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { - MaxBase = Base; - MaxBaseOffset = BaseOffset; - } - } - for (auto &&B : RD->vbases()) { - const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl(); - CharUnits BaseOffset = Layout.getVBaseClassOffset(Base); + CharUnits BaseOffset = B.isVirtual() ? Layout.getVBaseClassOffset(Base) + : Layout.getBaseClassOffset(Base); if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) { MaxBase = Base; MaxBaseOffset = BaseOffset;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits