mirror of https://github.com/microsoft/clang.git
69 lines
3.1 KiB
C++
69 lines
3.1 KiB
C++
// Test different kinds of alwaysinline *structor definitions.
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-CALL
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -mconstructor-aliases -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -mconstructor-aliases -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-CALL
|
|
|
|
struct A1 {
|
|
__attribute__((__always_inline__)) A1() {}
|
|
__attribute__((__always_inline__)) ~A1() {}
|
|
};
|
|
|
|
void g1() {
|
|
A1 a1;
|
|
}
|
|
|
|
struct A2 {
|
|
inline __attribute__((__always_inline__)) A2() {}
|
|
inline __attribute__((__always_inline__)) ~A2() {}
|
|
};
|
|
|
|
void g2() {
|
|
A2 a2;
|
|
}
|
|
|
|
struct A3 {
|
|
inline __attribute__((gnu_inline, __always_inline__)) A3() {}
|
|
inline __attribute__((gnu_inline, __always_inline__)) ~A3() {}
|
|
};
|
|
|
|
void g3() {
|
|
A3 a3;
|
|
}
|
|
|
|
// CHECK-DAG: define internal void @_ZN2A1C1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI:[01-9]+]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A1C2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A1D1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A1D2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
|
|
|
|
// CHECK-DAG: define internal void @_ZN2A2C1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH:[01-9]+]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A2C2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A2D1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A2D2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
|
|
// CHECK-DAG: define internal void @_ZN2A3C1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A3C2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A3D1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
// CHECK-DAG: define internal void @_ZN2A3D2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
|
|
|
|
// CHECK-DAG: attributes #[[AI]] = {{.*alwaysinline.*}}
|
|
// CHECK-DAG: attributes #[[AIIH]] = {{.*alwaysinline.*inlinehint.*}}
|
|
// CHECK-NOT: attributes #[[NOAI]] = {{.*alwaysinline.*}}
|
|
|
|
// CHECK-CALL-LABEL: define void @_Z2g1v()
|
|
// CHECK-CALL: call void @_ZN2A1C1Ev.alwaysinline
|
|
// CHECK-CALL: call void @_ZN2A1D1Ev.alwaysinline
|
|
// CHECK-CALL: ret void
|
|
|
|
// CHECK-CALL-LABEL: define void @_Z2g2v()
|
|
// CHECK-CALL: call void @_ZN2A2C1Ev.alwaysinline
|
|
// CHECK-CALL: call void @_ZN2A2D1Ev.alwaysinline
|
|
// CHECK-CALL: ret void
|
|
|
|
// CHECK-CALL-LABEL: define void @_Z2g3v()
|
|
// CHECK-CALL: call void @_ZN2A3C1Ev.alwaysinline
|
|
// CHECK-CALL: call void @_ZN2A3D1Ev.alwaysinline
|
|
// CHECK-CALL: ret void
|