File: swap_exception.pass.cpp

package info (click to toggle)
llvm-toolchain-snapshot 1%3A21~%2B%2B20250612091244%2B3f0cf742ac4e-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,204,364 kB
  • sloc: cpp: 7,565,811; ansic: 1,415,365; asm: 1,031,257; python: 250,248; f90: 93,670; objc: 70,556; lisp: 41,926; pascal: 17,847; sh: 10,009; ml: 5,111; perl: 4,720; awk: 3,523; makefile: 3,423; javascript: 2,272; xml: 892; fortran: 763
file content (80 lines) | stat: -rw-r--r-- 2,199 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//===----------------------------------------------------------------------===//
//
// 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++03, c++11, c++14, c++17, c++20
// `check_assertion.h` requires Unix headers and regex support.
// REQUIRES: has-unix-headers
// UNSUPPORTED: no-localization
// UNSUPPORTED: no-exceptions

// <flat_map>

// class flat_multimap

// void swap(flat_multimap& y) noexcept;
// friend void swap(flat_multimap& x, flat_multimap& y) noexcept

// Test that std::terminate is called if any exception is thrown during swap

#include <flat_map>
#include <cassert>
#include <deque>
#include <functional>
#include <vector>

#include "test_macros.h"
#include "../helpers.h"
#include "check_assertion.h"

template <class F>
void test_swap_exception_guarantee([[maybe_unused]] F&& swap_function) {
  {
    // key swap throws
    using KeyContainer   = ThrowOnMoveContainer<int>;
    using ValueContainer = std::vector<int>;
    using M              = std::flat_multimap<int, int, TransparentComparator, KeyContainer, ValueContainer>;

    M m1, m2;
    m1.emplace(1, 1);
    m1.emplace(1, 2);
    m2.emplace(3, 3);
    m2.emplace(3, 4);
    // swap is noexcept
    EXPECT_STD_TERMINATE([&] { swap_function(m1, m2); });
  }

  {
    // value swap throws
    using KeyContainer   = std::vector<int>;
    using ValueContainer = ThrowOnMoveContainer<int>;
    using M              = std::flat_multimap<int, int, TransparentComparator, KeyContainer, ValueContainer>;

    M m1, m2;
    m1.emplace(1, 1);
    m1.emplace(1, 2);
    m2.emplace(3, 3);
    m2.emplace(3, 4);

    // swap is noexcept
    EXPECT_STD_TERMINATE([&] { swap_function(m1, m2); });
  }
}

int main(int, char**) {
  {
    auto swap_func = [](auto& m1, auto& m2) { swap(m1, m2); };
    test_swap_exception_guarantee(swap_func);
  }

  {
    auto swap_func = [](auto& m1, auto& m2) { m1.swap(m2); };
    test_swap_exception_guarantee(swap_func);
  }

  return 0;
}