diff options
author | Hans Wennborg <hans@hanshq.net> | 2016-10-19 18:04:27 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2016-10-19 18:04:27 +0000 |
commit | 0a79a1203a5a0b5bbc5c499d379331694221e3ce (patch) | |
tree | c7dd424ac7e69722577287b7b3378a99de19ad70 | |
parent | a85154518feb42ee640d5866fe234128932b3a1d (diff) | |
download | bcm5719-llvm-0a79a1203a5a0b5bbc5c499d379331694221e3ce.tar.gz bcm5719-llvm-0a79a1203a5a0b5bbc5c499d379331694221e3ce.zip |
MS ABI: Fix assert when generating virtual function call with virtual bases and -flto (PR30731)
getClassAtVTableLocation() was calling
ASTRecordLayout::getBaseClassOffset() on a virtual base, causing an
assert.
Differential Revision: https://reviews.llvm.org/D25779
llvm-svn: 284624
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 11 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/pr30731.cpp | 21 |
2 files changed, 23 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 2708ddec728..37ba3f969a6 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1773,15 +1773,8 @@ static const CXXRecordDecl *getClassAtVTableLocation(ASTContext &Ctx, 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; diff --git a/clang/test/CodeGenCXX/pr30731.cpp b/clang/test/CodeGenCXX/pr30731.cpp new file mode 100644 index 00000000000..078f21ceda4 --- /dev/null +++ b/clang/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 |