15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 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 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 95a83710eSEric Fiselier // <memory> 105a83710eSEric Fiselier 115a83710eSEric Fiselier // template <class Ptr> 125a83710eSEric Fiselier // struct pointer_traits 135a83710eSEric Fiselier // { 145a83710eSEric Fiselier // static pointer pointer_to(<details>); 155a83710eSEric Fiselier // ... 165a83710eSEric Fiselier // }; 175a83710eSEric Fiselier 185a83710eSEric Fiselier #include <memory> 195a83710eSEric Fiselier #include <cassert> 205a83710eSEric Fiselier 21*7fc6a556SMarshall Clow #include "test_macros.h" 22*7fc6a556SMarshall Clow 235a83710eSEric Fiselier template <class T> 245a83710eSEric Fiselier struct A 255a83710eSEric Fiselier { 265a83710eSEric Fiselier private: 275a83710eSEric Fiselier struct nat {}; 285a83710eSEric Fiselier public: 295a83710eSEric Fiselier typedef T element_type; 305a83710eSEric Fiselier element_type* t_; 315a83710eSEric Fiselier AA325a83710eSEric Fiselier A(element_type* t) : t_(t) {} 335a83710eSEric Fiselier pointer_toA345a83710eSEric Fiselier static A pointer_to(typename std::conditional<std::is_void<element_type>::value, 355a83710eSEric Fiselier nat, element_type>::type& et) 365a83710eSEric Fiselier {return A(&et);} 375a83710eSEric Fiselier }; 385a83710eSEric Fiselier main(int,char **)392df59c50SJF Bastienint main(int, char**) 405a83710eSEric Fiselier { 415a83710eSEric Fiselier { 425a83710eSEric Fiselier int i = 0; 437986a5bdSMarshall Clow static_assert((std::is_same<A<int>, decltype(std::pointer_traits<A<int> >::pointer_to(i))>::value), ""); 445a83710eSEric Fiselier A<int> a = std::pointer_traits<A<int> >::pointer_to(i); 455a83710eSEric Fiselier assert(a.t_ == &i); 465a83710eSEric Fiselier } 475a83710eSEric Fiselier { 485a83710eSEric Fiselier (std::pointer_traits<A<void> >::element_type)0; 495a83710eSEric Fiselier } 502df59c50SJF Bastien 512df59c50SJF Bastien return 0; 525a83710eSEric Fiselier } 53