brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 61867cf Raw
100 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <string>10 11// size_type capacity() const; // constexpr since C++2012 13#include <string>14#include <cassert>15 16#include "test_allocator.h"17#include "min_allocator.h"18#include "asan_testing.h"19 20#include "test_macros.h"21 22template <class S>23TEST_CONSTEXPR_CXX20 void test_invariant(S s, test_allocator_statistics& alloc_stats) {24  alloc_stats.throw_after = 0;25#ifndef TEST_HAS_NO_EXCEPTIONS26  try27#endif28  {29    while (s.size() < s.capacity())30      s.push_back(typename S::value_type());31    assert(s.size() == s.capacity());32    LIBCPP_ASSERT(is_string_asan_correct(s));33  }34#ifndef TEST_HAS_NO_EXCEPTIONS35  catch (...) {36    assert(false);37  }38#endif39  alloc_stats.throw_after = INT_MAX;40}41 42template <class Alloc>43TEST_CONSTEXPR_CXX20 void test_string(const Alloc& a) {44  using S = std::basic_string<char, std::char_traits<char>, Alloc>;45  {46    S const s((Alloc(a)));47    assert(s.capacity() >= 0);48    LIBCPP_ASSERT(is_string_asan_correct(s));49  }50  {51    S const s(3, 'x', Alloc(a));52    assert(s.capacity() >= 3);53    LIBCPP_ASSERT(is_string_asan_correct(s));54  }55#if TEST_STD_VER >= 1156  // Check that we perform SSO57  {58    S const s;59    assert(s.capacity() > 0);60    ASSERT_NOEXCEPT(s.capacity());61    LIBCPP_ASSERT(is_string_asan_correct(s));62  }63#endif64}65 66TEST_CONSTEXPR_CXX20 bool test() {67  test_string(std::allocator<char>());68  test_string(test_allocator<char>());69  test_string(test_allocator<char>(3));70  test_string(min_allocator<char>());71  test_string(safe_allocator<char>());72 73  {74    test_allocator_statistics alloc_stats;75    typedef std::basic_string<char, std::char_traits<char>, test_allocator<char> > S;76    S s((test_allocator<char>(&alloc_stats)));77    test_invariant(s, alloc_stats);78    LIBCPP_ASSERT(is_string_asan_correct(s));79    s.assign(10, 'a');80    s.erase(5);81    test_invariant(s, alloc_stats);82    LIBCPP_ASSERT(is_string_asan_correct(s));83    s.assign(100, 'a');84    s.erase(50);85    test_invariant(s, alloc_stats);86    LIBCPP_ASSERT(is_string_asan_correct(s));87  }88 89  return true;90}91 92int main(int, char**) {93  test();94#if TEST_STD_VER >= 2095  static_assert(test());96#endif97 98  return 0;99}100