19430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck %s
2bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson
3bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson// Non-trivial dtors, should both be passed indirectly.
4bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonstruct S {
5bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson  ~S();
67e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  short s;
7bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson};
8bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson
993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fv(%struct.S* noalias sret %
10bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders CarlssonS f() { return S(); }
1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1S(%struct.S*)
12bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonvoid f(S) { }
13bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson
14bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson// Non-trivial dtors, should both be passed indirectly.
15bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonclass C {
169430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarpublic:
17bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson  ~C();
18bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson  double c;
19bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson};
20bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson
2193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1gv(%class.C* noalias sret %
22bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders CarlssonC g() { return C(); }
23bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson
2493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1C(%class.C*)
25bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonvoid f(C) { }
267e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
277e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
287e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
297e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
307e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner// PR7058 - Missing byval on MI thunk definition.
317e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZThn4_N18BasicAliasAnalysis13getModRefInfoE8CallSite
337e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner// ...
34c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: %struct.CallSite* byval align 4 %CS)
357e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct CallSite {
367e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  unsigned Ptr;
377e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  CallSite(unsigned XX) : Ptr(XX) {}
387e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner};
397e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
407e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct AliasAnalysis {
417e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  virtual void xyz();
427e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  virtual void getModRefInfo(CallSite CS) = 0;
437e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner};
447e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
457e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct ModulePass {
467e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  virtual void xx();
477e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner};
487e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
497e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct BasicAliasAnalysis : public ModulePass, public AliasAnalysis {
507e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner  void getModRefInfo(CallSite CS);
517e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner};
527e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner
537e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnervoid BasicAliasAnalysis::getModRefInfo(CallSite CS) {
547e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner}
559430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
569430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// Check various single element struct type conditions.
579430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar//
589430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// PR7098.
599430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
6093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @_Z2f0v()
619430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s0_0 { int x; };
629430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s0_1 : s0_0 { int* y; };
639430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars0_1 f0() { return s0_1(); }
649430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
6593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z2f1v()
669430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s1_0 { int x; };
679430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s1_1 : s1_0 { };
689430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars1_1 f1() { return s1_1(); }
699430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
7093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f2v()
719430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s2_0 { double x; };
729430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s2_1 : s2_0 { };
739430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars2_1 f2() { return s2_1(); }
749430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
7593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f3v()
769430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_0 { };
779430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_1 { double x; };
789430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_2 : s3_0, s3_1 { };
799430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars3_2 f3() { return s3_2(); }
809430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar
8193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @_Z2f4v()
829430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_0 { float x; };
839430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_1 { float x; };
849430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_2 : s4_0, s4_1 { };
859430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars4_2 f4() { return s4_2(); }
86a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar
8793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32* @_Z2f5v()
88a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbarstruct s5 { s5(); int &x; };
89a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbars5 f5() { return s5(); }
907711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar
9193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z4f6_0M2s6i(i32 %a)
92c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: define i64 @_Z4f6_1M2s6FivE({ i32, i32 }* byval align 4)
937711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar// FIXME: It would be nice to avoid byval on the previous case.
947711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbarstruct s6 {};
957711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbartypedef int s6::* s6_mdp;
967711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbartypedef int (s6::*s6_mfp)();
977711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbars6_mdp f6_0(s6_mdp a) { return a; }
987711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbars6_mfp f6_1(s6_mfp a) { return a; }
995ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar
10093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f7v()
1015ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7_0 { unsigned : 0; };
1025ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7_1 { double x; };
1035ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7 : s7_0, s7_1 { };
1045ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars7 f7() { return s7(); }
1055ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar
10693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z2f8v(%struct.s8* noalias sret %agg.result)
1075ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8_0 { };
1085ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8_1 { double x; };
1095ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8 { s8_0 a; s8_1 b; };
1105ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars8 f8() { return s8(); }
1115ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar
11293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z2f9v(%struct.s9* noalias sret %agg.result)
1135ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9_0 { unsigned : 0; };
1145ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9_1 { double x; };
1155ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9 { s9_0 a; s9_1 b; };
1165ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars9 f9() { return s9(); }
117