Home | History | Annotate | Line # | Download | only in gdb.compile
      1 /* Copyright 2015-2024 Free Software Foundation, Inc.
      2 
      3    This program is free software; you can redistribute it and/or modify
      4    it under the terms of the GNU General Public License as published by
      5    the Free Software Foundation; either version 3 of the License, or
      6    (at your option) any later version.
      7 
      8    This program is distributed in the hope that it will be useful,
      9    but WITHOUT ANY WARRANTY; without even the implied warranty of
     10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11    GNU General Public License for more details.
     12 
     13    You should have received a copy of the GNU General Public License
     14    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     15 
     16 class A;
     17 static int get_value (const A* a);
     18 
     19 class A
     20 {
     21 public:
     22   typedef int ATYPE;
     23 
     24   A () : a_ (21) {}
     25   ATYPE get_var () { return a_; }
     26   ATYPE get_var (unsigned long a) { return 100; }
     27   ATYPE get_var (ATYPE a) { return 101; }
     28   ATYPE get_var (float a) { return 102; }
     29   ATYPE get_var (void *a) { return 103;}
     30   ATYPE get_var (A& lr) { return 104; }
     31   ATYPE get_var (A const& lr) { return 105; }
     32 
     33   ATYPE get_var1 (int n) { return a_ << n; }
     34   ATYPE get_var2 (int incr, unsigned n) { return (a_ + incr) << n; }
     35 
     36   static ATYPE get_1 (int a) { return a + 1; }
     37   static ATYPE get_2 (int a, int b) { return a + b + 2; }
     38 
     39   friend ATYPE get_value (const A*);
     40 
     41 private:
     42   ATYPE a_;
     43 };
     44 
     45 static A::ATYPE
     46 get_value (A::ATYPE a)
     47 {
     48   return a;
     49 }
     50 
     51 static A::ATYPE
     52 get_value (const A* a)
     53 {
     54   return a->a_;
     55 }
     56 
     57 static A::ATYPE
     58 get_value ()
     59 {
     60   return 200;
     61 }
     62 
     63 typedef int (A::*PMF) (A::ATYPE);
     64 
     65 int
     66 main ()
     67 {
     68   A *a = new A ();
     69   int var = 1234;
     70   float f = 1.23;
     71   unsigned long ul = 0xdeadbeef;
     72   A const* ac = a;
     73 
     74   PMF pmf = &A::get_var;
     75   PMF *pmf_p = &pmf;
     76 
     77   var -= a->get_var ();		// break here
     78   var -= a->get_var (1);
     79   var -= a->get_var (ul);
     80   var -= a->get_var (f);
     81   var -= a->get_var (a);
     82   var -= a->get_var (*a);
     83   var -= a->get_var (*ac);
     84   var -= a->get_var1 (1);
     85   var -= a->get_var2 (1, 2);
     86   var += (a->*pmf) (1);
     87   var -= (a->**pmf_p) (1);
     88 
     89   return var - A::get_1 (1) + A::get_2 (1, 2) + get_value ()
     90     + get_value (get_value ()) + get_value (a);
     91 }
     92