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