Index: include/new =================================================================== --- include/new +++ include/new @@ -46,6 +46,8 @@ new_handler set_new_handler(new_handler new_p) noexcept; new_handler get_new_handler() noexcept; +// 21.6.4, pointer optimization barrier +template constexpr T* launder(T* p) noexcept; // C++17 } // std void* operator new(std::size_t size); // replaceable @@ -166,6 +168,11 @@ #endif #endif +#if _LIBCPP_STD_VER > 14 +template +_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY +constexpr _Tp* launder(_Tp* __p) noexcept { return __p;} +#endif } // std #if defined(_LIBCPP_CXX03_LANG) Index: test/std/language.support/support.dynamic/ptr.launder/launder.fail.cpp =================================================================== --- test/std/language.support/support.dynamic/ptr.launder/launder.fail.cpp +++ test/std/language.support/support.dynamic/ptr.launder/launder.fail.cpp @@ -0,0 +1,27 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template constexpr T* launder(T* p) noexcept; + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8 + +#include +#include + +#include "test_macros.h" + +int main () +{ + int *p = nullptr; + std::launder(p); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}} +} Index: test/std/language.support/support.dynamic/ptr.launder/launder.pass.cpp =================================================================== --- test/std/language.support/support.dynamic/ptr.launder/launder.pass.cpp +++ test/std/language.support/support.dynamic/ptr.launder/launder.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template constexpr T* launder(T* p) noexcept; + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +#include +#include + +#include "test_macros.h" + +constexpr int gi = 5; +constexpr float gf = 8.f; + +int main() { + static_assert(std::launder(&gi) == &gi, "" ); + static_assert(std::launder(&gf) == &gf, "" ); + + const int *i = &gi; + const float *f = &gf; + static_assert(std::is_same::value, ""); + static_assert(std::is_same::value, ""); + + assert(std::launder(i) == i); + assert(std::launder(f) == f); +} Index: www/cxx1z_status.html =================================================================== --- www/cxx1z_status.html +++ www/cxx1z_status.html @@ -104,6 +104,7 @@ p0083r3LWGSplicing Maps and SetsOulu p0084r2LWGEmplace Return TypeOuluComplete4.0 p0088r3LWGVariant: a type-safe union for C++17OuluComplete4.0 + p0137r1CWGCore Issue 1776: Replacement of class objects containing reference membersOuluComplete6.0 p0163r0LWGshared_ptr::weak_typeOuluComplete3.9 p0174r2LWGDeprecating Vestigial Library Parts in C++17Oulu p0175r1LWGSynopses for the C libraryOulu