14e3195c9SRichard Smith //===----------------------------------------------------------------------===//
24e3195c9SRichard Smith //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64e3195c9SRichard Smith //
74e3195c9SRichard Smith //===----------------------------------------------------------------------===//
84e3195c9SRichard Smith 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03
10c7ef5656SRichard Smith 
11961914eeSLouis Dionne // Aligned allocations are not supported on macOS < 10.13
12961914eeSLouis Dionne // Note: use 'unsupported' instead of 'xfail' to ensure
13961914eeSLouis Dionne // we won't pass prior to c++17.
14c360553cSLouis Dionne // UNSUPPORTED: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}}
15961914eeSLouis Dionne 
16*2fcf99d7SNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
17961914eeSLouis Dionne 
184e3195c9SRichard Smith // <memory>
194e3195c9SRichard Smith 
204e3195c9SRichard Smith // template <class T>
214e3195c9SRichard Smith //   pair<T*, ptrdiff_t>
224e3195c9SRichard Smith //   get_temporary_buffer(ptrdiff_t n);
234e3195c9SRichard Smith //
244e3195c9SRichard Smith // template <class T>
254e3195c9SRichard Smith //   void
264e3195c9SRichard Smith //   return_temporary_buffer(T* p);
274e3195c9SRichard Smith 
284e3195c9SRichard Smith #include <memory>
294e3195c9SRichard Smith #include <cassert>
304e3195c9SRichard Smith 
317fc6a556SMarshall Clow #include "test_macros.h"
327fc6a556SMarshall Clow 
334e3195c9SRichard Smith struct alignas(32) A {
344e3195c9SRichard Smith     int field;
354e3195c9SRichard Smith };
364e3195c9SRichard Smith 
main(int,char **)372df59c50SJF Bastien int main(int, char**)
384e3195c9SRichard Smith {
394e3195c9SRichard Smith     std::pair<A*, std::ptrdiff_t> ip = std::get_temporary_buffer<A>(5);
404e3195c9SRichard Smith     assert(!(ip.first == nullptr) ^ (ip.second == 0));
414e3195c9SRichard Smith     assert(reinterpret_cast<uintptr_t>(ip.first) % alignof(A) == 0);
424e3195c9SRichard Smith     std::return_temporary_buffer(ip.first);
432df59c50SJF Bastien 
442df59c50SJF Bastien   return 0;
454e3195c9SRichard Smith }
46