1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2003-2020 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 18struct A 19{ 20 virtual ~A (); 21 int a1; 22}; 23 24A::~A() 25{ 26 a1 = 800; 27} 28 29struct B : public A 30{ 31 virtual ~B (); 32 int b1; 33 int b2; 34}; 35 36B::~B() 37{ 38 a1 = 900; 39 b1 = 901; 40 b2 = 902; 41} 42 43struct 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. */ 53typedef 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 60class D : public Dbase 61{ 62 public: 63 int d1; 64}; 65 66// Stop the compiler from optimizing away data. 67void refer (A *) 68{ 69 ; 70} 71 72struct empty {}; 73 74// Stop the compiler from optimizing away data. 75void refer (empty *) 76{ 77 ; 78} 79 80int 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