diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2016-05-13 20:05:09 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2016-05-13 20:05:09 +0000 |
| commit | 833b91eee8c4a33f725f5f22736c85958476f2ec (patch) | |
| tree | ed353c95f74e424b64223e404943ccee8ae50759 /clang/test/CodeGenCXX/microsoft-abi-structors.cpp | |
| parent | 6ecc10ab8051aba47d575cfcacb3e86385ff920d (diff) | |
| download | bcm5719-llvm-833b91eee8c4a33f725f5f22736c85958476f2ec.tar.gz bcm5719-llvm-833b91eee8c4a33f725f5f22736c85958476f2ec.zip | |
[MS ABI] Delegating constructors should not assume they are most derived
A constructor needs to know whether or not it is most derived in order
to determine if it is responsible for virtual bases. Delegating
constructors assumed they were most derived.
llvm-svn: 269465
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-abi-structors.cpp')
| -rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-structors.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-structors.cpp b/clang/test/CodeGenCXX/microsoft-abi-structors.cpp index 3fb97b9a363..a576f0c3d7e 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-structors.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-structors.cpp @@ -7,7 +7,7 @@ // RUN: FileCheck --check-prefix DTORS3 %s < %t // RUN: FileCheck --check-prefix DTORS4 %s < %t // -// RUN: %clang_cc1 -emit-llvm %s -o - -mconstructor-aliases -triple=x86_64-pc-win32 -fno-rtti | FileCheck --check-prefix DTORS-X64 %s +// RUN: %clang_cc1 -emit-llvm %s -o - -mconstructor-aliases -triple=x86_64-pc-win32 -fno-rtti -std=c++11 | FileCheck --check-prefix DTORS-X64 %s namespace basic { @@ -443,6 +443,20 @@ void g() { new MoveOnly(f()); } // CHECK: store {{.*}} @"\01??_7MoveOnly@implicit_copy_vtable@@6B@" } +namespace delegating_ctor { +struct Y {}; +struct X : virtual Y { + X(int); + X(); +}; +X::X(int) : X() {} +} +// CHECK: define x86_thiscallcc %"struct.delegating_ctor::X"* @"\01??0X@delegating_ctor@@QAE@H@Z"( +// CHECK: %[[is_most_derived_addr:.*]] = alloca i32, align 4 +// CHECK: store i32 %is_most_derived, i32* %[[is_most_derived_addr]] +// CHECK: %[[is_most_derived:.*]] = load i32, i32* %[[is_most_derived_addr]] +// CHECK: call x86_thiscallcc {{.*}}* @"\01??0X@delegating_ctor@@QAE@XZ"({{.*}} i32 %[[is_most_derived]]) + // Dtor thunks for classes in anonymous namespaces should be internal, not // linkonce_odr. namespace { @@ -471,4 +485,3 @@ class G { extern void testG() { G g; } - |

