Handle void * conversions in FreeBSD/x86 native code to fix C++ build.
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.cp / member-ptr.cc
index e668c4623c1b5de913782dc0f1258c0dc47add44..4b7da34d3a77e3b5c045bd76d1f0a01514a039d7 100644 (file)
@@ -1,23 +1,19 @@
 /* This testcase is part of GDB, the GNU debugger.
 
-   Copyright 1998, 1999, 2004 Free Software Foundation, Inc.
+   Copyright 1998-2016 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-   */
-
 
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 extern "C" {
 #include <stdio.h>
@@ -81,6 +77,77 @@ typedef int (A::*PMF)(int);
 
 typedef int A::*PMI;
 
+/* This class is in front of the other base classes of Diamond, so
+   that we can detect if the offset for Left or the first Base is
+   added twice - otherwise it would be 2 * 0 == 0.  */
+class Padding
+{
+public:
+  int spacer;
+  virtual int vspacer();
+};
+
+int Padding::vspacer()
+{
+  return this->spacer;
+}
+
+class Base
+{
+public:
+  int x;
+  int get_x();
+  virtual int vget_base ();
+};
+
+int Base::get_x ()
+{
+  return this->x;
+}
+
+int Base::vget_base ()
+{
+  return this->x + 1000;
+}
+
+class Left : public Base {
+public:
+  virtual int vget ();
+};
+
+int Left::vget ()
+{
+  return this->x + 100;
+}
+
+class Right : public Base {
+public:
+  virtual int vget ();
+};
+
+int Right::vget ()
+{
+  return this->x + 200;
+}
+
+class Diamond : public Padding, public Left, public Right
+{
+public:
+  virtual int vget_base ();
+  int (*func_ptr) (int);
+};
+
+int Diamond::vget_base ()
+{
+  return this->Left::x + 2000;
+}
+
+int
+func (int x)
+{
+  return 19 + x;
+}
+
 int main ()
 {
   A a;
@@ -90,6 +157,19 @@ int main ()
   PMF * pmf_p;
   PMI pmi;
 
+  Diamond diamond;
+  int (Diamond::*left_pmf) ();
+  int (Diamond::*right_pmf) ();
+  int (Diamond::*left_vpmf) ();
+  int (Diamond::*left_base_vpmf) ();
+  int (Diamond::*right_vpmf) ();
+  int (Base::*base_vpmf) ();
+  int Diamond::*diamond_pmi;
+  int (* Diamond::*diamond_pfunc_ptr) (int);
+
+  PMI null_pmi;
+  PMF null_pmf;
+
   a.j = 121;
   a.jj = 1331;
   
@@ -101,8 +181,34 @@ int main ()
   pmf = &A::bar;
   pmf_p = &pmf;
 
-  pmi = NULL;
-  
+  diamond.Left::x = 77;
+  diamond.Right::x = 88;
+  diamond.func_ptr = func;
+
+  /* Some valid pointer to members from a base class.  */
+  left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x);
+  right_pmf = (int (Diamond::*) ()) (int (Right::*) ()) (&Base::get_x);
+  left_vpmf = &Left::vget;
+  left_base_vpmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::vget_base);
+  right_vpmf = &Right::vget;
+
+  /* An unspecified, value preserving pointer to member cast.  */
+  base_vpmf = (int (Base::*) ()) (int (Left::*) ()) &Diamond::vget_base;
+
+  /* A pointer to data member from a base class.  */
+  diamond_pmi = (int Diamond::*) (int Left::*) &Base::x;
+
+  /* A pointer to data member, where the member is itself a pointer to
+     a function.  */
+  diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr;
+
+  null_pmi = NULL;
+  null_pmf = NULL;
+
+  pmi = NULL; /* Breakpoint 1 here.  */
+
+  (diamond.*diamond_pfunc_ptr) (20);
+
   k = (a.*pmf)(3);
 
   pmi = &A::jj;
This page took 0.024777 seconds and 4 git commands to generate.