brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 9c34cb8 Raw
84 lines · cpp
1// RUN: %clang_cc1 -std=c++11                      -fsyntax-only -verify %s2// RUN: %clang_cc1 -std=c++11 -faligned-allocation -fsyntax-only -verify %s3// RUN: %clang_cc1 -std=c++14                      -fsyntax-only -verify %s4// RUN: %clang_cc1 -std=c++14 -faligned-allocation -fsyntax-only -verify %s5// RUN: %clang_cc1 -std=c++17                      -fsyntax-only -verify %s6// RUN: %clang_cc1 -std=c++17 -faligned-allocation -fsyntax-only -verify %s7 8namespace std {9typedef __SIZE_TYPE__ size_t;10struct nothrow_t {};11#if __cplusplus >= 201103L12enum class align_val_t : size_t {};13#else14enum align_val_t {15// We can't force an underlying type when targeting windows.16#ifndef _WIN3217  __zero = 0,18  __max = (size_t)-119#endif20};21#endif22} // namespace std23 24void *operator new(std::size_t count, std::align_val_t al) __attribute__((alloc_align(2))); // #125 26#define OVERALIGNED alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2)27 28struct OVERALIGNED A {29  A();30  int n[128];31};32 33void *ptr_variable(int align) { return new (std::align_val_t(align)) A; }34void *ptr_align16() { return new (std::align_val_t(16)) A; }35void *ptr_align15() { return new (std::align_val_t(15)) A; } // expected-warning {{requested alignment is not a power of 2}}36 37struct alignas(128) S {38  S() {}39};40 41void *alloc_overaligned_struct() {42  return new S;43}44 45void *alloc_overaligned_struct_with_extra_variable_alignment(int align) {46  return new (std::align_val_t(align)) S;47}48void *alloc_overaligned_struct_with_extra_256_alignment(int align) {49  return new (std::align_val_t(256)) S;50}51void *alloc_overaligned_struct_with_extra_255_alignment(int align) {52  return new (std::align_val_t(255)) S; // expected-warning {{requested alignment is not a power of 2}}53}54 55std::align_val_t align_variable(int align) { return std::align_val_t(align); }56std::align_val_t align_align16() { return std::align_val_t(16); }57std::align_val_t align_align15() { return std::align_val_t(15); }58 59struct X {};60void *operator new(std::size_t, X); // #261void *operator new(std::size_t, std::align_val_t, X); // #362// FIXME: Consider improving notes 1 and 3 here to say that these are aligned63// allocation functions and the type is not over-aligned.64X *p = new (123) X; // expected-error {{no matching function}}65// expected-note@#1 {{no known conversion from 'int' to 'std::align_val_t' for 2nd argument}}66// expected-note@#2 {{no known conversion from 'int' to 'X' for 2nd argument}}67// expected-note@#3 {{requires 3 arguments}}68// expected-note@* {{requires 1 argument, but 2 were provided}} (builtin)69 70#ifdef __cpp_aligned_new71struct alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2) Y {};72Y *q = new (123) Y; // expected-error {{no matching function}}73// expected-note@#1 {{requires 2 arguments, but 3 were provided}}74// expected-note@#2 {{no known conversion from 'int' to 'X' for 2nd argument}}75// expected-note@#3 {{no known conversion from 'int' to 'X' for 3rd argument}}76// expected-note@* {{requires 1 argument, but 2 were provided}} (builtin)77#endif78 79X *r = new (std::align_val_t(32), 123) X; // expected-error {{no matching function}}80// expected-note@#1 {{requires 2 arguments, but 3 were provided}}81// expected-note@#2 {{requires 2 arguments, but 3 were provided}}82// expected-note@#3 {{no known conversion from 'int' to 'X' for 3rd argument}}83// expected-note@* {{requires 1 argument, but 3 were provided}} (builtin)84