111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// XFAIL: libcpp-no-exceptions
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Test asan vector annotations with a class that throws in a CTOR.
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <vector>
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "asan_testing.h"
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass X {
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  X(const X &x) { Init(x.a); }
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  X(char arg) { Init(arg); }
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  X() { Init(42); }
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  X &operator=(const X &x) {
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Init(x.a);
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void Init(char arg) {
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (arg == 42)
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      throw 0;
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (arg == 66)
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      arg = 42;
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    a = arg;
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  char get() const { return a; }
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void set(char arg) { a = arg; }
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate:
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  char a;
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass ThrowOnCopy {
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ThrowOnCopy() : should_throw(false) {}
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    explicit ThrowOnCopy(bool should_throw) : should_throw(should_throw) {}
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ThrowOnCopy(ThrowOnCopy const & other)
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        : should_throw(other.should_throw)
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        if (should_throw) {
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            throw 0;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bool should_throw;
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_push_back() {
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(2);
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(2));
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.push_back(X(66));
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 1);
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_emplace_back() {
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LIBCPP_HAS_NO_VARIADICS
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(2);
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(2));
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.emplace_back(42);
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 1);
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_HAS_NO_VARIADICS
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_insert_range() {
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(4);
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(1));
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(2));
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.capacity() >= 4);
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    char a[2] = {21, 42};
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.insert(v.end(), a, a + 2);
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 3);
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 3);
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_insert() {
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(3);
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.end(), X(1));
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.begin(), X(2));
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.insert(v.end(), X(66));
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 2);
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_emplace() {
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LIBCPP_HAS_NO_VARIADICS
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(3);
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.end(), X(1));
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.begin(), X(2));
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.emplace(v.end(), 42);
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 2);
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_HAS_NO_VARIADICS
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_insert_range2() {
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(4);
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.end(), X(1));
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.begin(), X(2));
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.capacity() >= 4);
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    char a[2] = {10, 42};
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.insert(v.begin(), a, a + 2);
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() <= 4);
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(is_contiguous_container_asan_correct(v));
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return;
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(0);
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_insert_n() {
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(10);
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.end(), X(1));
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.insert(v.begin(), X(2));
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 2);
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.insert(v.begin(), 1, X(66));
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() <= 3);
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(is_contiguous_container_asan_correct(v));
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return;
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(0);
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_insert_n2() {
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<ThrowOnCopy> v(10);
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(100);
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 10);
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v[6].should_throw = true;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.insert(v.cbegin(), 5, ThrowOnCopy());
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 11);
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(is_contiguous_container_asan_correct(v));
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return;
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(0);
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_resize() {
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(3);
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(0));
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.resize(3);
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 1);
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_resize_param() {
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::vector<X> v;
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.reserve(3);
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  v.push_back(X(0));
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  try {
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    v.resize(3, X(66));
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(0);
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } catch (int e) {
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(v.size() == 1);
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(v.size() == 1);
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  assert(is_contiguous_container_asan_correct(v));
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() {
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_push_back();
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_emplace_back();
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_insert_range();
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_insert();
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_emplace();
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_insert_range2();
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_insert_n();
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_insert_n2();
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_resize();
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  test_resize_param();
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
234