brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · ec4caef Raw
121 lines · cpp
1// RUN: %clang_cc1 -std=c++2c -fexperimental-new-constant-interpreter -verify=expected,both %s2// RUN: %clang_cc1 -std=c++2c  -verify=ref,both %s3 4// both-no-diagnostics5 6namespace std {7inline namespace {8template <int __v> struct integral_constant {9  static const int value = __v;10};11template <bool, class> using __enable_if_t = int;12char *addressof(char &);13struct pointer_traits {14  template <class _Up> using rebind = _Up *;15};16} // namespace17} // namespace std18void *operator new(decltype(sizeof(int)), void *);19namespace std {20inline namespace {21template <class _Tp> using __make_unsigned_t = __make_unsigned(_Tp);22template <class _Default, template <class> class>23using __detected_or_t = _Default;24template <class _Tp> using __pointer_member = _Tp;25template <class _Tp, class>26using __pointer = __detected_or_t<_Tp *, __pointer_member>;27template <class _Tp> using __size_type_member = _Tp;28template <class, class _DiffType>29using __size_type =30    __detected_or_t<__make_unsigned_t<_DiffType>, __size_type_member>;31struct allocation_result {32  char *ptr;33  unsigned long count;34};35template <class _Alloc> struct allocator_traits {36  using allocator_type = _Alloc;37  using pointer =38      __pointer<typename allocator_type::value_type, allocator_type>;39  using const_pointer = pointer_traits::rebind<char>;40  using size_type =41      __size_type<allocator_type, decltype(static_cast<int *>(nullptr) -42                                           static_cast<int *>(nullptr))>;43  template <class _Ap>44  static constexpr allocation_result allocate_at_least(_Ap __alloc,45                                                       size_type __n) {46    return {__alloc.allocate(__n), (unsigned long)__n};47  }48};49template <class _Alloc>50constexpr auto __allocate_at_least(_Alloc __alloc, decltype(sizeof(int)) __n) {51  return allocator_traits<_Alloc>::allocate_at_least(__alloc, __n);52}53template <class> struct allocator {54  typedef char value_type;55  constexpr char *allocate(decltype(sizeof(int)) __n) {56    return static_cast<char *>(operator new(__n));57  }58  constexpr void deallocate(char *__p) { operator delete(__p); }59};60struct __long {61  allocator_traits<allocator<char>>::size_type __is_long_;62  allocator_traits<allocator<char>>::size_type __size_;63  allocator_traits<allocator<char>>::pointer __data_;64};65allocator<char> __alloc_;66struct basic_string {67  __long __l;68  constexpr basic_string(basic_string &__str) {69    allocator_traits<allocator<char>>::size_type __trans_tmp_1 =70        __str.__get_long_size();71    auto __allocation = __allocate_at_least(__alloc_, __trans_tmp_1);72    for (allocator_traits<allocator<char>>::size_type __i = 0;73         __i != __allocation.count; ++__i) {74      char *__trans_tmp_9 = addressof(__allocation.ptr[__i]);75      new (__trans_tmp_9) char();76    }77    __l.__data_ = __allocation.ptr;78    __l.__is_long_ = __l.__size_ = __trans_tmp_1;79  }80  template <__enable_if_t<integral_constant<false>::value, int> = 0>81  constexpr basic_string(const char *__s, allocator<char>) {82    decltype(sizeof(int)) __trans_tmp_11, __i = 0;83    for (; __s[__i]; ++__i)84      __trans_tmp_11 = __i;85    auto __allocation = __allocate_at_least(__alloc_, 1);86    __l.__data_ = __allocation.ptr;87    __l.__size_ = __trans_tmp_11;88  }89  constexpr ~basic_string() {90    allocator<char> __a;91    __a.deallocate(__l.__data_);92  }93  constexpr allocator_traits<allocator<char>>::size_type size() {94    return __l.__is_long_;95  }96  constexpr char *data() {97    allocator_traits<allocator<char>>::const_pointer __trans_tmp_6 =98        __l.__is_long_ ? __l.__data_ : 0;99    return __trans_tmp_6;100  }101  constexpr allocator_traits<allocator<char>>::size_type __get_long_size() {102    return __l.__size_;103  }104};105constexpr void operator==(basic_string __lhs, basic_string __rhs) {106  decltype(sizeof(int)) __lhs_sz = __lhs.size();107  char *__trans_tmp_10 = __rhs.data(), *__trans_tmp_15 = __lhs.data();108  __builtin_memcmp(__trans_tmp_15, __trans_tmp_10, __lhs_sz);109}110} // namespace111} // namespace std112constexpr void test(std::basic_string s0) {113  std::basic_string s1 = s0, s2(s0);114  s2 == s1;115}116constexpr bool test() {117  test(std::basic_string("2345678901234567890", std::allocator<char>()));118  return true;119}120static_assert(test());121