mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-09 17:43:57 +00:00
c0dca6ded7
These features are new in VS 2013 and are necessary in order to layout std::ostream correctly. Currently we have an ABI incompatibility when self-hosting with the 2013 stdlib in our convertible_fwd_ostream wrapper in gtest. This change adds another implicit attribute, MSVtorDispAttr, because implicit attributes are currently the best way to make sure the information stays on class templates through instantiation. Reviewers: majnemer Differential Revision: http://llvm-reviews.chandlerc.com/D2746 llvm-svn: 201274
27 lines
754 B
C++
27 lines
754 B
C++
// RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=0 -DVTORDISP_MODE=0 %s -verify
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=1 -DVTORDISP_MODE=1 %s -verify
|
|
// RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=2 -DVTORDISP_MODE=2 %s -verify
|
|
|
|
// expected-no-diagnostics
|
|
|
|
struct A {
|
|
A();
|
|
virtual void foo();
|
|
};
|
|
|
|
// At /vd1, there is a vtordisp before A.
|
|
struct B : virtual A {
|
|
B();
|
|
virtual void foo();
|
|
virtual void bar();
|
|
};
|
|
|
|
// At /vd2, there is a vtordisp before B, but only because it has its own
|
|
// vftable.
|
|
struct C : virtual B {
|
|
C();
|
|
};
|
|
|
|
// There are two vfptrs, two vbptrs, and some number of vtordisps.
|
|
static_assert(sizeof(C) == 2 * 4 + 2 * 4 + 4 * VTORDISP_MODE, "size mismatch");
|