blob: d038a4208ecddc134de863b13cf8057cfb6ff851 [file] [log] [blame]
CJ Johnson69cd7762020-11-16 15:04:55 -08001// RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -mconstructor-aliases -triple=i386-pc-win32 | FileCheck %s
2// RUN: %clang_cc1 -fno-rtti -emit-llvm %s -o - -mconstructor-aliases -triple=i386-pc-win32 -fno-delete-null-pointer-checks | FileCheck %s
3
4struct Left {
5 virtual void left();
6};
7
8struct Right {
9 virtual void right();
10};
11
12struct ChildNoOverride : Left, Right {
13};
14
15struct ChildOverride : Left, Right {
16 virtual void left();
17 virtual void right();
18};
19
20extern "C" void foo(void *);
21
22void call_left_no_override(ChildNoOverride *child) {
23 // CHECK: %[[CHILD:.*]] = load %struct.ChildNoOverride
24 child->left();
25}
26
27void ChildOverride::left() {}
28
29void call_right_no_override(ChildNoOverride *child) {
30 child->right();
31 // When calling a right base's virtual method, one needs to adjust `this` at the caller site.
32 //
33 // CHECK: %[[CHILD_i8:.*]] = bitcast %struct.ChildNoOverride* %[[CHILD]] to i8*
34 // CHECK: %[[RIGHT_i8:.*]] = getelementptr inbounds i8, i8* %[[CHILD_i8]], i32 4
35 // CHECK: %[[RIGHT:.*]] = bitcast i8* %[[RIGHT_i8]] to %struct.Right*
36 //
37 // CHECK: %[[VFPTR:.*]] = bitcast %struct.Right* %[[RIGHT]] to void (%struct.Right*)***
38 // CHECK: %[[VFTABLE:.*]] = load void (%struct.Right*)**, void (%struct.Right*)*** %[[VFPTR]]
39 // CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.Right*)*, void (%struct.Right*)** %[[VFTABLE]], i64 0
40}
41
42void ChildOverride::right() {
43 foo(this);
44}
45
46void call_right_override(ChildOverride *child) {
47 child->right();
48 // Ensure that `nonnull` and `dereferenceable(N)` are not emitted whether or not null is valid
49 //
50 // CHECK: %[[RIGHT:.*]] = getelementptr inbounds i8, i8* %[[CHILD_i8]], i32 4
51 // CHECK: %[[VFUN_VALUE:.*]] = load void (i8*)*, void (i8*)** %[[VFUN]]
hyeongyu kimfd9b0992021-11-09 02:09:49 +090052 // CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](i8* %[[RIGHT]])
CJ Johnson69cd7762020-11-16 15:04:55 -080053}