1 | // RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=0 -DVTORDISP_MODE=0 %s -verify |
2 | // RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=1 -DVTORDISP_MODE=1 %s -verify |
3 | // RUN: %clang_cc1 -triple i686-pc-win32 -std=c++11 -vtordisp-mode=2 -DVTORDISP_MODE=2 %s -verify |
4 | |
5 | // expected-no-diagnostics |
6 | |
7 | struct A { |
8 | A(); |
9 | virtual void foo(); |
10 | }; |
11 | |
12 | // At /vd1, there is a vtordisp before A. |
13 | struct B : virtual A { |
14 | B(); |
15 | virtual void foo(); |
16 | virtual void bar(); |
17 | }; |
18 | |
19 | // At /vd2, there is a vtordisp before B, but only because it has its own |
20 | // vftable. |
21 | struct C : virtual B { |
22 | C(); |
23 | }; |
24 | |
25 | // There are two vfptrs, two vbptrs, and some number of vtordisps. |
26 | static_assert(sizeof(C) == 2 * 4 + 2 * 4 + 4 * VTORDISP_MODE, "size mismatch"); |
27 | |