You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
libcxx_old/test/libcxx/debug/containers/db_string.pass.cpp

99 lines
2.7 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03, c++11, c++14
// UNSUPPORTED: windows
// UNSUPPORTED: libcpp-no-if-constexpr
// MODULES_DEFINES: _LIBCPP_DEBUG=1
// Can't test the system lib because this test enables debug mode
// UNSUPPORTED: with_system_cxx_lib
// test container debugging
#define _LIBCPP_DEBUG 1
#include <string>
#include <vector>
#include "test_macros.h"
#include "container_debug_tests.hpp"
#include "debug_mode_helper.h"
using namespace IteratorDebugChecks;
typedef std::basic_string<char, std::char_traits<char>, test_allocator<char>> StringType;
template <class Container = StringType, ContainerType CT = CT_String>
struct StringContainerChecks : BasicContainerChecks<Container, CT> {
using Base = BasicContainerChecks<Container, CT_String>;
using value_type = typename Container::value_type;
using allocator_type = typename Container::allocator_type;
using iterator = typename Container::iterator;
using const_iterator = typename Container::const_iterator;
using Base::makeContainer;
using Base::makeValueType;
public:
static void run() {
Base::run_iterator_tests();
Base::run_allocator_aware_tests();
for (int N : {3, 128}) {
FrontOnEmptyContainer(N);
BackOnEmptyContainer(N);
PopBack(N);
}
}
private:
static void BackOnEmptyContainer(int N) {
CHECKPOINT("testing back on empty");
Container C = makeContainer(N);
Container const& CC = C;
iterator it = --C.end();
(void)C.back();
(void)CC.back();
C.pop_back();
EXPECT_DEATH( C.erase(it) );
C.clear();
EXPECT_DEATH( C.back() );
EXPECT_DEATH( CC.back() );
}
static void FrontOnEmptyContainer(int N) {
CHECKPOINT("testing front on empty");
Container C = makeContainer(N);
Container const& CC = C;
(void)C.front();
(void)CC.front();
C.clear();
EXPECT_DEATH( C.front() );
EXPECT_DEATH( CC.front() );
}
static void PopBack(int N) {
CHECKPOINT("testing pop_back() invalidation");
Container C1 = makeContainer(N);
iterator it1 = C1.end();
--it1;
C1.pop_back();
EXPECT_DEATH( C1.erase(it1) );
C1.erase(C1.begin(), C1.end());
assert(C1.size() == 0);
EXPECT_DEATH_MATCHES(DebugInfoMatcher("string::pop_back(): string is already empty"), C1.pop_back() );
}
};
int main(int, char**)
{
StringContainerChecks<>::run();
return 0;
}