pointer_to.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1//===----------------------------------------------------------------------===//
2//
3// ��������������������The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// template <class Ptr>
13// struct pointer_traits
14// {
15//     static pointer pointer_to(<details>);
16//     ...
17// };
18
19#include <memory>
20#include <cassert>
21
22template <class T>
23struct A
24{
25private:
26    struct nat {};
27public:
28    typedef T element_type;
29    element_type* t_;
30
31    A(element_type* t) : t_(t) {}
32
33    static A pointer_to(typename std::conditional<std::is_void<element_type>::value,
34                                           nat, element_type>::type& et)
35        {return A(&et);}
36};
37
38int main()
39{
40    {
41        int i = 0;
42        A<int> a = std::pointer_traits<A<int> >::pointer_to(i);
43        assert(a.t_ = &i);
44    }
45    {
46        (std::pointer_traits<A<void> >::element_type)0;
47    }
48}
49