105 lines · cpp
1// RUN: %clang_cc1 -no-enable-noundef-analysis -O1 -triple wasm32-unknown-unknown -emit-llvm -o - %s \2// RUN: | FileCheck %s3// RUN: %clang_cc1 -no-enable-noundef-analysis -O1 -triple wasm64-unknown-unknown -emit-llvm -o - %s \4// RUN: | FileCheck %s5 6#define concat_(x, y) x##y7#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 15struct one_field {16 double d;17};18test(one_field);19// CHECK: define double @_Z7forward9one_field(double returned %{{.*}})20//21// CHECK: define void @_Z14test_one_fieldv()22// CHECK: %[[call:.*]] = tail call double @_Z13def_one_fieldv()23// CHECK: call void @_Z3use9one_field(double %[[call]])24// CHECK: ret void25//26// CHECK: declare void @_Z3use9one_field(double)27// CHECK: declare double @_Z13def_one_fieldv()28 29struct two_fields {30 double d, e;31};32test(two_fields);33// CHECK: define void @_Z7forward10two_fields(ptr dead_on_unwind noalias writable writeonly sret(%struct.two_fields) align 8 captures(none) initializes((0, 16)) %{{.*}}, ptr readonly byval(%struct.two_fields) align 8 captures(none) %{{.*}})34//35// CHECK: define void @_Z15test_two_fieldsv()36// CHECK: %[[tmp:.*]] = alloca %struct.two_fields, align 837// CHECK: call void @_Z14def_two_fieldsv(ptr dead_on_unwind nonnull writable sret(%struct.two_fields) align 8 %[[tmp]])38// CHECK: call void @_Z3use10two_fields(ptr nonnull byval(%struct.two_fields) align 8 %[[tmp]])39// CHECK: ret void40//41// CHECK: declare void @_Z3use10two_fields(ptr byval(%struct.two_fields) align 8)42// CHECK: declare void @_Z14def_two_fieldsv(ptr dead_on_unwind writable sret(%struct.two_fields) align 8)43 44struct copy_ctor {45 double d;46 copy_ctor(copy_ctor const &);47};48test(copy_ctor);49// CHECK: define void @_Z7forward9copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.copy_ctor) align 8 %{{.*}}, ptr dead_on_return nonnull %{{.*}})50//51// CHECK: declare ptr @_ZN9copy_ctorC1ERKS_(ptr {{[^,]*}} returned {{[^,]*}}, ptr nonnull align 8 dereferenceable(8))52//53// CHECK: define void @_Z14test_copy_ctorv()54// CHECK: %[[tmp:.*]] = alloca %struct.copy_ctor, align 855// CHECK: call void @_Z13def_copy_ctorv(ptr dead_on_unwind nonnull writable sret(%struct.copy_ctor) align 8 %[[tmp]])56// CHECK: call void @_Z3use9copy_ctor(ptr dead_on_return nonnull %[[tmp]])57// CHECK: ret void58//59// CHECK: declare void @_Z3use9copy_ctor(ptr dead_on_return)60// CHECK: declare void @_Z13def_copy_ctorv(ptr dead_on_unwind writable sret(%struct.copy_ctor) align 8)61 62struct __attribute__((aligned(16))) aligned_copy_ctor {63 double d, e;64 aligned_copy_ctor(aligned_copy_ctor const &);65};66test(aligned_copy_ctor);67// CHECK: define void @_Z7forward17aligned_copy_ctor(ptr dead_on_unwind noalias {{[^,]*}} sret(%struct.aligned_copy_ctor) align 16 %{{.*}}, ptr dead_on_return nonnull %{{.*}})68//69// CHECK: declare ptr @_ZN17aligned_copy_ctorC1ERKS_(ptr {{[^,]*}} returned {{[^,]*}}, ptr nonnull align 16 dereferenceable(16))70//71// CHECK: define void @_Z22test_aligned_copy_ctorv()72// CHECK: %[[tmp:.*]] = alloca %struct.aligned_copy_ctor, align 1673// CHECK: call void @_Z21def_aligned_copy_ctorv(ptr dead_on_unwind nonnull writable sret(%struct.aligned_copy_ctor) align 16 %[[tmp]])74// CHECK: call void @_Z3use17aligned_copy_ctor(ptr dead_on_return nonnull %[[tmp]])75// CHECK: ret void76//77// CHECK: declare void @_Z3use17aligned_copy_ctor(ptr dead_on_return)78// CHECK: declare void @_Z21def_aligned_copy_ctorv(ptr dead_on_unwind writable sret(%struct.aligned_copy_ctor) align 16)79 80struct empty {};81test(empty);82// CHECK: define void @_Z7forward5empty()83//84// CHECK: define void @_Z10test_emptyv()85// CHECK: call void @_Z9def_emptyv()86// CHECK: call void @_Z3use5empty()87// CHECK: ret void88//89// CHECK: declare void @_Z3use5empty()90// CHECK: declare void @_Z9def_emptyv()91 92struct one_bitfield {93 int d : 3;94};95test(one_bitfield);96// CHECK: define i32 @_Z7forward12one_bitfield(i32 returned %{{.*}})97//98// CHECK: define void @_Z17test_one_bitfieldv()99// CHECK: %[[call:.*]] = tail call i32 @_Z16def_one_bitfieldv()100// CHECK: call void @_Z3use12one_bitfield(i32 %[[call]])101// CHECK: ret void102//103// CHECK: declare void @_Z3use12one_bitfield(i32)104// CHECK: declare i32 @_Z16def_one_bitfieldv()105