1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2003-2019 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 struct A 19 { 20 virtual ~A (); 21 int a1; 22 }; 23 24 A::~A() 25 { 26 a1 = 800; 27 } 28 29 struct B : public A 30 { 31 virtual ~B (); 32 int b1; 33 int b2; 34 }; 35 36 B::~B() 37 { 38 a1 = 900; 39 b1 = 901; 40 b2 = 902; 41 } 42 43 struct C : public B 44 { 45 A *c1; 46 A *c2; 47 }; 48 49 /* Use a typedef for the baseclass, with a virtual method, to exercise 50 gnu-v3-abi.c:gnuv3_dynamic_class recursion. It's important that the 51 class itself have no name to make sure the typedef makes it through 52 to the recursive call. */ 53 typedef class { 54 public: 55 /* This class has no members as gcc 4.9.x doesn't emit the debug info 56 for them. */ 57 virtual int get () { return 42; } 58 } Dbase; 59 60 class D : public Dbase 61 { 62 public: 63 int d1; 64 }; 65 66 // Stop the compiler from optimizing away data. 67 void refer (A *) 68 { 69 ; 70 } 71 72 struct empty {}; 73 74 // Stop the compiler from optimizing away data. 75 void refer (empty *) 76 { 77 ; 78 } 79 80 int main (void) 81 { 82 A alpha, *aap, *abp, *acp; 83 B beta, *bbp; 84 C gamma; 85 D delta; 86 empty e; 87 A &aref (alpha); 88 89 alpha.a1 = 100; 90 beta.a1 = 200; beta.b1 = 201; beta.b2 = 202; 91 gamma.c1 = 0; gamma.c2 = (A *) ~0UL; 92 delta.d1 = 400; 93 94 aap = α refer (aap); 95 abp = β refer (abp); 96 bbp = β refer (bbp); 97 acp = γ refer (acp); 98 refer (&e); 99 100 return 0; // marker return 0 101 } // marker close brace 102