1 // Copyright (C) 2008-2018 Free Software Foundation, Inc. 2 // 3 // This file is part of the GNU ISO C++ Library. This library is free 4 // software; you can redistribute it and/or modify it under the 5 // terms of the GNU General Public License as published by the 6 // Free Software Foundation; either version 3, or (at your option) 7 // any later version. 8 9 // This library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 14 // You should have received a copy of the GNU General Public License along 15 // with this library; see the file COPYING3. If not see 16 // <http://www.gnu.org/licenses/>. 17 18 // { dg-do run { target c++11 } } 19 20 #include <sstream> 21 #include <string> 22 #include <testsuite_hooks.h> 23 24 void test01()25test01() 26 { 27 int i = 1742; 28 // This usage isn't supported by the current draft. 29 // std::string result = (std::ostringstream() << i).str(); 30 std::ostringstream() << i; 31 std::string result ("1742"); 32 int i2; 33 std::istringstream(result) >> i2; 34 VERIFY (i == i2); 35 } 36 37 struct X { bool as_rvalue; }; 38 operator >>(std::istream &,X & x)39void operator>>(std::istream&, X& x) { x.as_rvalue = false; } operator >>(std::istream &,X && x)40void operator>>(std::istream&, X&& x) { x.as_rvalue = true; } 41 42 // LWG 2328 Rvalue stream extraction should use perfect forwarding 43 void test02()44test02() 45 { 46 X x; 47 std::istringstream is; 48 auto& ref1 = (std::move(is) >> x); 49 VERIFY( &ref1 == &is ); 50 VERIFY( x.as_rvalue == false ); 51 auto& ref2 = (std::move(is) >> std::move(x)); 52 VERIFY( &ref2 == &is ); 53 VERIFY( x.as_rvalue == true ); 54 55 char arr[2]; 56 std::istringstream("x") >> &arr[0]; 57 std::istringstream("x") >> arr; 58 } 59 60 int main()61main() 62 { 63 test01(); 64 test02(); 65 return 0; 66 } 67