1*67e74705SXin Li // RUN: %clang_cc1 -triple i686-pc-win32 -fms-compatibility %s -emit-llvm -o - | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li #include <stddef.h> 4*67e74705SXin Li 5*67e74705SXin Li struct arbitrary_t {} arbitrary; 6*67e74705SXin Li void *operator new(size_t size, arbitrary_t); 7*67e74705SXin Li 8*67e74705SXin Li struct arbitrary2_t {} arbitrary2; 9*67e74705SXin Li void *operator new[](size_t size, arbitrary2_t); 10*67e74705SXin Li 11*67e74705SXin Li namespace PR13164 { f()12*67e74705SXin Li void f() { 13*67e74705SXin Li // MSVC will fall back on the non-array operator new. 14*67e74705SXin Li void *a; 15*67e74705SXin Li int *p = new(arbitrary) int[4]; 16*67e74705SXin Li // CHECK: call i8* @"\01??2@YAPAXIUarbitrary_t@@@Z"(i32 16, %struct.arbitrary_t* 17*67e74705SXin Li } 18*67e74705SXin Li 19*67e74705SXin Li struct S { 20*67e74705SXin Li void *operator new[](size_t size, arbitrary_t); 21*67e74705SXin Li }; 22*67e74705SXin Li g()23*67e74705SXin Li void g() { 24*67e74705SXin Li S *s = new(arbitrary) S[2]; 25*67e74705SXin Li // CHECK: call i8* @"\01??_US@PR13164@@SAPAXIUarbitrary_t@@@Z"(i32 2, %struct.arbitrary_t* 26*67e74705SXin Li S *s1 = new(arbitrary) S; 27*67e74705SXin Li // CHECK: call i8* @"\01??2@YAPAXIUarbitrary_t@@@Z"(i32 1, %struct.arbitrary_t* 28*67e74705SXin Li } 29*67e74705SXin Li 30*67e74705SXin Li struct T { 31*67e74705SXin Li void *operator new(size_t size, arbitrary2_t); 32*67e74705SXin Li }; 33*67e74705SXin Li h()34*67e74705SXin Li void h() { 35*67e74705SXin Li // This should still call the global operator new[]. 36*67e74705SXin Li T *t = new(arbitrary2) T[2]; 37*67e74705SXin Li // CHECK: call i8* @"\01??_U@YAPAXIUarbitrary2_t@@@Z"(i32 2, %struct.arbitrary2_t* 38*67e74705SXin Li } 39*67e74705SXin Li } 40