1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // REQUIRES: c++experimental 11 // UNSUPPORTED: c++98, c++03 12 13 // <experimental/memory_resource> 14 15 // template <class T> class polymorphic_allocator 16 17 // template <class U1, class U2> 18 // void polymorphic_allocator<T>::construct(pair<U1, U2>*) 19 20 #include <experimental/memory_resource> 21 #include <type_traits> 22 #include <utility> 23 #include <tuple> 24 #include <cassert> 25 #include <cstdlib> 26 #include "uses_alloc_types.hpp" 27 28 namespace ex = std::experimental::pmr; 29 30 int constructed = 0; 31 32 struct default_constructible 33 { 34 default_constructible() : x(42) { ++constructed; } 35 int x{0}; 36 }; 37 38 int main() 39 { 40 // pair<default_constructible, default_constructible> as T() 41 { 42 typedef default_constructible T; 43 typedef std::pair<T, T> P; 44 typedef ex::polymorphic_allocator<void> A; 45 P * ptr = (P*)std::malloc(sizeof(P)); 46 A a; 47 a.construct(ptr); 48 assert(constructed == 2); 49 assert(ptr->first.x == 42); 50 assert(ptr->second.x == 42); 51 std::free(ptr); 52 } 53 } 54