Home | History | Annotate | Line # | Download | only in gdb.cp
rvalue-ref-overload.cc revision 1.1
      1  1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2  1.1  christos 
      3  1.1  christos    Copyright 1998-2017 Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    This program is free software; you can redistribute it and/or modify
      6  1.1  christos    it under the terms of the GNU General Public License as published by
      7  1.1  christos    the Free Software Foundation; either version 3 of the License, or
      8  1.1  christos    (at your option) any later version.
      9  1.1  christos 
     10  1.1  christos    This program is distributed in the hope that it will be useful,
     11  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1  christos    GNU General Public License for more details.
     14  1.1  christos 
     15  1.1  christos    You should have received a copy of the GNU General Public License
     16  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17  1.1  christos 
     18  1.1  christos /* Rvalue references overload tests for GDB, based on overload.cc.  */
     19  1.1  christos 
     20  1.1  christos #include <stddef.h>
     21  1.1  christos #include <utility>
     22  1.1  christos 
     23  1.1  christos class foo;
     24  1.1  christos 
     25  1.1  christos typedef foo &foo_lval_ref;
     26  1.1  christos typedef foo &&foo_rval_ref;
     27  1.1  christos 
     28  1.1  christos class foo
     29  1.1  christos {
     30  1.1  christos public:
     31  1.1  christos   foo ();
     32  1.1  christos   foo (foo_lval_ref);
     33  1.1  christos   foo (foo_rval_ref);
     34  1.1  christos   ~foo ();
     35  1.1  christos 
     36  1.1  christos   int overload1arg (foo_lval_ref);
     37  1.1  christos   int overload1arg (foo_rval_ref);
     38  1.1  christos };
     39  1.1  christos 
     40  1.1  christos void
     41  1.1  christos marker1 ()
     42  1.1  christos {
     43  1.1  christos }
     44  1.1  christos 
     45  1.1  christos static int
     46  1.1  christos f (int &x)
     47  1.1  christos {
     48  1.1  christos   return 1;
     49  1.1  christos }
     50  1.1  christos 
     51  1.1  christos static int
     52  1.1  christos f (const int &x)
     53  1.1  christos {
     54  1.1  christos   return 2;
     55  1.1  christos }
     56  1.1  christos 
     57  1.1  christos static int
     58  1.1  christos f (int &&x)
     59  1.1  christos {
     60  1.1  christos   return 3;
     61  1.1  christos }
     62  1.1  christos 
     63  1.1  christos int
     64  1.1  christos main ()
     65  1.1  christos {
     66  1.1  christos   foo foo_rr_instance1;
     67  1.1  christos   foo arg;
     68  1.1  christos   int i = 0;
     69  1.1  christos   const int ci = 0;
     70  1.1  christos 
     71  1.1  christos   // result = 1 + 2 + 3 + 3 = 9
     72  1.1  christos   int result = f (i) + f (ci) + f (0) + f (std::move (i));
     73  1.1  christos 
     74  1.1  christos   marker1 (); // marker1-returns-here
     75  1.1  christos   return result;
     76  1.1  christos }
     77  1.1  christos 
     78  1.1  christos foo::foo  ()                       {}
     79  1.1  christos foo::foo  (foo_lval_ref afoo)      {}
     80  1.1  christos foo::foo  (foo_rval_ref afoo)      {}
     81  1.1  christos foo::~foo ()                       {}
     82  1.1  christos 
     83  1.1  christos /* Some functions to test overloading by varying one argument type. */
     84  1.1  christos 
     85  1.1  christos int foo::overload1arg (foo_lval_ref arg)           { return 1; }
     86  1.1  christos int foo::overload1arg (foo_rval_ref arg)           { return 2; }
     87