diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2013-11-05 15:54:58 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2013-11-05 15:54:58 +0000 |
commit | 5f0db587078b5af32fc9ac41fe4276b80918fd8d (patch) | |
tree | b5b4be2c7ac17eb3ef2c298b54cf0d7bed454748 /test/CodeGenCXX/microsoft-abi-vbtables.cpp | |
parent | a257e2129c83c06ecd52a5e8eedcdf5aed3f6247 (diff) |
Fix vbtable indices when a class shares the vbptr with a non-virtual base
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194082 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/microsoft-abi-vbtables.cpp')
-rw-r--r-- | test/CodeGenCXX/microsoft-abi-vbtables.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/CodeGenCXX/microsoft-abi-vbtables.cpp b/test/CodeGenCXX/microsoft-abi-vbtables.cpp index 1d95672a90..6de556b1d8 100644 --- a/test/CodeGenCXX/microsoft-abi-vbtables.cpp +++ b/test/CodeGenCXX/microsoft-abi-vbtables.cpp @@ -410,3 +410,70 @@ H h; // CHECK-DAG: @"\01??_8B@Test21@@7B@" = // CHECK-DAG: @"\01??_8C@Test21@@7B@" = } + +namespace Test22 { +struct A { int a; }; +struct B : virtual A { int b; }; +struct C { int c; }; +struct D : B, virtual C { int d; }; +D d; + +// CHECK-DAG: @"\01??_8D@Test22@@7B@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 12, i32 16] +// CHECK-DAG: @"\01??_8B@Test22@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] +} + +namespace Test23 { +struct A { int a; }; +struct B : virtual A { int b; }; +struct C { int c; }; +// Note the unusual order of bases. It forces C to be laid out before A. +struct D : virtual C, B { int d; }; +D d; + +// CHECK-DAG: @"\01??_8D@Test23@@7B@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 16, i32 12] +// CHECK-DAG: @"\01??_8B@Test23@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] +} + +namespace Test24 { +struct A { int a; }; +struct B : virtual A { int b; }; +struct C { int c; }; +struct D : virtual C, B { + virtual void f(); // Issues a vfptr, but the vbptr is still shared with B. + int d; +}; +D d; + +// CHECK-DAG: @"\01??_8D@Test24@@7B@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 16, i32 12] +// CHECK-DAG: @"\01??_8B@Test24@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8] +} + +namespace Test25 { +struct A { int a; }; +struct B : virtual A { + virtual void f(); // Issues a vfptr. + int b; +}; +struct C { int c; }; +struct D : virtual C, B { int d; }; +D d; + +// CHECK-DAG: @"\01??_8D@Test25@@7B@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 -4, i32 16, i32 12] +// CHECK-DAG: @"\01??_8B@Test25@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 -4, i32 8] +} + +namespace Test26 { +struct A { int a; }; +struct B { int b; }; +struct C { int c; }; +struct D : virtual A { int d; }; +struct E : virtual B { + virtual void foo(); // Issues a vfptr. + int e; +}; +struct F: virtual C, D, E { int f; }; +F f; +// F reuses the D's vbptr, even though D is laid out after E. +// CHECK-DAG: @"\01??_8F@Test26@@7BD@1@@" = linkonce_odr unnamed_addr constant [4 x i32] [i32 0, i32 16, i32 12, i32 20] +// CHECK-DAG: @"\01??_8F@Test26@@7BE@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 -4, i32 28] +} |