// RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -S -emit-llvm -fsanitize=alignment %s -o - | FileCheck %s struct alignas(32) S1 { int x; S1(); }; struct alignas(32) S2 { int x; }; struct alignas(32) S3 { int x; S3(int *p = new int[4]); }; struct S4 : public S3 { S4() : S3() {} }; typedef __attribute__((ext_vector_type(2), aligned(32))) float float32x2_t; struct S5 { float32x2_t x; }; void *operator new (unsigned long, void *p) { return p; } void *operator new[] (unsigned long, void *p) { return p; } S1 *func_01() { // CHECK-LABEL: define {{.*}} @_Z7func_01v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: call void @_ZN2S1C1Ev( // CHECK-NOT: and i64 %{{.*}}, 31 // CHECK: ret %struct.S1* return new S1[20]; } S2 *func_02() { // CHECK-LABEL: define {{.*}} @_Z7func_02v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret %struct.S2* return new S2; } S2 *func_03() { // CHECK-LABEL: define {{.*}} @_Z7func_03v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 %{{.*}}, 31 // CHECK: ret %struct.S2* return new S2[20]; } float32x2_t *func_04() { // CHECK-LABEL: define {{.*}} @_Z7func_04v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret <2 x float>* return new float32x2_t; } float32x2_t *func_05() { // CHECK-LABEL: define {{.*}} @_Z7func_05v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 %{{.*}}, 31 // CHECK: ret <2 x float>* return new float32x2_t[20]; } S3 *func_07() { // CHECK-LABEL: define {{.*}} @_Z7func_07v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: and i64 %{{.*}}, 3, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret %struct.S3* return new S3; } S3 *func_08() { // CHECK-LABEL: define {{.*}} @_Z7func_08v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: and i64 %{{.*}}, 3, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret %struct.S3* return new S3[10]; } S2 *func_10(void *p) { // CHECK-LABEL: define {{.*}} @_Z7func_10Pv // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret %struct.S2* return new(p) S2; } S2 *func_11(void *p) { // CHECK-LABEL: define {{.*}} @_Z7func_11Pv // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 %{{.*}}, 31, !nosanitize // CHECK-NOT: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret %struct.S2* return new(p) S2[10]; } float32x2_t *func_12() { // CHECK-LABEL: define {{.*}} @_Z7func_12v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK: ret <2 x float>* return new float32x2_t; } float32x2_t *func_13() { // CHECK-LABEL: define {{.*}} @_Z7func_13v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 %{{.*}}, 31 // CHECK: ret <2 x float>* return new float32x2_t[20]; } S4 *func_14() { // CHECK-LABEL: define {{.*}} @_Z7func_14v // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 %{{.*}}, 31 // CHECK: ret %struct.S4* return new S4; } S5 *func_15(const S5 *ptr) { // CHECK-LABEL: define {{.*}} @_Z7func_15PK2S5 // CHECK: and i64 %{{.*}}, 31, !nosanitize // CHECK: icmp eq i64 %{{.*}}, 0, !nosanitize // CHECK-NOT: and i64 // CHECK: ret %struct.S5* return new S5(*ptr); }