3 // Test for Container using non-standard pointer types.
5 // Copyright (C) 2008-2013 Free Software Foundation, Inc.
7 // This file is part of the GNU ISO C++ Library. This library is free
8 // software; you can redistribute it and/or modify it under the
9 // terms of the GNU General Public License as published by the
10 // Free Software Foundation; either version 3, or (at your option)
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License along
19 // with this library; see the file COPYING3. If not see
20 // <http://www.gnu.org/licenses/>.
26 #include <testsuite_hooks.h>
27 #include <ext/pointer.h>
29 using __gnu_cxx::_Pointer_adapter
;
30 using __gnu_cxx::_Relative_pointer_impl
;
31 using __gnu_cxx::__static_pointer_cast
;
32 using __gnu_cxx::__const_pointer_cast
;
41 typedef _Pointer_adapter
<_Relative_pointer_impl
<B
> > B_pointer
;
42 typedef _Pointer_adapter
<_Relative_pointer_impl
<const B
> > const_B_pointer
;
43 typedef _Pointer_adapter
<_Relative_pointer_impl
<A
> > A_pointer
;
44 typedef _Pointer_adapter
<_Relative_pointer_impl
<const A
> > const_A_pointer
;
48 bool test
__attribute__((unused
)) = true;
55 // Can't implicitly cast from A* to B*
56 B_pointer
bptr1(aptr
); // { dg-error "required from here" 31 }
57 B_pointer
bptr2(&a
); // { dg-error "required from here" 32 }
59 // but explicit cast/conversion is OK.
60 B_pointer
bptr3(__static_pointer_cast
<B_pointer
>(aptr
)); // ok
61 B_pointer
bptr4(__static_pointer_cast
<B_pointer
>(&a
)); // ok
63 // Can't implicitly cast from A* to B*
64 bptr1
= aptr
; // { dg-error "required from here" 39 }
65 bptr1
= &a
; // { dg-error "required from here" 40 }
67 // but explicit cast/conversion is OK.
68 bptr1
= __static_pointer_cast
<B_pointer
>(aptr
); // ok
69 bptr1
= __static_pointer_cast
<B_pointer
>(&a
); // ok
71 // Similarly, can't shed constness via implicit cast
72 const_A_pointer
captr(&a
);
73 A_pointer
aptr2(captr
); // { dg-error "required from here" 48 }
75 // but explicit cast/conversion is OK.
76 A_pointer
aptr3(__const_pointer_cast
<A_pointer
>(captr
)); // ok
78 // Similarly, can't shed constness via implicit cast
79 aptr2
= captr
; // { dg-error "required from here" 54 }
81 // but explicit cast/conversion is OK.
82 aptr3
= __const_pointer_cast
<A_pointer
>(captr
); // ok
84 // Combine explicit const cast with implicit downcast.
85 const_B_pointer
cbptr(&b
);
86 A_pointer
aptr4(cbptr
); // { dg-error "required from here" 61 }
87 aptr4
= cbptr
; // { dg-error "required from here" 62 }
89 A_pointer
aptr5(__const_pointer_cast
<B_pointer
>(cbptr
)); // ok
90 aptr5
= __const_pointer_cast
<B_pointer
>(cbptr
); // ok
93 // { dg-prune-output "include" }