1 // RUN: %clang_cc1 -std=c++1z -fexceptions %s -verify
3 using size_t = decltype(sizeof(0));
4 namespace std
{ enum class align_val_t
: size_t {}; }
8 // If the type is aligned, first try with an alignment argument and then
9 // without. If not, never consider supplying an alignment.
11 template<unsigned Align
, typename
...Ts
>
12 struct alignas(Align
) Unaligned
{
13 void *operator new(size_t, Ts
...) = delete; // expected-note 4{{deleted}}
15 auto *ua
= new Unaligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
>; // expected-error {{deleted}}
16 auto *ub
= new Unaligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2>; // expected-error {{deleted}}
17 auto *uap
= new (arg
) Unaligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
, Arg
>; // expected-error {{deleted}}
18 auto *ubp
= new (arg
) Unaligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2, Arg
>; // expected-error {{deleted}}
20 template<unsigned Align
, typename
...Ts
>
21 struct alignas(Align
) Aligned
{
22 void *operator new(size_t, std::align_val_t
, Ts
...) = delete; // expected-note 2{{deleted}} expected-note 2{{not viable}}
24 auto *aa
= new Aligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
>; // expected-error {{no matching}}
25 auto *ab
= new Aligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2>; // expected-error {{deleted}}
26 auto *aap
= new (arg
) Aligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
, Arg
>; // expected-error {{no matching}}
27 auto *abp
= new (arg
) Aligned
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2, Arg
>; // expected-error {{deleted}}
29 // If both are available, we prefer the aligned version for an overaligned
30 // type, and only use the unaligned version for a non-overaligned type.
32 template<unsigned Align
, typename
...Ts
>
33 struct alignas(Align
) Both1
{
34 void *operator new(size_t, Ts
...); // expected-note 2{{not viable}}
35 void *operator new(size_t, std::align_val_t
, Ts
...) = delete; // expected-note 2{{deleted}}
37 template<unsigned Align
, typename
...Ts
>
38 struct alignas(Align
) Both2
{
39 void *operator new(size_t, Ts
...) = delete; // expected-note 2{{deleted}}
40 void *operator new(size_t, std::align_val_t
, Ts
...); // expected-note 2{{not viable}}
42 auto *b1a
= new Both1
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
>;
43 auto *b1b
= new Both1
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2>; // expected-error {{deleted}}
44 auto *b2a
= new Both2
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
>; // expected-error {{deleted}}
45 auto *b2b
= new Both2
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2>;
46 auto *b1ap
= new (arg
) Both1
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
, Arg
>;
47 auto *b1bp
= new (arg
) Both1
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2, Arg
>; // expected-error {{deleted}}
48 auto *b2ap
= new (arg
) Both2
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
, Arg
>; // expected-error {{deleted}}
49 auto *b2bp
= new (arg
) Both2
<__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2, Arg
>;
51 // Note that the aligned form can select a function with a parameter different
52 // from std::align_val_t.
54 struct alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2) WeirdAlignedAlloc1
{
55 void *operator new(size_t, ...) = delete; // expected-note 2{{deleted}}
57 auto *waa1
= new WeirdAlignedAlloc1
; // expected-error {{deleted}}
58 auto *waa1p
= new (arg
) WeirdAlignedAlloc1
; // expected-error {{deleted}}
60 struct alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__
* 2) WeirdAlignedAlloc2
{
61 template<typename
...T
>
62 void *operator new(size_t, T
...) {
63 using U
= void(T
...); // expected-note 2{{previous}}
64 using U
= void; // expected-error {{different types ('void' vs 'void (std::align_val_t)')}} \
65 expected
-error
{{different
types ('void' vs
'void (std::align_val_t, Arg)')}}
68 auto *waa2
= new WeirdAlignedAlloc2
; // expected-note {{instantiation of}}
69 auto *waa2p
= new (arg
) WeirdAlignedAlloc2
; // expected-note {{instantiation of}}