1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=i386-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK32
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=x86_64-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK64
393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct S {
593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  int x, y, z;
693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg};
793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
86bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// U is not trivially copyable, and requires inalloca to pass by value.
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct U {
106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int u;
116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  U();
126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ~U();
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  U(const U &);
146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct C {
1793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  virtual void foo();
1893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  virtual int bar(int, double);
1993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  virtual S baz(int);
206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual S qux(U);
213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  virtual void thud(...);
2293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg};
2393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
2493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgnamespace {
2593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgstruct D {
2693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  virtual void foo();
2793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg};
2893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg}
2993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
3093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborgvoid f() {
3193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  void (C::*ptr)();
3293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  ptr = &C::foo;
3393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  ptr = &C::foo; // Don't crash trying to define the thunk twice :)
3493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
3593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  int (C::*ptr2)(int, double);
3693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  ptr2 = &C::bar;
3793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
3893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  S (C::*ptr3)(int);
3993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  ptr3 = &C::baz;
4093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
4193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  void (D::*ptr4)();
4293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg  ptr4 = &D::foo;
4393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  S (C::*ptr5)(U);
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ptr5 = &C::qux;
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  void (C::*ptr6)(...);
483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  ptr6 = &C::thud;
493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32-LABEL: define void @"\01?f@@YAXXZ"()
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA@AE" to i8*), i8** %ptr
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B3AE" to i8*), i8** %ptr2
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B7AE" to i8*), i8** %ptr3
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32: store i8* bitcast (void (%"struct.(anonymous namespace)::D"*, ...)* @"\01??_9D@?A@@$BA@AE" to i8*), i8** %ptr4
5693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: }
5793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg//
5893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64-LABEL: define void @"\01?f@@YAXXZ"()
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA@AA" to i8*), i8** %ptr
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$B7AA" to i8*), i8** %ptr2
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BBA@AA" to i8*), i8** %ptr3
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64: store i8* bitcast (void (%"struct.(anonymous namespace)::D"*, ...)* @"\01??_9D@?A@@$BA@AA" to i8*), i8** %ptr
6393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: }
6493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg}
6593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
6693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
6793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 1st virtual function in C with no parameters.
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BA@AE"(%struct.C* %this, ...)
690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR:[0-9]+]]
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NOT:             unnamed_addr
710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32:                 comdat
723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0
733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
7433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void
7693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: }
7793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg//
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BA@AA"(%struct.C* %this, ...)
790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR:[0-9]+]]
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NOT:             unnamed_addr
810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64:                 comdat
823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0
833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
8433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void
8693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: }
8793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
8893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 2nd virtual function in C, taking int and double as parameters, returning int.
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B3AE"(%struct.C* %this, ...)
900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] comdat
913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1
923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
9333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void
9593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: }
9693b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg//
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$B7AA"(%struct.C* %this, ...)
980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]] comdat
993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1
1003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
10133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void
10393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: }
10493b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
10593b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the 3rd virtual function in C, taking an int parameter, returning a struct.
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B7AE"(%struct.C* %this, ...)
1070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] comdat
1083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2
1093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
11033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void
11293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: }
11393b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg//
114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBA@AA"(%struct.C* %this, ...)
1150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]] comdat
1163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2
1173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
11833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void
12093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: }
12193b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg
12293b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// Thunk for calling the virtual function in internal class D.
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-LABEL: define internal x86_thiscallcc void @"\01??_9D@?A@@$BA@AE"(%"struct.(anonymous namespace)::D"* %this, ...)
1240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]]
1253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
1263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]]
12733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%"struct.(anonymous namespace)::D"*, ...) [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...)
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void
12993b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK32: }
13093b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg//
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-LABEL: define internal void @"\01??_9D@?A@@$BA@AA"(%"struct.(anonymous namespace)::D"* %this, ...)
1320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64: #[[ATTR]]
1333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
1343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]]
13533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%"struct.(anonymous namespace)::D"*, ...) [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...)
136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK64-NEXT: ret void
1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK64: }
1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Thunk for calling the fourth virtual function in C, taking a struct parameter
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// and returning a struct.
1410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BM@AE"(%struct.C* %this, ...) {{.*}} comdat
1423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3
1433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
14433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK32-NEXT: ret void
1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK32: }
1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//
1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBI@AA"(%struct.C* %this, ...) {{.*}} comdat
1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3
1503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
15133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
1523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: ret void
1533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: }
1543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// Thunk for calling the fifth virtual function in C which uses the __cdecl calling convention.
1563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32-LABEL: define linkonce_odr void @"\01??_9C@@$BBA@AA"(%struct.C* %this, ...) {{.*}} comdat align 2 {
1573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 4
1583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
15933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK32: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
1603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: ret void
1613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK32: }
1623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar//
1633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BCA@AA"(%struct.C* %this, ...) {{.*}} comdat align 2 {
1643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 4
1653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void (%struct.C*, ...)** [[VPTR]]
16633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C* %{{.*}}, ...)
16793b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: ret void
16893b717ac956f5c82f7895ed8874cbd514c6d0a4eHans Wennborg// CHECK64: }
1690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK32: #[[ATTR]] = {{{.*}}"thunk"{{.*}}}
171