/* Code to go along with tests in rtti.exp.
   
   Copyright 2003-2021 Free Software Foundation, Inc.

   Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
   Inc.

   This file is part of GDB.

   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 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, see <http://www.gnu.org/licenses/>.  */

#include "rtti.h"

namespace n1 {

  class C1;

  class Base1 {
  public:
    virtual ~Base1() { }
  };


  class C1: public Base1 {
  public:
  };

  class D1 : public C1{
  public:
    D1(C1 *, C1 *);
    
    C1* expr_1_;
    C1* expr_2_;
  };
  
  D1::D1(C1 *expr_1, C1 *expr_2)
    : expr_1_(expr_1), expr_2_(expr_2) { }

  C1 *create1() {
    return new D1(0, 0);
  }

} // n1

// NOTE: carlton/2004-01-23: This call exists only to convince GCC to
// keep around a reference to 'obj' in n2::func - GCC 3.4 had been
// optimizing it away.
void refer_to (n2::C2 *obj)
{
  // Do nothing.
}

void refer_to (n2::n3::C3 *obj)
{
  // Do nothing.
}

namespace n2
{
  void func ()
  {
    C2 *obj = create2 ();

    refer_to (obj);		// func-constructs-done

    return;
  }

  namespace n3
  {
    void func3 ()
    {
      C3 *obj3 = create3 ();

      refer_to (obj3);		// func3-constructs-done

      return;
    }
  }
}

int main()
{
    using namespace n1;
    using namespace n2;

    C1 *e1 = create1();
    C2 *e2 = create2();

    n2::func();				// main-constructs-done
    n2::n3::func3();

    return 0;
}
