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