1 // PR c++/50391
2 // { dg-do compile { target c++11 } }
3 
4 namespace std
5 {
6   template<typename T, T Val>
7     struct integral_constant
8     { static constexpr T value = Val; };
9 
10   template<typename T>
11     struct is_abstract
12     : integral_constant<bool, __is_abstract(T)>
13     { };
14 
15   template<typename T, bool = is_abstract<T>::value>
16     struct is_destructible
17     : integral_constant<bool, true>
18     { };
19 
20   template<typename T>
21     struct is_destructible<T, true>
22     : integral_constant<bool, false>
23     { };
24 
25   template<typename T>
26     struct is_nothrow_move_constructible
27     : is_destructible<T>
28     { };
29 
30   template<typename T>
31     struct decay
32     { typedef T type; };
33 
34   template<typename T>
35     struct decay<T&>
36     { typedef T type; };
37 
38 } // std
39 
40 template<class Tp>
41   struct single
42   {
43     Tp elem;
44 
45     constexpr single(const Tp& e)
46     : elem(e) { }
47 
48     single(single&& s)
49     noexcept(std::is_nothrow_move_constructible<Tp>::value)
50     : elem(s.elem) { }
51   };
52 
53 template<class Tp>
54   constexpr single<typename std::decay<Tp>::type>
55   make_single(Tp&& x)
56   {
57     return single<typename std::decay<Tp>::type>(x);
58   }
59 
60 class Blob;  // { dg-message "forward declaration" }
61 
62 void
63 foo(Blob *b)
64 {
65   make_single(*b);
66 }
67 
68 // { dg-excess-errors "incomplete type|not a member" }
69