Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -O1 -triple wasm32-unknown-unknown -emit-llvm -o - %s \
      2 // RUN:   | FileCheck %s
      3 // RUN: %clang_cc1 -O1 -triple wasm64-unknown-unknown -emit-llvm -o - %s \
      4 // RUN:   | FileCheck %s
      5 
      6 #define concat_(x, y) x ## y
      7 #define concat(x, y) concat_(x, y)
      8 
      9 #define test(T) \
     10   T forward(T x) { return x; } \
     11   void use(T x); \
     12   T concat(def_, T)(void); \
     13   void concat(test_, T)(void) { use(concat(def_, T)()); }
     14 
     15 struct one_field { double d; };
     16 test(one_field);
     17 // CHECK: define double @_Z7forward9one_field(double %{{.*}})
     18 //
     19 // CHECK: define void @_Z14test_one_fieldv()
     20 // CHECK: %[[call:.*]] = tail call double @_Z13def_one_fieldv()
     21 // CHECK: tail call void @_Z3use9one_field(double %[[call]])
     22 // CHECK: ret void
     23 //
     24 // CHECK: declare void @_Z3use9one_field(double)
     25 // CHECK: declare double @_Z13def_one_fieldv()
     26 
     27 struct two_fields { double d, e; };
     28 test(two_fields);
     29 // CHECK: define void @_Z7forward10two_fields(%struct.two_fields* noalias nocapture sret %{{.*}}, %struct.two_fields* byval nocapture readonly align 8 %{{.*}})
     30 //
     31 // CHECK: define void @_Z15test_two_fieldsv()
     32 // CHECK: %[[tmp:.*]] = alloca %struct.two_fields, align 8
     33 // CHECK: call void @_Z14def_two_fieldsv(%struct.two_fields* nonnull sret %[[tmp]])
     34 // CHECK: call void @_Z3use10two_fields(%struct.two_fields* byval nonnull align 8 %[[tmp]])
     35 // CHECK: ret void
     36 //
     37 // CHECK: declare void @_Z3use10two_fields(%struct.two_fields* byval align 8)
     38 // CHECK: declare void @_Z14def_two_fieldsv(%struct.two_fields* sret)
     39 
     40 struct copy_ctor {
     41     double d;
     42     copy_ctor(copy_ctor const&);
     43 };
     44 test(copy_ctor);
     45 // CHECK: define void @_Z7forward9copy_ctor(%struct.copy_ctor* noalias sret %{{.*}}, %struct.copy_ctor* %{{.*}})
     46 //
     47 // CHECK: declare %struct.copy_ctor* @_ZN9copy_ctorC1ERKS_(%struct.copy_ctor* returned, %struct.copy_ctor* dereferenceable(8))
     48 //
     49 // CHECK: define void @_Z14test_copy_ctorv()
     50 // CHECK: %[[tmp:.*]] = alloca %struct.copy_ctor, align 8
     51 // CHECK: call void @_Z13def_copy_ctorv(%struct.copy_ctor* nonnull sret %[[tmp]])
     52 // CHECK: call void @_Z3use9copy_ctor(%struct.copy_ctor* nonnull %[[tmp]])
     53 // CHECK: ret void
     54 //
     55 // CHECK: declare void @_Z3use9copy_ctor(%struct.copy_ctor*)
     56 // CHECK: declare void @_Z13def_copy_ctorv(%struct.copy_ctor* sret)
     57 
     58 struct __attribute__((aligned(16))) aligned_copy_ctor {
     59     double d, e;
     60     aligned_copy_ctor(aligned_copy_ctor const&);
     61 };
     62 test(aligned_copy_ctor);
     63 // CHECK: define void @_Z7forward17aligned_copy_ctor(%struct.aligned_copy_ctor* noalias sret %{{.*}}, %struct.aligned_copy_ctor* %{{.*}})
     64 //
     65 // CHECK: declare %struct.aligned_copy_ctor* @_ZN17aligned_copy_ctorC1ERKS_(%struct.aligned_copy_ctor* returned, %struct.aligned_copy_ctor* dereferenceable(16))
     66 //
     67 // CHECK: define void @_Z22test_aligned_copy_ctorv()
     68 // CHECK: %[[tmp:.*]] = alloca %struct.aligned_copy_ctor, align 16
     69 // CHECK: call void @_Z21def_aligned_copy_ctorv(%struct.aligned_copy_ctor* nonnull sret %[[tmp]])
     70 // CHECK: call void @_Z3use17aligned_copy_ctor(%struct.aligned_copy_ctor* nonnull %[[tmp]])
     71 // CHECK: ret void
     72 //
     73 // CHECK: declare void @_Z3use17aligned_copy_ctor(%struct.aligned_copy_ctor*)
     74 // CHECK: declare void @_Z21def_aligned_copy_ctorv(%struct.aligned_copy_ctor* sret)
     75 
     76 struct empty {};
     77 test(empty);
     78 // CHECK: define void @_Z7forward5empty()
     79 //
     80 // CHECK: define void @_Z10test_emptyv()
     81 // CHECK: tail call void @_Z9def_emptyv()
     82 // CHECK: tail call void @_Z3use5empty()
     83 // CHECK: ret void
     84 //
     85 // CHECK: declare void @_Z3use5empty()
     86 // CHECK: declare void @_Z9def_emptyv()
     87 
     88 struct one_bitfield {
     89     int d:3;
     90 };
     91 test(one_bitfield);
     92 // CHECK: define i32 @_Z7forward12one_bitfield(i32 %{{.*}})
     93 //
     94 // CHECK: define void @_Z17test_one_bitfieldv()
     95 // CHECK: %[[call:.*]] = tail call i32 @_Z16def_one_bitfieldv()
     96 // CHECK: tail call void @_Z3use12one_bitfield(i32 %[[call]])
     97 // CHECK: ret void
     98 //
     99 // CHECK: declare void @_Z3use12one_bitfield(i32)
    100 // CHECK: declare i32 @_Z16def_one_bitfieldv()
    101