Index: cfe/trunk/lib/Basic/TargetInfo.cpp =================================================================== --- cfe/trunk/lib/Basic/TargetInfo.cpp +++ cfe/trunk/lib/Basic/TargetInfo.cpp @@ -45,7 +45,7 @@ // From the glibc documentation, on GNU systems, malloc guarantees 16-byte // alignment on 64-bit systems and 8-byte alignment on 32-bit systems. See // https://www.gnu.org/software/libc/manual/html_node/Malloc-Examples.html - if (T.isGNUEnvironment()) + if (T.isGNUEnvironment() || T.isWindowsMSVCEnvironment()) NewAlign = Triple.isArch64Bit() ? 128 : Triple.isArch32Bit() ? 64 : 0; else NewAlign = 0; // Infer from basic type alignment. Index: cfe/trunk/test/CodeGenCXX/cxx1z-aligned-allocation.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/cxx1z-aligned-allocation.cpp +++ cfe/trunk/test/CodeGenCXX/cxx1z-aligned-allocation.cpp @@ -4,6 +4,8 @@ // RUN: %clang_cc1 -std=c++14 -fexceptions -fsized-deallocation -faligned-allocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s // RUN: %clang_cc1 -std=c++1z -fexceptions -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s +// RUN: %clang_cc1 -std=c++1z -fexceptions -fsized-deallocation %s -emit-llvm -triple x86_64-windows-msvc -o - | FileCheck %s --check-prefix=CHECK-MS + // Check that we don't used aligned (de)allocation without -faligned-allocation or C++1z. // RUN: %clang_cc1 -std=c++14 -DUNALIGNED -fexceptions %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNALIGNED // RUN: %clang_cc1 -std=c++1z -DUNALIGNED -fexceptions -fno-aligned-allocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNALIGNED @@ -27,14 +29,28 @@ // CHECK-LABEL: define {{.*}} @_Z2a0v() // CHECK: %[[ALLOC:.*]] = call i8* @_ZnwmSt11align_val_t(i64 512, i64 32) // CHECK: call void @_ZdlPvSt11align_val_t(i8* %[[ALLOC]], i64 32) +// CHECK-MS-LABEL: define {{.*}} @"\01?a0@@YAPEAXXZ"() +// CHECK-MS: %[[ALLOC:.*]] = call i8* @"\01??2@YAPEAX_KW4align_val_t@std@@@Z"(i64 512, i64 32) +// CHECK-MS: cleanuppad +// CHECK-MS: call void @"\01??3@YAXPEAXW4align_val_t@std@@@Z"(i8* %[[ALLOC]], i64 32) void *a0() { return new A; } +// FIXME: Why don't we call the sized array deallocation overload in this case? +// The size is known. +// // CHECK-LABEL: define {{.*}} @_Z2a1l( // CHECK: %[[ALLOC:.*]] = call i8* @_ZnamSt11align_val_t(i64 %{{.*}}, i64 32) // No array cookie. // CHECK-NOT: store // CHECK: invoke void @_ZN1AC1Ev( // CHECK: call void @_ZdaPvSt11align_val_t(i8* %[[ALLOC]], i64 32) +// CHECK-MS-LABEL: define {{.*}} @"\01?a1@@YAPEAXJ@Z"( +// CHECK-MS: %[[ALLOC:.*]] = call i8* @"\01??_U@YAPEAX_KW4align_val_t@std@@@Z"(i64 %{{.*}}, i64 32) +// No array cookie. +// CHECK-MS-NOT: store +// CHECK-MS: invoke %struct.A* @"\01??0A@@QEAA@XZ"( +// CHECK-MS: cleanuppad +// CHECK-MS: call void @"\01??_V@YAXPEAXW4align_val_t@std@@@Z"(i8* %[[ALLOC]], i64 32) void *a1(long n) { return new A[n]; } // CHECK-LABEL: define {{.*}} @_Z2a2P1A( Index: cfe/trunk/test/Preprocessor/init.c =================================================================== --- cfe/trunk/test/Preprocessor/init.c +++ cfe/trunk/test/Preprocessor/init.c @@ -9890,11 +9890,11 @@ // RUN: %clang_cc1 -E -dM -ffreestanding \ -// RUN: -triple i686-windows-msvc -fms-compatibility < /dev/null \ +// RUN: -triple i686-windows-msvc -fms-compatibility -x c++ < /dev/null \ // RUN: | FileCheck -match-full-lines -check-prefix MSVC-X32 %s // RUN: %clang_cc1 -E -dM -ffreestanding \ -// RUN: -triple x86_64-windows-msvc -fms-compatibility < /dev/null \ +// RUN: -triple x86_64-windows-msvc -fms-compatibility -x c++ < /dev/null \ // RUN: | FileCheck -match-full-lines -check-prefix MSVC-X64 %s // MSVC-X32:#define __CLANG_ATOMIC_BOOL_LOCK_FREE 2 @@ -9908,6 +9908,7 @@ // MSVC-X32-NEXT:#define __CLANG_ATOMIC_SHORT_LOCK_FREE 2 // MSVC-X32-NEXT:#define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2 // MSVC-X32-NOT:#define __GCC_ATOMIC{{.*}} +// MSVC-X32:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 8U // MSVC-X64:#define __CLANG_ATOMIC_BOOL_LOCK_FREE 2 // MSVC-X64-NEXT:#define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2 @@ -9919,7 +9920,8 @@ // MSVC-X64-NEXT:#define __CLANG_ATOMIC_POINTER_LOCK_FREE 2 // MSVC-X64-NEXT:#define __CLANG_ATOMIC_SHORT_LOCK_FREE 2 // MSVC-X64-NEXT:#define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2 -// MSVC-X86-NOT:#define __GCC_ATOMIC{{.*}} +// MSVC-X64-NOT:#define __GCC_ATOMIC{{.*}} +// MSVC-X64:#define __STDCPP_DEFAULT_NEW_ALIGNMENT__ 16ULL // RUN: %clang_cc1 -E -dM -ffreestanding \ // RUN: -triple=aarch64-apple-ios9 < /dev/null \