Home | History | Annotate | Line # | Download | only in gdb.cp
      1      1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2      1.1  christos 
      3  1.1.1.5  christos    Copyright 1998-2024 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.1.3  christos   int overloadConst (const foo &);
     39  1.1.1.3  christos   int overloadConst (const foo &&);
     40      1.1  christos };
     41      1.1  christos 
     42      1.1  christos void
     43      1.1  christos marker1 ()
     44      1.1  christos {
     45      1.1  christos }
     46      1.1  christos 
     47      1.1  christos static int
     48      1.1  christos f (int &x)
     49      1.1  christos {
     50      1.1  christos   return 1;
     51      1.1  christos }
     52      1.1  christos 
     53      1.1  christos static int
     54      1.1  christos f (const int &x)
     55      1.1  christos {
     56      1.1  christos   return 2;
     57      1.1  christos }
     58      1.1  christos 
     59      1.1  christos static int
     60      1.1  christos f (int &&x)
     61      1.1  christos {
     62      1.1  christos   return 3;
     63      1.1  christos }
     64      1.1  christos 
     65  1.1.1.3  christos static int
     66  1.1.1.3  christos g (int &&x)
     67  1.1.1.3  christos {
     68  1.1.1.3  christos   return x;
     69  1.1.1.3  christos }
     70  1.1.1.3  christos 
     71      1.1  christos int
     72      1.1  christos main ()
     73      1.1  christos {
     74      1.1  christos   foo foo_rr_instance1;
     75      1.1  christos   foo arg;
     76      1.1  christos   int i = 0;
     77      1.1  christos   const int ci = 0;
     78      1.1  christos 
     79      1.1  christos   // result = 1 + 2 + 3 + 3 = 9
     80      1.1  christos   int result = f (i) + f (ci) + f (0) + f (std::move (i));
     81      1.1  christos 
     82  1.1.1.3  christos   /* Overload resolution below requires both a CV-conversion
     83  1.1.1.3  christos      and reference conversion.  */
     84  1.1.1.3  christos   int test_const // = 3
     85  1.1.1.3  christos     = foo_rr_instance1.overloadConst (arg);
     86  1.1.1.3  christos 
     87  1.1.1.3  christos   /* The statement below is illegal: cannot bind rvalue reference of
     88  1.1.1.3  christos      type 'int&&' to lvalue of type 'int'.
     89  1.1.1.3  christos 
     90  1.1.1.3  christos      result = g (i); */
     91  1.1.1.3  christos   result = g (5); // this is OK
     92  1.1.1.3  christos 
     93      1.1  christos   marker1 (); // marker1-returns-here
     94      1.1  christos   return result;
     95      1.1  christos }
     96      1.1  christos 
     97      1.1  christos foo::foo  ()                       {}
     98      1.1  christos foo::foo  (foo_lval_ref afoo)      {}
     99      1.1  christos foo::foo  (foo_rval_ref afoo)      {}
    100      1.1  christos foo::~foo ()                       {}
    101      1.1  christos 
    102      1.1  christos /* Some functions to test overloading by varying one argument type. */
    103      1.1  christos 
    104      1.1  christos int foo::overload1arg (foo_lval_ref arg)           { return 1; }
    105      1.1  christos int foo::overload1arg (foo_rval_ref arg)           { return 2; }
    106  1.1.1.3  christos int foo::overloadConst (const foo &arg)            { return 3; }
    107  1.1.1.3  christos int foo::overloadConst (const foo &&arg)           { return 4; }
    108