home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / gdb-4.9 / gdb / testsuite / gdb.t20 / gdbme.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-12  |  5.1 KB  |  360 lines

  1. // Test various -*- C++ -*- things.
  2.  
  3. // ====================== simple class structures  =======================
  4.  
  5. struct default_public_struct {
  6.  // defaults to public:
  7.   int a;
  8.   int b;
  9. };
  10.  
  11. struct explicit_public_struct {
  12.  public:
  13.   int a;
  14.   int b;
  15. };
  16.  
  17. struct protected_struct {
  18.  protected:
  19.   int a;
  20.   int b;
  21. };
  22.  
  23. struct private_struct {
  24.  private:
  25.   int a;
  26.   int b;
  27. };
  28.  
  29. struct mixed_protection_struct {
  30.  public:
  31.   int a;
  32.   int b;
  33.  private:
  34.   int c;
  35.   int d;
  36.  protected:
  37.   int e;
  38.   int f;
  39.  public:
  40.   int g;
  41.  private:
  42.   int h;
  43.  protected:
  44.   int i;
  45. };
  46.  
  47. class public_class {
  48.  public:
  49.   int a;
  50.   int b;
  51. };
  52.  
  53. class protected_class {
  54.  protected:
  55.   int a;
  56.   int b;
  57. };
  58.  
  59. class default_private_class {
  60.  // defaults to private:
  61.   int a;
  62.   int b;
  63. };
  64.  
  65. class explicit_private_class {
  66.  private:
  67.   int a;
  68.   int b;
  69. };
  70.  
  71. class mixed_protection_class {
  72.  public:
  73.   int a;
  74.   int b;
  75.  private:
  76.   int c;
  77.   int d;
  78.  protected:
  79.   int e;
  80.   int f;
  81.  public:
  82.   int g;
  83.  private:
  84.   int h;
  85.  protected:
  86.   int i;
  87. };
  88.  
  89. // ========================= simple inheritance ==========================
  90.  
  91. class A {
  92.  public:
  93.   int a;
  94.   int x;
  95. };
  96.  
  97. A g_A;
  98.  
  99. class B : public A {
  100.  public:
  101.   int b;
  102.   int x;
  103. };
  104.  
  105. B g_B;
  106.  
  107. class C : public A {
  108.  public:
  109.   int c;
  110.   int x;
  111. };
  112.  
  113. C g_C;
  114.  
  115. class D : public B, public C {
  116.  public:
  117.   int d;
  118.   int x;
  119. };
  120.  
  121. D g_D;
  122.  
  123. class E : public D {
  124.  public:
  125.   int e;
  126.   int x;
  127. };
  128.  
  129. E g_E;
  130.  
  131. void inheritance2 (void)
  132. {
  133. }
  134.  
  135. void inheritance1 (void)
  136. {
  137.   int ival;
  138.   int *intp;
  139.  
  140.   // {A::a, A::x}
  141.  
  142.   g_A.A::a = 1;
  143.   g_A.A::x = 2;
  144.  
  145.   // {{A::a,A::x},B::b,B::x}
  146.  
  147.   g_B.A::a = 3;
  148.   g_B.A::x = 4;
  149.   g_B.B::b = 5;
  150.   g_B.B::x = 6;
  151.  
  152.   // {{A::a,A::x},C::c,C::x}
  153.  
  154.   g_C.A::a = 7;
  155.   g_C.A::x = 8;
  156.   g_C.C::c = 9;
  157.   g_C.C::x = 10;
  158.  
  159.   // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}
  160.  
  161.   // The following initialization code is non-portable, but allows us
  162.   // to initialize all members of g_D until we can fill in the missing
  163.   // initialization code with legal C++ code.
  164.  
  165.   for (intp = (int *) &g_D, ival = 11;
  166.        intp < ((int *) &g_D + sizeof (g_D) / sizeof (int));
  167.        intp++, ival++)
  168.     {
  169.       *intp = ival;
  170.     }
  171.  
  172.   // Overlay the nonportable initialization with legal initialization.
  173.  
  174.   // ????? = 11;  (g_D.A::a = 11; is ambiguous)
  175.   // ????? = 12;  (g_D.A::x = 12; is ambiguous)
  176.   g_D.B::b = 13;
  177.   g_D.B::x = 14;
  178.   // ????? = 15;
  179.   // ????? = 16;
  180.   g_D.C::c = 17;
  181.   g_D.C::x = 18;
  182.   g_D.D::d = 19;
  183.   g_D.D::x = 20;
  184.  
  185.  
  186.   // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x}
  187.  
  188.   // The following initialization code is non-portable, but allows us
  189.   // to initialize all members of g_D until we can fill in the missing
  190.   // initialization code with legal C++ code.
  191.  
  192.   for (intp = (int *) &g_E, ival = 21;
  193.        intp < ((int *) &g_E + sizeof (g_E) / sizeof (int));
  194.        intp++, ival++)
  195.   {
  196.     *intp = ival;
  197.   }
  198.  
  199.   // Overlay the nonportable initialization with legal initialization.
  200.  
  201.   // ????? = 21;  (g_E.A::a = 21; is ambiguous)
  202.   // ????? = 22;  (g_E.A::x = 22; is ambiguous)
  203.   g_E.B::b = 23;
  204.   g_E.B::x = 24;
  205.   // ????? = 25;
  206.   // ????? = 26;
  207.   g_E.C::c = 27;
  208.   g_E.C::x = 28;
  209.   g_E.D::d = 29;
  210.   g_E.D::x = 30;
  211.   g_E.E::e = 31;
  212.   g_E.E::x = 32;
  213.  
  214.   inheritance2 ();    
  215. }
  216.  
  217. // ======================== virtual base classes=========================
  218.  
  219. class vA {
  220.  public:
  221.   int va;
  222.   int vx;
  223. };
  224.  
  225. vA g_vA;
  226.  
  227. class vB : public virtual vA {
  228.  public:
  229.   int vb;
  230.   int vx;
  231. };
  232.  
  233. vB g_vB;
  234.  
  235. class vC : public virtual vA {
  236.  public:
  237.   int vc;
  238.   int vx;
  239. };
  240.  
  241. vC g_vC;
  242.  
  243. class vD : public virtual vB, public virtual vC {
  244.  public:
  245.   int vd;
  246.   int vx;
  247. };
  248.  
  249. vD g_vD;
  250.  
  251. class vE : public virtual vD {
  252.  public:
  253.   int ve;
  254.   int vx;
  255. };
  256.  
  257. vE g_vE;
  258.  
  259. void inheritance4 (void)
  260. {
  261. }
  262.  
  263. void inheritance3 (void)
  264. {
  265.   int ival;
  266.   int *intp;
  267.  
  268.   // {vA::va, vA::vx}
  269.  
  270.   g_vA.vA::va = 1;
  271.   g_vA.vA::vx = 2;
  272.  
  273.   // {{vA::va, vA::vx}, vB::vb, vB::vx}
  274.  
  275.   g_vB.vA::va = 3;
  276.   g_vB.vA::vx = 4;
  277.   g_vB.vB::vb = 5;
  278.   g_vB.vB::vx = 6;
  279.  
  280.   // {{vA::va, vA::vx}, vC::vc, vC::vx}
  281.  
  282.   g_vC.vA::va = 7;
  283.   g_vC.vA::vx = 8;
  284.   g_vC.vC::vc = 9;
  285.   g_vC.vC::vx = 10;
  286.  
  287.   // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx}
  288.  
  289.   g_vD.vA::va = 11;
  290.   g_vD.vA::vx = 12;
  291.   g_vD.vB::vb = 13;
  292.   g_vD.vB::vx = 14;
  293.   g_vD.vC::vc = 15;
  294.   g_vD.vC::vx = 16;
  295.   g_vD.vD::vd = 17;
  296.   g_vD.vD::vx = 18;
  297.  
  298.  
  299.   // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx}
  300.  
  301.   g_vD.vA::va = 19;
  302.   g_vD.vA::vx = 20;
  303.   g_vD.vB::vb = 21;
  304.   g_vD.vB::vx = 22;
  305.   g_vD.vC::vc = 23;
  306.   g_vD.vC::vx = 24;
  307.   g_vD.vD::vd = 25;
  308.   g_vD.vD::vx = 26;
  309.   g_vE.vE::ve = 27;
  310.   g_vE.vE::vx = 28;
  311.  
  312.   inheritance4 ();    
  313. }
  314.  
  315. // ======================================================================
  316.  
  317. class Base1 {
  318.  public:
  319.   int x;
  320.   Base1(int i) { x = i; }
  321. };
  322.  
  323. class Foo
  324. {
  325.  public:
  326.   int x;
  327.   int y;
  328.   static int st;
  329.   Foo (int i, int j) { x = i; y = j; }
  330.   int operator! ();
  331.   operator int ();
  332.   int times (int y);
  333. };
  334.  
  335. class Bar : public Base1, public Foo {
  336.  public:
  337.   int z;
  338.   Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; }
  339. };
  340.  
  341. int Foo::operator! () { return !x; }
  342.  
  343. int Foo::times (int y) { return x * y; }
  344.  
  345. int Foo::st = 100;
  346.  
  347. int Foo::operator int() { return x; }
  348.  
  349. Foo foo(10, 11);
  350. Bar bar(20, 21, 22);
  351.  
  352. int
  353. main()
  354. {
  355.   inheritance1 ();
  356.   inheritance3 ();
  357.   int Foo::* pmi = &Foo::y;
  358.   return (int)foo.*pmi;
  359. }
  360.