/* This testcase is part of GDB, the GNU debugger.

   Copyright 2011 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 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/>.

   Contributed by Red Hat, originally written by Keith Seitz.  */

#include <stdlib.h>

namespace
{
  void doit1 (void) { } // doit1(void)
  void doit1 (int a) { } // doit1(int)
  void doit1 (char *a) { } // doit1(char *)

  class one
  {
  public:
    one (void) { } // one::one(void)
    one (int a) { } // one::one(int)
    one (char *a) { } // one::one(char *)
    static void doit (void) { } // one::doit(void)
  };

  namespace A
  {
    void doit2 (void) { } // A::doit2(void)
    void doit2 (int a) { } // A::doit2(int)
    void doit2 (char *a) { } // A::doit2(char *)

    class two
    {
    public:
      two (void) { } // A::two::two(void)
      two (int a) { } // A::two::two(int)
      two (char *a) { } // A::two::two(char *)
      static void doit (void) { } // A::two::doit(void)
    };

    namespace
    {
      namespace
      {
	void doit3 (void) { } // A::doit3(void)
	void doit3 (int a) { } // A::doit3(int)
	void doit3 (char *a) { } // A::doit3(char *)

	class three
	{
	public:
	  three (void) { } // A::three::three(void)
	  three (int a) { } // A::three::three(int)
	  three (char *a) { } // A::three::three(char *)
	  static void doit (void) { } // A::three::doit(void)
	};
      }
    }
  }
}

int
main (void)
{
  one a, b (3), c (static_cast<char *> (NULL));
  one::doit ();
  A::two d, e (3), f (static_cast<char *> (NULL));
  A::two::doit ();
  A::three g, h (3), i (static_cast<char *> (NULL));
  A::three::doit ();
  doit1 ();
  doit1 (3);
  doit1 (static_cast<char *> (NULL));
  A::doit2 ();
  A::doit2 (3);
  A::doit2 (static_cast<char *> (NULL));
  A::doit3 ();
  A::doit3 (3);
  A::doit3 (static_cast<char *> (NULL));
  return 0;
}
