]>
Commit | Line | Data |
---|---|---|
a7da4881 VV |
1 | // { dg-do run { target c++11 } } |
2 | ||
7adcbafe | 3 | // Copyright (C) 2016-2022 Free Software Foundation, Inc. |
a7da4881 VV |
4 | // |
5 | // This file is part of the GNU ISO C++ Library. This library is free | |
6 | // software; you can redistribute it and/or modify it under the | |
7 | // terms of the GNU General Public License as published by the | |
8 | // Free Software Foundation; either version 3, or (at your option) | |
9 | // any later version. | |
10 | ||
11 | // This library is distributed in the hope that it will be useful, | |
12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | // GNU General Public License for more details. | |
15 | ||
16 | // You should have received a copy of the GNU General Public License along | |
17 | // with this library; see the file COPYING3. If not see | |
18 | // <http://www.gnu.org/licenses/>. | |
19 | ||
a87ceadf | 20 | // C++11 27.7.3.9 Rvalue stream insertion [ostream.rvalue] |
a7da4881 VV |
21 | |
22 | #include <sstream> | |
23 | ||
aa475c4a JW |
24 | template<typename Ostream, typename T, typename = void> |
25 | struct is_insertable | |
26 | : std::false_type | |
27 | { }; | |
28 | ||
29 | template<typename> using void_t = void; | |
30 | ||
31 | template<typename Ostream, typename T> | |
32 | using insert_result | |
33 | = decltype(std::declval<Ostream>() << std::declval<const T&>()); | |
34 | ||
35 | template<typename Ostream, typename T> | |
36 | struct is_insertable<Ostream, T, void_t<insert_result<Ostream, T>>> | |
37 | : std::true_type | |
38 | { }; | |
39 | ||
a7da4881 VV |
40 | struct X {}; |
41 | std::ostream& operator<<(std::ostream&, const X&) = delete; | |
42 | ||
43 | struct Y {}; | |
44 | std::ostream& operator<<(std::ostream& os, const Y&) {return os;} | |
45 | std::ostream& operator<<(std::ostream&& os, const Y&) {return os;} | |
46 | ||
47 | struct Z{}; | |
48 | ||
a7da4881 VV |
49 | void test01() |
50 | { | |
51 | Y y; | |
52 | std::ostringstream os; | |
53 | os << y; | |
54 | os << Y(); | |
55 | std::ostringstream() << y; | |
56 | std::ostringstream() << Y(); | |
aa475c4a JW |
57 | static_assert(!is_insertable<std::ostream&, X&>::value, ""); |
58 | static_assert(!is_insertable<std::ostream&&, X&>::value, ""); | |
59 | static_assert(!is_insertable<std::ostream&, X&&>::value, ""); | |
60 | static_assert(!is_insertable<std::ostream&&, X&&>::value, ""); | |
61 | static_assert(is_insertable<std::ostream&, Y&>::value, ""); | |
62 | static_assert(is_insertable<std::ostream&&, Y&&>::value, ""); | |
63 | static_assert(is_insertable<std::ostream&, Y&>::value, ""); | |
64 | static_assert(is_insertable<std::ostream&&, Y&&>::value, ""); | |
65 | static_assert(!is_insertable<std::ostream&, Z&>::value, ""); | |
66 | static_assert(!is_insertable<std::ostream&&, Z&>::value, ""); | |
67 | static_assert(!is_insertable<std::ostream&, Z&&>::value, ""); | |
68 | static_assert(!is_insertable<std::ostream&&, Z&&>::value, ""); | |
a7da4881 VV |
69 | } |
70 | ||
71 | int main() | |
72 | { | |
73 | test01(); | |
74 | } |