#include <iostream>

/*
  Look into MSVC namespace woes.

  Expected result:
  
-*- mode: compilation; default-directory: "~/src/c++/" -*-
Compilation started at Tue Dec  2 13:18:11

make namespace-woes && ./namespace-woes
g++     namespace-woes.cc   -o namespace-woes
void scope::Base::func()
void scope::Base::func()
void scope::Base::func()
void scope::Base::func()

Compilation finished at Tue Dec  2 13:18:11
*/

struct Base
{
  void func ()
  {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
  }
};

namespace foreign
{
  struct Base
  {
    void func ()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
  };
}

namespace scope
{
  struct Base
  {
    void func ()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
  };
  
  struct Derived
  /* MSVC: does order matter here? */
    : public ::Base
    , public Base
    , public ::foreign::Base
  {
    void default_func ()
    {
      Base::func ();
    }

    void outer_func ();
    void scoped_func ();
    void foreign_func ();
  };


  using namespace ::scope;
  void Derived::scoped_func ()
  {
    Base::func ();
  }

  using namespace ::foreign;
  void Derived::foreign_func ()
  {
    Base::func ();
  }
}

using namespace foreign;
void scope::Derived::outer_func ()
{
  Base::func ();
}

int
main (int argc, char const* argv[])
{
  scope::Derived ().default_func ();
  scope::Derived ().scoped_func ();
  scope::Derived ().foreign_func ();
  scope::Derived ().outer_func ();
  return 0;
}

