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