<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Eric<div class=""><br class=""></div><div class="">Thanks for the fix.  I just tested it and it works.</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Pete<br class=""><div><blockquote type="cite" class=""><div class="">On May 9, 2016, at 1:36 PM, Eric Fiselier <<a href="mailto:eric@efcs.ca" class="">eric@efcs.ca</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi Pete,<div class=""><br class=""></div><div class="">That's definitely of some use. Those test try to use the global resources very early/late in program startup/termination.</div><div class=""><br class=""></div><div class="">It would seem the global's aren't getting initialized as early as I had hoped. I believe this should be fixed when D19992 gets committed (<a href="http://reviews.llvm.org/D19992" class="">http://reviews.llvm.org/D19992</a>)</div><div class="">If possible could you try the patch, which requires re-building libc++experimental, at let me know if it works?</div><div class=""><br class=""></div><div class="">Otherwise I'll either disable the tests or commit a fix tonight.</div><div class=""><br class=""></div><div class="">Thanks</div><div class=""><br class=""></div><div class="">/Eric</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, May 9, 2016 at 2:02 PM, Pete Cooper <span dir="ltr" class=""><<a href="mailto:peter_cooper@apple.com" target="_blank" class="">peter_cooper@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">Hi Eric<div class=""><br class=""></div><div class="">We’ve getting a failure internally after this patch (we’re on ToT so I assume this is after r268839 too).</div><div class=""><br class=""></div><div class="">2 tests fail:</div><div class=""><div class="">    libc++ :: libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp</div><div class="">    libc++ :: libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp</div><div class=""><br class=""></div><div class="">I stepped through new_delete_resource_lifetime.pass.cpp to see whats going on.  All I got to was that we are in the global constructor for PODType, which calls allocate, which then crashes.</div><div class=""><br class=""></div><div class="">The stack trace is:</div><div class="">* thread #1: tid = 0x5ebc621, 0x0000000100000b94 new_delete_resource_lifetime.pass.cpp.exe`POSType::POSType() [inlined] std::experimental::fundamentals_v1::pmr::memory_resource::allocate(this=0x0000000100001198, __bytes=42, __align=16) + 3 at memory_resource:106, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x10)<br class="">  * frame #0: 0x0000000100000b94 new_delete_resource_lifetime.pass.cpp.exe`POSType::POSType() [inlined] std::experimental::fundamentals_v1::pmr::memory_resource::allocate(this=0x0000000100001198, __bytes=42, __align=16) + 3 at memory_resource:106<br class="">    frame #1: 0x0000000100000b91 new_delete_resource_lifetime.pass.cpp.exe`POSType::POSType(this=0x0000000100001160) + 81 at new_delete_resource_lifetime.pass.cpp:31<br class="">    frame #2: 0x0000000100000ad5 new_delete_resource_lifetime.pass.cpp.exe`POSType::POSType(this=0x0000000100001160) + 21 at new_delete_resource_lifetime.pass.cpp:31<br class="">    frame #3: 0x00000001000009b4 new_delete_resource_lifetime.pass.cpp.exe`::__cxx_global_var_init() + 20 at new_delete_resource_lifetime.pass.cpp:42<br class="">    frame #4: 0x0000000100000aa9 new_delete_resource_lifetime.pass.cpp.exe`_GLOBAL__sub_I_new_delete_resource_lifetime.pass.cpp + 9 at new_delete_resource_lifetime.pass.cpp:0</div><div class=""><br class=""></div><div class="">And from the disassembly, it looks like we have successfully constructed constructed ‘res’ in this line:</div><div class="">  POSType() {res = ex::new_delete_resource(); ptr = res->allocate(42); n = 42; }</div><div class=""><br class=""></div><div class="">We then load from ‘res' which works, but then loading from 16 bytes in to that data fails.  From the disassembly:</div><div class=""><br class=""></div><div class="">    0x100000b40 <+0>:   pushq  %rbp<br class="">    0x100000b41 <+1>:   movq   %rsp, %rbp<br class="">    0x100000b44 <+4>:   subq   $0x30, %rsp<br class="">    0x100000b48 <+8>:   movq   %rdi, -0x20(%rbp)<br class="">    0x100000b4c <+12>:  movq   -0x20(%rbp), %rdi<br class="">    0x100000b50 <+16>:  movq   $0x0, (%rdi)<br class="">    0x100000b57 <+23>:  movq   $0x0, 0x8(%rdi)<br class="">    0x100000b5f <+31>:  movl   $0x0, 0x10(%rdi)<br class="">    0x100000b66 <+38>:  movq   %rdi, -0x28(%rbp)<br class="">    0x100000b6a <+42>:  callq  0x100000cc0               ; std::experimental::fundamentals_v1::pmr::new_delete_resource()</div><div class="">// $rax is now ‘res'<br class="">    0x100000b6f <+47>:  movq   -0x28(%rbp), %rdi<br class="">    0x100000b73 <+51>:  movq   %rax, (%rdi)<br class="">    0x100000b76 <+54>:  movq   (%rdi), %rax<br class="">    0x100000b79 <+57>:  movq   %rax, -0x8(%rbp)<br class="">    0x100000b7d <+61>:  movq   $0x2a, -0x10(%rbp)<br class="">    0x100000b85 <+69>:  movq   $0x10, -0x18(%rbp)<br class="">    0x100000b8d <+77>:  movq   -0x8(%rbp), %rax<br class="">// $rax is again ‘res'<br class="">    0x100000b91 <+81>:  movq   (%rax), %rcx<br class="">// $rcx is *res which is possibly the base address of a vtable<br class="">->  0x100000b94 <+84>:  movq   0x10(%rcx), %rcx</div><div class="">// But the above line crashes as $rcx is null<br class="">    0x100000b98 <+88>:  movq   -0x10(%rbp), %rsi<br class="">    0x100000b9c <+92>:  movq   -0x18(%rbp), %rdx<br class="">    0x100000ba0 <+96>:  movq   %rax, %rdi<br class="">    0x100000ba3 <+99>:  callq  *%rcx<br class="">    0x100000ba5 <+101>: movq   -0x28(%rbp), %rcx<br class="">    0x100000ba9 <+105>: movq   %rax, 0x8(%rcx)<br class="">    0x100000bad <+109>: movl   $0x2a, 0x10(%rcx)<br class="">    0x100000bb4 <+116>: addq   $0x30, %rsp<br class="">    0x100000bb8 <+120>: popq   %rbp<br class="">    0x100000bb9 <+121>: retq   <br class="">    0x100000bba <+122>: nopw   (%rax,%rax)</div><div class=""><br class=""></div><div class="">I hope some of this is of use.  If its difficult to fix, would it be possible to disable these tests, until you have a fix available?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Pete</div><div class=""><blockquote type="cite" class=""><div class="">On May 6, 2016, at 7:40 PM, Eric Fiselier via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class="">Sorry about that. Fixed in r268839.</div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Fri, May 6, 2016 at 8:32 PM, Vitaly Buka <span dir="ltr" class=""><<a href="mailto:vitalybuka@google.com" target="_blank" class="">vitalybuka@google.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class=""><a href="http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-debian-noexceptions/builds/198/" target="_blank" class="">http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-debian-noexceptions/builds/198/</a> is broken because of this patch<br class=""></div><div class=""><div class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Fri, May 6, 2016 at 6:10 PM Eric Fiselier via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ericwf<br class="">
Date: Fri May  6 20:04:55 2016<br class="">
New Revision: 268829<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=268829&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=268829&view=rev</a><br class="">
Log:<br class="">
Add <experimental/memory_resource><br class="">
<br class="">
Reviewers: mclow.lists, EricWF<br class="">
<br class="">
Subscribers: cfe-commits<br class="">
<br class="">
Differential Revision: <a href="http://reviews.llvm.org/D20007" rel="noreferrer" target="_blank" class="">http://reviews.llvm.org/D20007</a><br class="">
<br class="">
Added:<br class="">
    libcxx/trunk/include/experimental/__memory<br class="">
    libcxx/trunk/include/experimental/memory_resource<br class="">
    libcxx/trunk/src/experimental/memory_resource.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/<br class="">
    libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/allocate.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_const_lvalue_pair.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_rvalue.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_values.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_types.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/deallocate.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/destroy.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/resource.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/select_on_container_copy_construction.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.overview/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.overview/nothing_to_do.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/nothing_to_do.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/alloc_copy.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/alloc_move.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/default.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/do_allocate_and_deallocate.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/do_is_equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.overview/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.overview/overview.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.global/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.global/default_resource.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.global/new_delete_resource.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.global/null_memory_resource.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.synop/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource.synop/nothing_to_do.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/construct.fail.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/not_equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.overview/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.overview/nothing_to_do.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.priv/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.priv/protected_members.fail.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/allocate.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/deallocate.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/dtor.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/is_equal.pass.cpp<br class="">
    libcxx/trunk/test/std/experimental/memory/nothing_to_do.pass.cpp<br class="">
    libcxx/trunk/test/support/test_memory_resource.hpp<br class="">
    libcxx/trunk/test/support/type_id.h<br class="">
    libcxx/trunk/test/support/uses_alloc_types.hpp<br class="">
Removed:<br class="">
    libcxx/trunk/src/experimental/placeholder.cpp<br class="">
Modified:<br class="">
    libcxx/trunk/include/exception<br class="">
    libcxx/trunk/include/experimental/__config<br class="">
<br class="">
Modified: libcxx/trunk/include/exception<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/exception?rev=268829&r1=268828&r2=268829&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/exception?rev=268829&r1=268828&r2=268829&view=diff</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/include/exception (original)<br class="">
+++ libcxx/trunk/include/exception Fri May  6 20:04:55 2016<br class="">
@@ -80,6 +80,10 @@ template <class E> void rethrow_if_neste<br class="">
 #include <__config><br class="">
 #include <cstddef><br class="">
 #include <type_traits><br class="">
+#if defined(_LIBCPP_HAS_NO_EXCEPTIONS)<br class="">
+#include <cstdio><br class="">
+#include <cstdlib><br class="">
+#endif<br class="">
<br class="">
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)<br class="">
 #pragma GCC system_header<br class="">
@@ -251,4 +255,19 @@ rethrow_if_nested(const _Ep&, typename e<br class="">
<br class="">
 }  // std<br class="">
<br class="">
+_LIBCPP_BEGIN_NAMESPACE_STD<br class="">
+<br class="">
+template <class _Exception><br class="">
+_LIBCPP_INLINE_VISIBILITY<br class="">
+inline void __libcpp_throw(_Exception const& __e) {<br class="">
+#ifndef _LIBCPP_HAS_NO_EXCEPTIONS<br class="">
+    throw __e;<br class="">
+#else<br class="">
+    _VSTD::fprintf(stderr, "%s\n", __e.what());<br class="">
+    _VSTD::abort();<br class="">
+#endif<br class="">
+}<br class="">
+<br class="">
+_LIBCPP_END_NAMESPACE_STD<br class="">
+<br class="">
 #endif  // _LIBCPP_EXCEPTION<br class="">
<br class="">
Modified: libcxx/trunk/include/experimental/__config<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__config?rev=268829&r1=268828&r2=268829&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__config?rev=268829&r1=268828&r2=268829&view=diff</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/include/experimental/__config (original)<br class="">
+++ libcxx/trunk/include/experimental/__config Fri May  6 20:04:55 2016<br class="">
@@ -25,6 +25,10 @@<br class="">
 #define _LIBCPP_END_NAMESPACE_LFTS  } } }<br class="">
 #define _VSTD_LFTS _VSTD_EXPERIMENTAL::fundamentals_v1<br class="">
<br class="">
+#define _LIBCPP_BEGIN_NAMESPACE_LFTS_PMR _LIBCPP_BEGIN_NAMESPACE_LFTS namespace pmr {<br class="">
+#define _LIBCPP_END_NAMESPACE_LFTS_PMR _LIBCPP_END_NAMESPACE_LFTS }<br class="">
+#define _VSTD_LFTS_PMR _VSTD_LFTS::pmr<br class="">
+<br class="">
 #define _LIBCPP_BEGIN_NAMESPACE_CHRONO_LFTS _LIBCPP_BEGIN_NAMESPACE_STD        \<br class="">
   namespace chrono { namespace experimental { inline namespace fundamentals_v1 {<br class="">
 #define _LIBCPP_END_NAMESPACE_CHRONO_LFTS _LIBCPP_END_NAMESPACE_STD } } }<br class="">
<br class="">
Added: libcxx/trunk/include/experimental/__memory<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__memory?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__memory?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/include/experimental/__memory (added)<br class="">
+++ libcxx/trunk/include/experimental/__memory Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,90 @@<br class="">
+// -*- C++ -*-<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#ifndef _LIBCPP_EXPERIMENTAL___MEMORY<br class="">
+#define _LIBCPP_EXPERIMENTAL___MEMORY<br class="">
+<br class="">
+#include <experimental/__config><br class="">
+#include <experimental/utility> // for erased_type<br class="">
+#include <__functional_base><br class="">
+#include <type_traits><br class="">
+<br class="">
+_LIBCPP_BEGIN_NAMESPACE_LFTS<br class="">
+<br class="">
+template <<br class="">
+    class _Tp, class _Alloc<br class="">
+  , bool = uses_allocator<_Tp, _Alloc>::value<br class="">
+  , bool = __has_allocator_type<_Tp>::value<br class="">
+  ><br class="">
+struct __lfts_uses_allocator : public false_type {};<br class="">
+<br class="">
+template <class _Tp, class _Alloc><br class="">
+struct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public false_type {};<br class="">
+<br class="">
+template <class _Tp, class _Alloc, bool HasAlloc><br class="">
+struct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public true_type {};<br class="">
+<br class="">
+template <class _Tp, class _Alloc><br class="">
+struct __lfts_uses_allocator<_Tp, _Alloc, false, true><br class="">
+  : public integral_constant<bool<br class="">
+    , is_convertible<_Alloc, typename _Tp::allocator_type>::value<br class="">
+      || is_same<erased_type, typename _Tp::allocator_type>::value<br class="">
+    ><br class="">
+{};<br class="">
+<br class="">
+template <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args><br class="">
+struct __lfts_uses_alloc_ctor_imp<br class="">
+{<br class="">
+    static const int value = 0;<br class="">
+};<br class="">
+<br class="">
+template <class _Tp, class _Alloc, class ..._Args><br class="">
+struct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...><br class="">
+{<br class="">
+    static const bool __ic_first<br class="">
+        = is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;<br class="">
+<br class="">
+    static const bool __ic_second =<br class="">
+        conditional<<br class="">
+            __ic_first,<br class="">
+            false_type,<br class="">
+            is_constructible<_Tp, _Args..., _Alloc><br class="">
+        >::type::value;<br class="">
+<br class="">
+    static_assert(__ic_first || __ic_second,<br class="">
+                  "Request for uses allocator construction is ill-formed");<br class="">
+<br class="">
+    static const int value = __ic_first ? 1 : 2;<br class="">
+};<br class="">
+<br class="">
+template <class _Tp, class _Alloc, class ..._Args><br class="">
+struct __lfts_uses_alloc_ctor<br class="">
+  : integral_constant<int,<br class="">
+        __lfts_uses_alloc_ctor_imp<<br class="">
+            __lfts_uses_allocator<_Tp, _Alloc>::value<br class="">
+          , _Tp, _Alloc, _Args...<br class="">
+        >::value<br class="">
+    ><br class="">
+{};<br class="">
+<br class="">
+template <class _Tp, class _Alloc, class ..._Args><br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+void __lfts_user_alloc_construct(<br class="">
+    _Tp * __store, const _Alloc & __a, _Args &&... __args)<br class="">
+{<br class="">
+    _VSTD::__user_alloc_construct_impl(<br class="">
+        typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()<br class="">
+       , __store, __a, _VSTD::forward<_Args>(__args)...<br class="">
+       );<br class="">
+}<br class="">
+<br class="">
+_LIBCPP_END_NAMESPACE_LFTS<br class="">
+<br class="">
+#endif /* _LIBCPP_EXPERIMENTAL___MEMORY */<br class="">
<br class="">
Added: libcxx/trunk/include/experimental/memory_resource<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/memory_resource?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/memory_resource?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/include/experimental/memory_resource (added)<br class="">
+++ libcxx/trunk/include/experimental/memory_resource Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,422 @@<br class="">
+// -*- C++ -*-<br class="">
+//===------------------------ memory_resource -----------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is distributed under the University of Illinois Open Source<br class="">
+// License. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#ifndef _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE<br class="">
+#define _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE<br class="">
+<br class="">
+/**<br class="">
+    experimental/memory_resource synopsis<br class="">
+<br class="">
+// C++1y<br class="">
+<br class="">
+namespace std {<br class="">
+namespace experimental {<br class="">
+inline namespace fundamentals_v1 {<br class="">
+namespace pmr {<br class="">
+<br class="">
+  class memory_resource;<br class="">
+<br class="">
+  bool operator==(const memory_resource& a,<br class="">
+                  const memory_resource& b) noexcept;<br class="">
+  bool operator!=(const memory_resource& a,<br class="">
+                  const memory_resource& b) noexcept;<br class="">
+<br class="">
+  template <class Tp> class polymorphic_allocator;<br class="">
+<br class="">
+  template <class T1, class T2><br class="">
+  bool operator==(const polymorphic_allocator<T1>& a,<br class="">
+                  const polymorphic_allocator<T2>& b) noexcept;<br class="">
+  template <class T1, class T2><br class="">
+  bool operator!=(const polymorphic_allocator<T1>& a,<br class="">
+                  const polymorphic_allocator<T2>& b) noexcept;<br class="">
+<br class="">
+  // The name resource_adaptor_imp is for exposition only.<br class="">
+  template <class Allocator> class resource_adaptor_imp;<br class="">
+<br class="">
+  template <class Allocator><br class="">
+    using resource_adaptor = resource_adaptor_imp<<br class="">
+      allocator_traits<Allocator>::rebind_alloc<char>>;<br class="">
+<br class="">
+  // Global memory resources<br class="">
+  memory_resource* new_delete_resource() noexcept;<br class="">
+  memory_resource* null_memory_resource() noexcept;<br class="">
+<br class="">
+  // The default memory resource<br class="">
+  memory_resource* set_default_resource(memory_resource* r) noexcept;<br class="">
+  memory_resource* get_default_resource() noexcept;<br class="">
+<br class="">
+  // Standard memory resources<br class="">
+  struct pool_options;<br class="">
+  class synchronized_pool_resource;<br class="">
+  class unsynchronized_pool_resource;<br class="">
+  class monotonic_buffer_resource;<br class="">
+<br class="">
+} // namespace pmr<br class="">
+} // namespace fundamentals_v1<br class="">
+} // namespace experimental<br class="">
+} // namespace std<br class="">
+<br class="">
+ */<br class="">
+<br class="">
+#include <experimental/__config><br class="">
+#include <experimental/__memory><br class="">
+#include <limits><br class="">
+#include <memory><br class="">
+#include <new><br class="">
+#include <stdexcept><br class="">
+#include <tuple><br class="">
+#include <type_traits><br class="">
+#include <utility><br class="">
+#include <cstddef><br class="">
+#include <cstdlib><br class="">
+#include <__debug><br class="">
+<br class="">
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)<br class="">
+#pragma GCC system_header<br class="">
+#endif<br class="">
+<br class="">
+_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR<br class="">
+<br class="">
+// Round __s up to next multiple of __a.<br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+size_t __aligned_allocation_size(size_t __s, size_t __a) _NOEXCEPT<br class="">
+{<br class="">
+    _LIBCPP_ASSERT(__s + __a > __s, "aligned allocation size overflows");<br class="">
+    return (__s + __a - 1) & ~(__a - 1);<br class="">
+}<br class="">
+<br class="">
+// 8.5, memory.resource<br class="">
+class _LIBCPP_TYPE_VIS_ONLY memory_resource<br class="">
+{<br class="">
+    static const size_t __max_align = alignof(max_align_t);<br class="">
+<br class="">
+// 8.5.2, memory.resource.public<br class="">
+public:<br class="">
+    virtual ~memory_resource() = default;<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void* allocate(size_t __bytes, size_t __align = __max_align)<br class="">
+        { return do_allocate(__bytes, __align); }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void deallocate(void * __p, size_t __bytes, size_t __align = __max_align)<br class="">
+        { do_deallocate(__p, __bytes, __align); }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    bool is_equal(memory_resource const & __other) const _NOEXCEPT<br class="">
+        { return do_is_equal(__other); }<br class="">
+<br class="">
+// 8.5.3, memory.resource.priv<br class="">
+protected:<br class="">
+    virtual void* do_allocate(size_t, size_t) = 0;<br class="">
+    virtual void do_deallocate(void*, size_t, size_t) = 0;<br class="">
+    virtual bool do_is_equal(memory_resource const &) const _NOEXCEPT = 0;<br class="">
+};<br class="">
+<br class="">
+// 8.5.4, memory.resource.eq<br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+bool operator==(memory_resource const & __lhs,<br class="">
+                memory_resource const & __rhs) _NOEXCEPT<br class="">
+{<br class="">
+    return &__lhs == &__rhs || __lhs.is_equal(__rhs);<br class="">
+}<br class="">
+<br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+bool operator!=(memory_resource const & __lhs,<br class="">
+                memory_resource const & __rhs) _NOEXCEPT<br class="">
+{<br class="">
+    return !(__lhs == __rhs);<br class="">
+}<br class="">
+<br class="">
+_LIBCPP_FUNC_VIS<br class="">
+memory_resource * new_delete_resource() _NOEXCEPT;<br class="">
+<br class="">
+_LIBCPP_FUNC_VIS<br class="">
+memory_resource * null_memory_resource() _NOEXCEPT;<br class="">
+<br class="">
+_LIBCPP_FUNC_VIS<br class="">
+memory_resource * get_default_resource() _NOEXCEPT;<br class="">
+<br class="">
+_LIBCPP_FUNC_VIS<br class="">
+memory_resource * set_default_resource(memory_resource * __new_res) _NOEXCEPT;<br class="">
+<br class="">
+// 8.6, memory.polymorphic.allocator.class<br class="">
+<br class="">
+// 8.6.1, memory.polymorphic.allocator.overview<br class="">
+template <class _ValueType><br class="">
+class _LIBCPP_TYPE_VIS_ONLY polymorphic_allocator<br class="">
+{<br class="">
+public:<br class="">
+    typedef _ValueType value_type;<br class="">
+<br class="">
+    // 8.6.2, memory.polymorphic.allocator.ctor<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    polymorphic_allocator() _NOEXCEPT<br class="">
+      : __res_(_VSTD_LFTS_PMR::get_default_resource())<br class="">
+    {}<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    polymorphic_allocator(memory_resource * __r) _NOEXCEPT<br class="">
+      : __res_(__r)<br class="">
+    {}<br class="">
+<br class="">
+    polymorphic_allocator(polymorphic_allocator const &) = default;<br class="">
+<br class="">
+    template <class _Tp><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    polymorphic_allocator(polymorphic_allocator<_Tp> const & __other) _NOEXCEPT<br class="">
+      : __res_(__other.resource())<br class="">
+    {}<br class="">
+<br class="">
+    polymorphic_allocator &<br class="">
+    operator=(polymorphic_allocator const &) = default;<br class="">
+<br class="">
+    // 8.6.3, memory.polymorphic.allocator.mem<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    _ValueType* allocate(size_t __n) {<br class="">
+        if (__n > max_size()) {<br class="">
+            __libcpp_throw(length_error(<br class="">
+                "std::experimental::pmr::polymorphic_allocator<T>::allocate(size_t n)"<br class="">
+                " 'n' exceeds maximum supported size"));<br class="">
+        }<br class="">
+        return static_cast<_ValueType*>(<br class="">
+            __res_->allocate(__n * sizeof(_ValueType), alignof(_ValueType))<br class="">
+        );<br class="">
+    }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void deallocate(_ValueType * __p, size_t __n) _NOEXCEPT {<br class="">
+        _LIBCPP_ASSERT(__n <= max_size(),<br class="">
+                       "deallocate called for size which exceeds max_size()");<br class="">
+        __res_->deallocate(__p, __n * sizeof(_ValueType), alignof(_ValueType));<br class="">
+    }<br class="">
+<br class="">
+    template <class _Tp, class ..._Ts><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(_Tp* __p, _Ts &&... __args)<br class="">
+    {<br class="">
+        _VSTD_LFTS::__lfts_user_alloc_construct(<br class="">
+            __p, resource(), _VSTD::forward<_Ts>(__args)...<br class="">
+          );<br class="">
+    }<br class="">
+<br class="">
+    template <class _T1, class _T2, class ..._Args1, class ..._Args2><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(pair<_T1, _T2>* __p, piecewise_construct_t,<br class="">
+                   tuple<_Args1...> __x, tuple<_Args2...> __y)<br class="">
+    {<br class="">
+        ::new ((void*)__p) pair<_T1, _T2>(piecewise_construct<br class="">
+          , __transform_tuple(<br class="">
+              typename __lfts_uses_alloc_ctor<<br class="">
+                  _T1, memory_resource*, _Args1...<br class="">
+              >::type()<br class="">
+            , _VSTD::move(__x)<br class="">
+            , typename __make_tuple_indices<sizeof...(_Args1)>::type{}<br class="">
+          )<br class="">
+          , __transform_tuple(<br class="">
+              typename __lfts_uses_alloc_ctor<<br class="">
+                  _T2, memory_resource*, _Args2...<br class="">
+              >::type()<br class="">
+            , _VSTD::move(__y)<br class="">
+            , typename __make_tuple_indices<sizeof...(_Args2)>::type{}<br class="">
+          )<br class="">
+        );<br class="">
+    }<br class="">
+<br class="">
+    template <class _T1, class _T2><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(pair<_T1, _T2>* __p) {<br class="">
+        construct(__p, piecewise_construct, tuple<>(), tuple<>());<br class="">
+    }<br class="">
+<br class="">
+    template <class _T1, class _T2, class _Up, class _Vp><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(pair<_T1, _T2> * __p, _Up && __u, _Vp && __v) {<br class="">
+        construct(__p, piecewise_construct<br class="">
+          , _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__u))<br class="">
+          , _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__v)));<br class="">
+    }<br class="">
+<br class="">
+    template <class _T1, class _T2, class _U1, class _U2><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> const & __pr) {<br class="">
+        construct(__p, piecewise_construct<br class="">
+            , _VSTD::forward_as_tuple(__pr.first)<br class="">
+            , _VSTD::forward_as_tuple(__pr.second));<br class="">
+    }<br class="">
+<br class="">
+    template <class _T1, class _T2, class _U1, class _U2><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> && __pr){<br class="">
+        construct(__p, piecewise_construct<br class="">
+            , _VSTD::forward_as_tuple(_VSTD::forward<_U1>(__pr.first))<br class="">
+            , _VSTD::forward_as_tuple(_VSTD::forward<_U2>(__pr.second)));<br class="">
+    }<br class="">
+<br class="">
+    template <class _Tp><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    void destroy(_Tp * __p) _NOEXCEPT<br class="">
+        { __p->~_Tp(); }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    size_t max_size() const _NOEXCEPT<br class="">
+        { return numeric_limits<size_t>::max() / sizeof(value_type); }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    polymorphic_allocator<br class="">
+    select_on_container_copy_construction() const _NOEXCEPT<br class="">
+        { return polymorphic_allocator(); }<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    memory_resource * resource() const _NOEXCEPT<br class="">
+        { return __res_; }<br class="">
+<br class="">
+private:<br class="">
+    template <class ..._Args, size_t ..._Idx><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    tuple<_Args&&...><br class="">
+    __transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,<br class="">
+                      __tuple_indices<_Idx...>) const<br class="">
+    {<br class="">
+        return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);<br class="">
+    }<br class="">
+<br class="">
+    template <class ..._Args, size_t ..._Idx><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    tuple<allocator_arg_t const&, memory_resource*, _Args&&...><br class="">
+    __transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,<br class="">
+                      __tuple_indices<_Idx...>) const<br class="">
+    {<br class="">
+        using _Tup = tuple<allocator_arg_t const&, memory_resource*, _Args&&...>;<br class="">
+        return _Tup(allocator_arg, resource(),<br class="">
+                    _VSTD::get<_Idx>(_VSTD::move(__t))...);<br class="">
+    }<br class="">
+<br class="">
+    template <class ..._Args, size_t ..._Idx><br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    tuple<_Args&&..., memory_resource*><br class="">
+    __transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,<br class="">
+                      __tuple_indices<_Idx...>) const<br class="">
+    {<br class="">
+        using _Tup = tuple<_Args&&..., memory_resource*>;<br class="">
+        return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., resource());<br class="">
+    }<br class="">
+<br class="">
+    memory_resource * __res_;<br class="">
+};<br class="">
+<br class="">
+// 8.6.4, memory.polymorphic.allocator.eq<br class="">
+<br class="">
+template <class _Tp, class _Up><br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+bool operator==(polymorphic_allocator<_Tp> const & __lhs,<br class="">
+                polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT<br class="">
+{<br class="">
+    return *__lhs.resource() == *__rhs.resource();<br class="">
+}<br class="">
+<br class="">
+template <class _Tp, class _Up><br class="">
+inline _LIBCPP_INLINE_VISIBILITY<br class="">
+bool operator!=(polymorphic_allocator<_Tp> const & __lhs,<br class="">
+                polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT<br class="">
+{<br class="">
+    return !(__lhs == __rhs);<br class="">
+}<br class="">
+<br class="">
+// 8.7, memory.resource.adaptor<br class="">
+<br class="">
+// 8.7.1, memory.resource.adaptor.overview<br class="">
+template <class _CharAlloc><br class="">
+class _LIBCPP_TYPE_VIS_ONLY __resource_adaptor_imp<br class="">
+  : public memory_resource<br class="">
+{<br class="">
+    using _CTraits = allocator_traits<_CharAlloc>;<br class="">
+    static_assert(is_same<typename _CTraits::value_type, char>::value<br class="">
+               && is_same<typename _CTraits::pointer, char*>::value<br class="">
+               && is_same<typename _CTraits::void_pointer, void*>::value, "");<br class="">
+<br class="">
+    static const size_t _MaxAlign = alignof(max_align_t);<br class="">
+<br class="">
+    using _Alloc = typename _CTraits::template rebind_alloc<<br class="">
+            typename aligned_storage<_MaxAlign, _MaxAlign>::type<br class="">
+        >;<br class="">
+<br class="">
+    using _ValueType = typename _Alloc::value_type;<br class="">
+<br class="">
+    _Alloc __alloc_;<br class="">
+<br class="">
+public:<br class="">
+    typedef _CharAlloc allocator_type;<br class="">
+<br class="">
+    __resource_adaptor_imp() = default;<br class="">
+    __resource_adaptor_imp(__resource_adaptor_imp const &) = default;<br class="">
+    __resource_adaptor_imp(__resource_adaptor_imp &&) = default;<br class="">
+<br class="">
+    // 8.7.2, memory.resource.adaptor.ctor<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    explicit __resource_adaptor_imp(allocator_type const & __a)<br class="">
+      : __alloc_(__a)<br class="">
+    {}<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    explicit __resource_adaptor_imp(allocator_type && __a)<br class="">
+      : __alloc_(_VSTD::move(__a))<br class="">
+    {}<br class="">
+<br class="">
+    __resource_adaptor_imp &<br class="">
+    operator=(__resource_adaptor_imp const &) = default;<br class="">
+<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    allocator_type get_allocator() const<br class="">
+    { return __alloc_; }<br class="">
+<br class="">
+// 8.7.3, memory.resource.adaptor.mem<br class="">
+protected:<br class="">
+    virtual void * do_allocate(size_t __bytes, size_t)<br class="">
+    {<br class="">
+        if (__bytes > __max_size()) {<br class="">
+            __libcpp_throw(length_error(<br class="">
+                "std::experimental::pmr::resource_adaptor<T>::do_allocate(size_t bytes, size_t align)"<br class="">
+                " 'bytes' exceeds maximum supported size"));<br class="">
+        }<br class="">
+        size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;<br class="">
+        return __alloc_.allocate(__s);<br class="">
+    }<br class="">
+<br class="">
+    virtual void do_deallocate(void * __p, size_t __bytes, size_t)<br class="">
+    {<br class="">
+        _LIBCPP_ASSERT(__bytes <= __max_size(),<br class="">
+            "do_deallocate called for size which exceeds the maximum allocation size");<br class="">
+        size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;<br class="">
+        __alloc_.deallocate((_ValueType*)__p, __s);<br class="">
+    }<br class="">
+<br class="">
+    virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT {<br class="">
+        __resource_adaptor_imp const * __p<br class="">
+          = dynamic_cast<__resource_adaptor_imp const *>(&__other);<br class="">
+        return __p  ? __alloc_ == __p->__alloc_ : false;<br class="">
+    }<br class="">
+<br class="">
+private:<br class="">
+    _LIBCPP_INLINE_VISIBILITY<br class="">
+    size_t __max_size() const _NOEXCEPT {<br class="">
+        return numeric_limits<size_t>::max() - _MaxAlign;<br class="">
+    }<br class="">
+};<br class="">
+<br class="">
+template <class _Alloc><br class="">
+using resource_adaptor = __resource_adaptor_imp<<br class="">
+    typename allocator_traits<_Alloc>::template rebind_alloc<char><br class="">
+  >;<br class="">
+<br class="">
+_LIBCPP_END_NAMESPACE_LFTS_PMR<br class="">
+<br class="">
+#endif /* _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE */<br class="">
<br class="">
Added: libcxx/trunk/src/experimental/memory_resource.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/memory_resource.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/memory_resource.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/src/experimental/memory_resource.cpp (added)<br class="">
+++ libcxx/trunk/src/experimental/memory_resource.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,129 @@<br class="">
+//===------------------------ memory_resource.cpp -------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#include "experimental/memory_resource"<br class="">
+<br class="">
+#ifndef _LIBCPP_HAS_NO_ATOMIC_HEADER<br class="">
+#include "atomic"<br class="">
+#else<br class="">
+#include "mutex"<br class="">
+#endif<br class="">
+<br class="">
+_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR<br class="">
+<br class="">
+// memory_resource<br class="">
+<br class="">
+//memory_resource::~memory_resource() {}<br class="">
+<br class="">
+// new_delete_resource()<br class="">
+<br class="">
+class _LIBCPP_TYPE_VIS_ONLY __new_delete_memory_resource_imp<br class="">
+    : public memory_resource<br class="">
+{<br class="">
+public:<br class="">
+    ~__new_delete_memory_resource_imp() = default;<br class="">
+<br class="">
+protected:<br class="">
+    virtual void* do_allocate(size_t __size, size_t __align)<br class="">
+        { return __allocate(__size); }<br class="">
+<br class="">
+    virtual void do_deallocate(void * __p, size_t, size_t)<br class="">
+        { __deallocate(__p); }<br class="">
+<br class="">
+    virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT<br class="">
+        { return &__other == this; }<br class="">
+};<br class="">
+<br class="">
+// null_memory_resource()<br class="">
+<br class="">
+class _LIBCPP_TYPE_VIS_ONLY __null_memory_resource_imp<br class="">
+    : public memory_resource<br class="">
+{<br class="">
+public:<br class="">
+    ~__null_memory_resource_imp() = default;<br class="">
+<br class="">
+protected:<br class="">
+    virtual void* do_allocate(size_t, size_t) {<br class="">
+#ifndef _LIBCPP_HAS_NO_EXCEPTIONS<br class="">
+        throw std::bad_alloc();<br class="">
+#else<br class="">
+        abort();<br class="">
+#endif<br class="">
+    }<br class="">
+    virtual void do_deallocate(void *, size_t, size_t) {}<br class="">
+    virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT<br class="">
+    { return &__other == this; }<br class="">
+};<br class="">
+<br class="">
+union ResourceInitHelper {<br class="">
+  struct {<br class="">
+    __new_delete_memory_resource_imp new_delete_res;<br class="">
+    __null_memory_resource_imp       null_res;<br class="">
+  } resources;<br class="">
+  char dummy;<br class="">
+  _LIBCPP_CONSTEXPR_AFTER_CXX11 ResourceInitHelper() : resources() {}<br class="">
+  ~ResourceInitHelper() {}<br class="">
+};<br class="">
+// When compiled in C++14 this initialization should be a constant expression.<br class="">
+// Only in C++11 is "init_priority" needed to ensure initialization order.<br class="">
+ResourceInitHelper res_init __attribute__((init_priority (101)));<br class="">
+<br class="">
+memory_resource * new_delete_resource() _NOEXCEPT {<br class="">
+    return &res_init.resources.new_delete_res;<br class="">
+}<br class="">
+<br class="">
+memory_resource * null_memory_resource() _NOEXCEPT {<br class="">
+    return &res_init.resources.null_res;<br class="">
+}<br class="">
+<br class="">
+// default_memory_resource()<br class="">
+<br class="">
+static memory_resource *<br class="">
+__default_memory_resource(bool set = false, memory_resource * new_res = nullptr) _NOEXCEPT<br class="">
+{<br class="">
+#ifndef _LIBCPP_HAS_NO_ATOMIC_HEADER<br class="">
+    static atomic<memory_resource*> __res =<br class="">
+        ATOMIC_VAR_INIT(&res_init.resources.new_delete_res);<br class="">
+    if (set) {<br class="">
+        new_res = new_res ? new_res : new_delete_resource();<br class="">
+        // TODO: Can a weaker ordering be used?<br class="">
+        return _VSTD::atomic_exchange_explicit(<br class="">
+            &__res, new_res, memory_order::memory_order_acq_rel);<br class="">
+    }<br class="">
+    else {<br class="">
+        return _VSTD::atomic_load_explicit(<br class="">
+            &__res, memory_order::memory_order_acquire);<br class="">
+    }<br class="">
+#else<br class="">
+    static memory_resource * res = &res_init.resources.new_delete_res;<br class="">
+    static mutex res_lock;<br class="">
+    if (set) {<br class="">
+        new_res = new_res ? new_res : new_delete_resource();<br class="">
+        lock_guard<mutex> guard(res_lock);<br class="">
+        memory_resource * old_res = res;<br class="">
+        res = new_res;<br class="">
+        return old_res;<br class="">
+    } else {<br class="">
+        lock_guard<mutex> guard(res_lock);<br class="">
+        return res;<br class="">
+    }<br class="">
+#endif<br class="">
+}<br class="">
+<br class="">
+memory_resource * get_default_resource() _NOEXCEPT<br class="">
+{<br class="">
+    return __default_memory_resource();<br class="">
+}<br class="">
+<br class="">
+memory_resource * set_default_resource(memory_resource * __new_res) _NOEXCEPT<br class="">
+{<br class="">
+    return __default_memory_resource(true, __new_res);<br class="">
+}<br class="">
+<br class="">
+_LIBCPP_END_NAMESPACE_LFTS_PMR<br class="">
\ No newline at end of file<br class="">
<br class="">
Removed: libcxx/trunk/src/experimental/placeholder.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/placeholder.cpp?rev=268828&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/placeholder.cpp?rev=268828&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/src/experimental/placeholder.cpp (original)<br class="">
+++ libcxx/trunk/src/experimental/placeholder.cpp (removed)<br class="">
@@ -1,14 +0,0 @@<br class="">
-//===--------------------------- TODO.cpp ---------------------------------===//<br class="">
-//<br class="">
-//                     The LLVM Compiler Infrastructure<br class="">
-//<br class="">
-// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
-// Source Licenses. See LICENSE.TXT for details.<br class="">
-//<br class="">
-//===----------------------------------------------------------------------===//<br class="">
-<br class="">
-#include "experimental/__config"<br class="">
-<br class="">
-_LIBCPP_BEGIN_NAMESPACE_LFTS<br class="">
-<br class="">
-_LIBCPP_END_NAMESPACE_LFTS<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,178 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// template <class U1, class U2, class ...Args1, class ...Args2><br class="">
+// void polymorphic_allocator<T>::construct(pair<T1, T2>*, piecewise_construct_t<br class="">
+//                                          tuple<Args1...> x, tuple<Args2...>)<br class="">
+<br class="">
+// The stardard specifiers a tranformation to uses-allocator construction as<br class="">
+// follows:<br class="">
+//  - If uses_allocator_v<T1,memory_resource*> is false and<br class="">
+//      is_constructible_v<T,Args1...> is true, then xprime is x.<br class="">
+//  - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and<br class="">
+//      is_constructible_v<T1,allocator_arg_t,memory_resource*,Args1...> is true,<br class="">
+//      then xprime is<br class="">
+//      tuple_cat(make_tuple(allocator_arg, this->resource()), std::move(x)).<br class="">
+//  - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and<br class="">
+//      is_constructible_v<T1,Args1...,memory_resource*> is true, then xprime is<br class="">
+//      tuple_cat(std::move(x), make_tuple(this->resource())).<br class="">
+//  - Otherwise the program is ill formed.<br class="">
+//<br class="">
+// The use of "xprime = tuple_cat(..., std::move(x), ...)" causes all of the<br class="">
+// objects in 'x' to be copied into 'xprime'. If 'x' contains any types which<br class="">
+// are stored by value this causes an unessary copy to occur. To prevent this<br class="">
+//  libc++ changes this call into<br class="">
+// "xprime = forward_as_tuple(..., std::get<Idx>(std::move(x))..., ...)".<br class="">
+// 'xprime' contains references to the values in 'x' instead of copying them.<br class="">
+<br class="">
+// This test checks the number of copies incurred to the elements in<br class="">
+// 'tuple<Args1...>' and 'tuple<Args2...>'.<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <utility><br class="">
+#include <tuple><br class="">
+#include <cassert><br class="">
+#include <cstdlib><br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+template <class T><br class="">
+struct TestHarness {<br class="">
+    TestResource R;<br class="">
+    ex::memory_resource * M = &R;<br class="">
+    ex::polymorphic_allocator<T> A = M;<br class="">
+    bool constructed = false;<br class="">
+    T * ptr;<br class="">
+<br class="">
+    TestHarness() : ptr(A.allocate(1)) {}<br class="">
+<br class="">
+    template <class ...Args><br class="">
+    void construct(Args&&... args) {<br class="">
+        A.construct(ptr, std::forward<Args>(args)...);<br class="">
+        constructed = true;<br class="">
+    }<br class="">
+<br class="">
+    ~TestHarness() {<br class="">
+        if (constructed) A.destroy(ptr);<br class="">
+        A.deallocate(ptr, 1);<br class="">
+    }<br class="">
+};<br class="">
+<br class="">
+struct CountCopies {<br class="">
+  int count;<br class="">
+  CountCopies() : count(0) {}<br class="">
+  CountCopies(CountCopies const& o) : count(o.count + 1) {}<br class="">
+};<br class="">
+<br class="">
+struct CountCopiesAllocV1 {<br class="">
+  typedef ex::memory_resource* allocator_type;<br class="">
+  allocator_type alloc;<br class="">
+  int count;<br class="">
+  CountCopiesAllocV1() : alloc(nullptr), count(0) {}<br class="">
+  CountCopiesAllocV1(std::allocator_arg_t, allocator_type const& a,<br class="">
+                     CountCopiesAllocV1 const& o) : alloc(a), count(o.count + 1)<br class="">
+  {}<br class="">
+<br class="">
+  CountCopiesAllocV1(CountCopiesAllocV1 const& o) : count(o.count + 1) {}<br class="">
+};<br class="">
+<br class="">
+<br class="">
+struct CountCopiesAllocV2 {<br class="">
+  typedef ex::memory_resource* allocator_type;<br class="">
+  allocator_type alloc;<br class="">
+  int count;<br class="">
+  CountCopiesAllocV2() : alloc(nullptr), count(0) {}<br class="">
+  CountCopiesAllocV2(CountCopiesAllocV2 const& o, allocator_type const& a)<br class="">
+    : alloc(a), count(o.count + 1)<br class="">
+  { }<br class="">
+<br class="">
+  CountCopiesAllocV2(CountCopiesAllocV2 const& o) : count(o.count + 1) {}<br class="">
+};<br class="">
+<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    using PMR = ex::memory_resource*;<br class="">
+    using PMA = ex::polymorphic_allocator<char>;<br class="">
+<br class="">
+    {<br class="">
+        using T = CountCopies;<br class="">
+        using U = CountCopiesAllocV1;<br class="">
+        using P = std::pair<T, U>;<br class="">
+        using TH = TestHarness<P>;<br class="">
+<br class="">
+        std::tuple<T> t1;<br class="">
+        std::tuple<U> t2;<br class="">
+<br class="">
+        TestHarness<P> h;<br class="">
+        h.construct(std::piecewise_construct, t1, t2);<br class="">
+        P const& p = *h.ptr;<br class="">
+        assert(p.first.count == 2);<br class="">
+        assert(p.second.count == 2);<br class="">
+        assert(p.second.alloc == h.M);<br class="">
+    }<br class="">
+    {<br class="">
+        using T = CountCopiesAllocV1;<br class="">
+        using U = CountCopiesAllocV2;<br class="">
+        using P = std::pair<T, U>;<br class="">
+        using TH = TestHarness<P>;<br class="">
+<br class="">
+        std::tuple<T> t1;<br class="">
+        std::tuple<U> t2;<br class="">
+<br class="">
+        TestHarness<P> h;<br class="">
+        h.construct(std::piecewise_construct, std::move(t1), std::move(t2));<br class="">
+        P const& p = *h.ptr;<br class="">
+        assert(p.first.count == 2);<br class="">
+        assert(p.first.alloc == h.M);<br class="">
+        assert(p.second.count == 2);<br class="">
+        assert(p.second.alloc == h.M);<br class="">
+    }<br class="">
+    {<br class="">
+        using T = CountCopiesAllocV2;<br class="">
+        using U = CountCopiesAllocV1;<br class="">
+        using P = std::pair<T, U>;<br class="">
+        using TH = TestHarness<P>;<br class="">
+<br class="">
+        std::tuple<T> t1;<br class="">
+        std::tuple<U> t2;<br class="">
+<br class="">
+        TestHarness<P> h;<br class="">
+        h.construct(std::piecewise_construct, std::move(t1), std::move(t2));<br class="">
+        P const& p = *h.ptr;<br class="">
+        assert(p.first.count == 2);<br class="">
+        assert(p.first.alloc == h.M);<br class="">
+        assert(p.second.count == 2);<br class="">
+        assert(p.second.alloc == h.M);<br class="">
+    }<br class="">
+    {<br class="">
+        using T = CountCopiesAllocV2;<br class="">
+        using U = CountCopies;<br class="">
+        using P = std::pair<T, U>;<br class="">
+        using TH = TestHarness<P>;<br class="">
+<br class="">
+        std::tuple<T> t1;<br class="">
+        std::tuple<U> t2;<br class="">
+<br class="">
+        TestHarness<P> h;<br class="">
+        h.construct(std::piecewise_construct, t1, t2);<br class="">
+        P const& p = *h.ptr;<br class="">
+        assert(p.first.count == 2);<br class="">
+        assert(p.first.alloc == h.M);<br class="">
+        assert(p.second.count == 2);<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,42 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// T* polymorphic_allocator<T>::deallocate(T*, size_t size)<br class="">
+<br class="">
+int AssertCount = 0;<br class="">
+<br class="">
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (void)::AssertCount++)<br class="">
+#define _LIBCPP_DEBUG 0<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    using Alloc = ex::polymorphic_allocator<int>;<br class="">
+    using Traits = std::allocator_traits<Alloc>;<br class="">
+    NullResource R;<br class="">
+    Alloc a(&R);<br class="">
+    const std::size_t maxSize = Traits::max_size(a);<br class="">
+<br class="">
+    a.deallocate(nullptr, maxSize);<br class="">
+    assert(AssertCount == 0);<br class="">
+    a.deallocate(nullptr, maxSize + 1);<br class="">
+    assert(AssertCount == 1);<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,64 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// EXTENSION<br class="">
+// std::size_t polymorphic_allocator<T>::max_size() const noexcept<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+template <std::size_t S><br class="">
+std::size_t getMaxSize() {<br class="">
+    using T = typename std::aligned_storage<S>::type;<br class="">
+    static_assert(sizeof(T) == S, "Required for test");<br class="">
+    return ex::polymorphic_allocator<T>{}.max_size();<br class="">
+}<br class="">
+<br class="">
+template <std::size_t S, std::size_t A><br class="">
+std::size_t getMaxSize() {<br class="">
+    using T = typename std::aligned_storage<S, A>::type;<br class="">
+    static_assert(sizeof(T) == S, "Required for test");<br class="">
+    return ex::polymorphic_allocator<T>{}.max_size();<br class="">
+}<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    {<br class="">
+        using Alloc = ex::polymorphic_allocator<int>;<br class="">
+        using Traits = std::allocator_traits<Alloc>;<br class="">
+        const Alloc a;<br class="">
+        static_assert(std::is_same<decltype(a.max_size()), Traits::size_type>::value, "");<br class="">
+        static_assert(noexcept(a.max_size()), "");<br class="">
+    }<br class="">
+    {<br class="">
+        constexpr std::size_t Max = std::numeric_limits<std::size_t>::max();<br class="">
+        assert(getMaxSize<1>()    == Max);<br class="">
+        assert(getMaxSize<2>()    == Max / 2);<br class="">
+        assert(getMaxSize<4>()    == Max / 4);<br class="">
+        assert(getMaxSize<8>()    == Max / 8);<br class="">
+        assert(getMaxSize<16>()   == Max / 16);<br class="">
+        assert(getMaxSize<32>()   == Max / 32);<br class="">
+        assert(getMaxSize<64>()   == Max / 64);<br class="">
+        assert(getMaxSize<1024>() == Max / 1024);<br class="">
+<br class="">
+        assert((getMaxSize<6,  2>() == Max / 6));<br class="">
+        assert((getMaxSize<12, 4>() == Max / 12));<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,45 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// T* polymorphic_allocator<T>::deallocate(T*, size_t size)<br class="">
+<br class="">
+int AssertCount = 0;<br class="">
+<br class="">
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (void)::AssertCount++)<br class="">
+#define _LIBCPP_DEBUG 0<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    using Alloc = NullAllocator<char>;<br class="">
+    using R = ex::resource_adaptor<Alloc>;<br class="">
+    AllocController P;<br class="">
+    ex::resource_adaptor<Alloc> r(Alloc{P});<br class="">
+    ex::memory_resource & m1 = r;<br class="">
+<br class="">
+    std::size_t maxSize = std::numeric_limits<std::size_t>::max()<br class="">
+                            - alignof(std::max_align_t);<br class="">
+<br class="">
+    m1.deallocate(nullptr, maxSize);<br class="">
+    assert(AssertCount == 0);<br class="">
+    m1.deallocate(nullptr, maxSize + 1);<br class="">
+    assert(AssertCount >= 1);<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,60 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// memory_resource * new_delete_resource()<br class="">
+<br class="">
+// The lifetime of the value returned by 'new_delete_resource()' should<br class="">
+// never end, even very late into program termination. This test constructs<br class="">
+// attempts to use 'new_delete_resource()' very late in program termination<br class="">
+// to detect lifetime issues.<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+struct POSType {<br class="">
+  ex::memory_resource* res = nullptr;<br class="">
+  void* ptr = nullptr;<br class="">
+  int n = 0;<br class="">
+  POSType() {}<br class="">
+  POSType(ex::memory_resource* r, void* p, int s) : res(r), ptr(p), n(s) {}<br class="">
+  ~POSType() {<br class="">
+      if (ptr) {<br class="">
+          if (!res) res = ex::get_default_resource();<br class="">
+          res->deallocate(ptr, n);<br class="">
+      }<br class="">
+  }<br class="">
+};<br class="">
+<br class="">
+void swap(POSType & L, POSType & R) {<br class="">
+    std::swap(L.res, R.res);<br class="">
+    std::swap(L.ptr, R.ptr);<br class="">
+    std::swap(L.n, R.n);<br class="">
+}<br class="">
+<br class="">
+POSType constructed_before_resources;<br class="">
+POSType constructed_before_resources2;<br class="">
+<br class="">
+// Constructs resources<br class="">
+ex::memory_resource* resource = ex::get_default_resource();<br class="">
+<br class="">
+POSType constructed_after_resources(resource, resource->allocate(1024), 1024);<br class="">
+POSType constructed_after_resources2(nullptr, resource->allocate(1024), 1024);<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    swap(constructed_after_resources, constructed_before_resources);<br class="">
+    swap(constructed_before_resources2, constructed_after_resources2);<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,52 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// memory_resource * new_delete_resource()<br class="">
+<br class="">
+// The lifetime of the value returned by 'new_delete_resource()' should<br class="">
+// never end, even very late into program termination. This test constructs<br class="">
+// attempts to use 'new_delete_resource()' very late in program termination<br class="">
+// to detect lifetime issues.<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+struct POSType {<br class="">
+  ex::memory_resource* res = nullptr;<br class="">
+  void* ptr = nullptr;<br class="">
+  int n = 0;<br class="">
+  POSType() {res = ex::new_delete_resource(); ptr = res->allocate(42); n = 42; }<br class="">
+  POSType(ex::memory_resource* r, void* p, int s) : res(r), ptr(p), n(s) {}<br class="">
+  ~POSType() { if (ptr) res->deallocate(ptr, n); }<br class="">
+};<br class="">
+<br class="">
+void swap(POSType & L, POSType & R) {<br class="">
+    std::swap(L.res, R.res);<br class="">
+    std::swap(L.ptr, R.ptr);<br class="">
+    std::swap(L.n, R.n);<br class="">
+}<br class="">
+<br class="">
+POSType constructed_before_resources;<br class="">
+<br class="">
+// Constructs resources<br class="">
+ex::memory_resource* resource = ex::new_delete_resource();<br class="">
+<br class="">
+POSType constructed_after_resources(resource, resource->allocate(1024), 1024);<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    swap(constructed_after_resources, constructed_before_resources);<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,22 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+<br class="">
+#ifndef _LIBCPP_VERSION<br class="">
+#error _LIBCPP_VERSION not defined<br class="">
+#endif<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,29 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// polymorphic_allocator operator=(polymorphic_allocator const &) = delete<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    typedef ex::polymorphic_allocator<void> T;<br class="">
+    static_assert(std::is_copy_assignable<T>::value, "");<br class="">
+    static_assert(std::is_move_assignable<T>::value, "");<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,48 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// polymorphic_allocator<T>::polymorphic_allocator(polymorphic_allocator const &);<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    typedef ex::polymorphic_allocator<void> A1;<br class="">
+    {<br class="">
+        static_assert(<br class="">
+            std::is_copy_constructible<A1>::value, ""<br class="">
+          );<br class="">
+        static_assert(<br class="">
+            std::is_move_constructible<A1>::value, ""<br class="">
+          );<br class="">
+    }<br class="">
+    // copy<br class="">
+    {<br class="">
+        A1 const a((ex::memory_resource*)42);<br class="">
+        A1 const a2(a);<br class="">
+        assert(a.resource() == a2.resource());<br class="">
+    }<br class="">
+    // move<br class="">
+    {<br class="">
+        A1 a((ex::memory_resource*)42);<br class="">
+        A1 a2(std::move(a));<br class="">
+        assert(a.resource() == a2.resource());<br class="">
+        assert(a2.resource() == (ex::memory_resource*)42);<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,48 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// polymorphic_allocator<T>::polymorphic_allocator() noexcept<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    {<br class="">
+        static_assert(<br class="">
+            std::is_nothrow_default_constructible<ex::polymorphic_allocator<void>>::value<br class="">
+          , "Must me nothrow default constructible"<br class="">
+          );<br class="">
+    }<br class="">
+    {<br class="">
+        // test that the allocator gets its resource from get_default_resource<br class="">
+        TestResource R1(42);<br class="">
+        ex::set_default_resource(&R1);<br class="">
+<br class="">
+        typedef ex::polymorphic_allocator<void> A;<br class="">
+        A const a;<br class="">
+        assert(a.resource() == &R1);<br class="">
+<br class="">
+        ex::set_default_resource(nullptr);<br class="">
+        A const a2;<br class="">
+        assert(a.resource() == &R1);<br class="">
+        assert(a2.resource() == ex::new_delete_resource());<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,45 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// polymorphic_allocator<T>::polymorphic_allocator(memory_resource *)<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    {<br class="">
+        typedef ex::polymorphic_allocator<void> A;<br class="">
+        static_assert(<br class="">
+            std::is_convertible<decltype(nullptr), A>::value<br class="">
+          , "Must be convertible"<br class="">
+          );<br class="">
+        static_assert(<br class="">
+            std::is_convertible<ex::memory_resource *, A>::value<br class="">
+          , "Must be convertible"<br class="">
+          );<br class="">
+    }<br class="">
+    {<br class="">
+        typedef ex::polymorphic_allocator<void> A;<br class="">
+        TestResource R;<br class="">
+        A const a(&R);<br class="">
+        assert(a.resource() == &R);<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,57 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator<br class="">
+<br class="">
+// template <class U><br class="">
+// polymorphic_allocator<T>::polymorphic_allocator(polymorphic_allocator<U> const &);<br class="">
+<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    typedef ex::polymorphic_allocator<void> A1;<br class="">
+    typedef ex::polymorphic_allocator<char> A2;<br class="">
+    { // Test that the conversion is implicit and noexcept.<br class="">
+        static_assert(<br class="">
+            std::is_convertible<A1 const &, A2>::value, ""<br class="">
+          );<br class="">
+        static_assert(<br class="">
+            std::is_convertible<A2 const &, A1>::value, ""<br class="">
+          );<br class="">
+        static_assert(<br class="">
+            std::is_nothrow_constructible<A1, A2 const &>::value, ""<br class="">
+          );<br class="">
+        static_assert(<br class="">
+            std::is_nothrow_constructible<A2, A1 const &>::value, ""<br class="">
+          );<br class="">
+    }<br class="">
+    // copy other type<br class="">
+    {<br class="">
+        A1 const a((ex::memory_resource*)42);<br class="">
+        A2 const a2(a);<br class="">
+        assert(a.resource() == a2.resource());<br class="">
+        assert(a2.resource() == (ex::memory_resource*)42);<br class="">
+    }<br class="">
+    {<br class="">
+        A1 a((ex::memory_resource*)42);<br class="">
+        A2 const a2(std::move(a));<br class="">
+        assert(a.resource() == a2.resource());<br class="">
+        assert(a2.resource() == (ex::memory_resource*)42);<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp?rev=268829&view=auto</a><br class="">
==============================================================================<br class="">
--- libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp (added)<br class="">
+++ libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp Fri May  6 20:04:55 2016<br class="">
@@ -0,0 +1,133 @@<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is dual licensed under the MIT and the University of Illinois Open<br class="">
+// Source Licenses. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+// UNSUPPORTED: c++98, c++03<br class="">
+<br class="">
+// <experimental/memory_resource><br class="">
+<br class="">
+// template <class T> class polymorphic_allocator;<br class="">
+<br class="">
+// template <class T, class U><br class="">
+// bool operator==(<br class="">
+//      polymorphic_allocator<T> const &<br class="">
+//    , polymorphic_allocator<U> const &) noexcept<br class="">
+<br class="">
+#include <experimental/memory_resource><br class="">
+#include <type_traits><br class="">
+#include <cassert><br class="">
+<br class="">
+#include "test_memory_resource.hpp"<br class="">
+<br class="">
+namespace ex = std::experimental::pmr;<br class="">
+<br class="">
+int main()<br class="">
+{<br class="">
+    typedef ex::polymorphic_allocator<void> A1;<br class="">
+    typedef ex::polymorphic_allocator<int> A2;<br class="">
+    // check return types<br class="">
+    {<br class="">
+        A1 const a1;<br class="">
+        A2 const a2;<br class="">
+        static_assert(std::is_same<decltype(a1 == a2), bool>::value, "");<br class="">
+        static_assert(noexcept(a1 == a2), "");<br class="">
+    }<br class="">
+    // equal same type (different resource)<br class="">
+    {<br class="">
+        TestResource d1(1);<br class="">
+        TestResource d2(1);<br class="">
+        A1 const a1(&d1);<br class="">
+        A1 const a2(&d2);<br class="">
+<br class="">
+        assert(a1 == a2);<br class="">
+        assert(d1.checkIsEqualCalledEq(1));<br class="">
+        assert(d2.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        d1.reset();<br class="">
+<br class="">
+        assert(a2 == a1);<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+        assert(d2.checkIsEqualCalledEq(1));<br class="">
+    }<br class="">
+    // equal same type (same resource)<br class="">
+    {<br class="">
+        TestResource d1;<br class="">
+        A1 const a1(&d1);<br class="">
+        A1 const a2(&d1);<br class="">
+<br class="">
+        assert(a1 == a2);<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        assert(a2 == a1);<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+    }<br class="">
+    // equal different type (different resource)<br class="">
+    {<br class="">
+        TestResource d1(42);<br class="">
+        TestResource d2(42);<br class="">
+        A1 const a1(&d1);<br class="">
+        A2 const a2(&d2);<br class="">
+<br class="">
+        assert(a1 == a2);<br class="">
+        assert(d1.checkIsEqualCalledEq(1));<br class="">
+        assert(d2.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        assert(a2 == a1);<br class="">
+        assert(d1.checkIsEqualCalledEq(1));<br class="">
+        assert(d2.checkIsEqualCalledEq(1));<br class="">
+<br class="">
+    }<br class="">
+    // equal different type (same resource)<br class="">
+    {<br class="">
+        TestResource d1(42);<br class="">
+        A1 const a1(&d1);<br class="">
+        A2 const a2(&d1);<br class="">
+<br class="">
+        assert(a1 == a2);<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        assert(a2 == a1);<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+    }<br class="">
+    // not equal same type<br class="">
+    {<br class="">
+        TestResource d1(1);<br class="">
+        TestResource d2(2);<br class="">
+        A1 const a1(&d1);<br class="">
+        A1 const a2(&d2);<br class="">
+<br class="">
+        assert(!(a1 == a2));<br class="">
+        assert(d1.checkIsEqualCalledEq(1));<br class="">
+        assert(d2.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        d1.reset();<br class="">
+<br class="">
+        assert(!(a2 == a1));<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+        assert(d2.checkIsEqualCalledEq(1));<br class="">
+<br class="">
+    }<br class="">
+    // not equal different types<br class="">
+    {<br class="">
+        TestResource  d1;<br class="">
+        TestResource1 d2;<br class="">
+        A1 const a1(&d1);<br class="">
+        A2 const a2(&d2);<br class="">
+<br class="">
+        assert(!(a1 == a2));<br class="">
+        assert(d1.checkIsEqualCalledEq(1));<br class="">
+        assert(d2.checkIsEqualCalledEq(0));<br class="">
+<br class="">
+        d1.reset();<br class="">
+<br class="">
+        assert(!(a2 == a1));<br class="">
+        assert(d1.checkIsEqualCalledEq(0));<br class="">
+        assert(d2.checkIsEqualCalledEq(1));<br class="">
+    }<br class="">
+}<br class="">
<br class="">
Added: libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp?rev=268829&view=auto" rel="noreferrer" target="_blank" class=""></a></blockquote></div>
</div></div></blockquote></div><br class=""></div>
_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class=""></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></body></html>