117 lines · cpp
1// RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck %s2 3// Non-trivial dtors, should both be passed indirectly.4struct S {5 ~S();6 short s;7};8 9// CHECK-LABEL: define{{.*}} void @_Z1fv(ptr dead_on_unwind noalias writable sret(%struct.S) align 2 %10S f() { return S(); }11// CHECK-LABEL: define{{.*}} void @_Z1f1S(ptr noundef %0)12void f(S) { }13 14// Non-trivial dtors, should both be passed indirectly.15class C {16public:17 ~C();18 double c;19};20 21// CHECK-LABEL: define{{.*}} void @_Z1gv(ptr dead_on_unwind noalias writable sret(%class.C) align 4 %22C g() { return C(); }23 24// CHECK-LABEL: define{{.*}} void @_Z1f1C(ptr noundef %0)25void f(C) { }26 27 28 29 30// PR7058 - Missing byval on MI thunk definition.31 32// CHECK-LABEL: define{{.*}} void @_ZThn4_N18BasicAliasAnalysis13getModRefInfoE8CallSite33// ...34// CHECK: ptr noundef byval(%struct.CallSite) align 4 %CS)35struct CallSite {36 unsigned Ptr;37 CallSite(unsigned XX) : Ptr(XX) {}38};39 40struct AliasAnalysis {41 virtual void xyz();42 virtual void getModRefInfo(CallSite CS) = 0;43};44 45struct ModulePass {46 virtual void xx();47};48 49struct BasicAliasAnalysis : public ModulePass, public AliasAnalysis {50 void getModRefInfo(CallSite CS);51};52 53void BasicAliasAnalysis::getModRefInfo(CallSite CS) {54}55 56// Check various single element struct type conditions.57//58// PR7098.59 60// CHECK-LABEL: define{{.*}} i64 @_Z2f0v()61struct s0_0 { int x; };62struct s0_1 : s0_0 { int* y; };63s0_1 f0() { return s0_1(); }64 65// CHECK-LABEL: define{{.*}} i32 @_Z2f1v()66struct s1_0 { int x; };67struct s1_1 : s1_0 { };68s1_1 f1() { return s1_1(); }69 70// CHECK-LABEL: define{{.*}} double @_Z2f2v()71struct s2_0 { double x; };72struct s2_1 : s2_0 { };73s2_1 f2() { return s2_1(); }74 75// CHECK-LABEL: define{{.*}} double @_Z2f3v()76struct s3_0 { };77struct s3_1 { double x; };78struct s3_2 : s3_0, s3_1 { };79s3_2 f3() { return s3_2(); }80 81// CHECK-LABEL: define{{.*}} i64 @_Z2f4v()82struct s4_0 { float x; };83struct s4_1 { float x; };84struct s4_2 : s4_0, s4_1 { };85s4_2 f4() { return s4_2(); }86 87// CHECK-LABEL: define{{.*}} ptr @_Z2f5v()88struct s5 { s5(); int &x; };89s5 f5() { return s5(); }90 91// CHECK-LABEL: define{{.*}} i32 @_Z4f6_0M2s6i(i32 %a)92// CHECK: define{{.*}} i64 @_Z4f6_1M2s6FivE(ptr noundef byval({ i32, i32 }) align 4 %0)93// FIXME: It would be nice to avoid byval on the previous case.94struct s6 {};95typedef int s6::* s6_mdp;96typedef int (s6::*s6_mfp)();97s6_mdp f6_0(s6_mdp a) { return a; }98s6_mfp f6_1(s6_mfp a) { return a; }99 100// CHECK-LABEL: define{{.*}} double @_Z2f7v()101struct s7_0 { unsigned : 0; };102struct s7_1 { double x; };103struct s7 : s7_0, s7_1 { };104s7 f7() { return s7(); }105 106// CHECK-LABEL: define{{.*}} void @_Z2f8v(ptr dead_on_unwind noalias writable sret(%struct.s8) align 4 %agg.result)107struct s8_0 { };108struct s8_1 { double x; };109struct s8 { s8_0 a; s8_1 b; };110s8 f8() { return s8(); }111 112// CHECK-LABEL: define{{.*}} void @_Z2f9v(ptr dead_on_unwind noalias writable sret(%struct.s9) align 4 %agg.result)113struct s9_0 { unsigned : 0; };114struct s9_1 { double x; };115struct s9 { s9_0 a; s9_1 b; };116s9 f9() { return s9(); }117