// CompVC
#using <mscorlib.dll>
using namespace System;

namespace CompVC {
 __gc public class Top {};
 __gc public class Middle: public Top {};
 __gc public class Bottom: public Middle {};

 __gc public class Up {

       public:
  virtual void cv(Top* t) {
   Console::WriteLine(L"cv(Top) in Up using VC!");
  }

  virtual void ctv(Bottom* b) {
   Console::WriteLine(L"ctv(Bottom) in Up using VC!");
  }
 };

};

// ClientVCVC
#using <mscorlib.dll>
using namespace System;

#using "..\Bin\CompVC.dll"
using namespace CompVC;

__gc public class Down : public Up {

    public:
  virtual void cv(Middle* t) {
   Console::WriteLine(L"cv(Middle) in Down using VC!");
  }

  virtual void ctv(Middle* b) {
   Console::WriteLine(L"ctv(Middle) in Down using VC!");
  }
 };

// method called "Main" is application's entry point function
void main() {

  Down* d = new Down(); // always the same

  Console::WriteLine(L"-- Calls VC from VC --");
  Up* u = new Up();
  Up* ud = new Down();

  Console::WriteLine(" Up u");
  u->cv(new Top());
  u->cv(new Middle());
  u->cv(new Bottom());
  //u->ctv(new Top());
  Console::WriteLine("Compilation error");
  //u->ctv(new Middle());
  Console::WriteLine("Compilation error");
  u->ctv(new Bottom());
  Console::WriteLine(" Down d");
  //d->cv(new Top());
  Console::WriteLine("Compilation error");
  d->cv(new Middle());
  d->cv(new Bottom());
  //d->ctv(new Top());
  Console::WriteLine("Compilation error");
  d->ctv(new Middle());
  d->ctv(new Bottom());
  Console::WriteLine(" Up ud");
  ud->cv(new Top());
  ud->cv(new Middle());
  ud->cv(new Bottom());
  //ud->ctv(new Top());
  Console::WriteLine("Compilation error");
  //ud->ctv(new Middle());
  Console::WriteLine("Compilation error");
  ud->ctv(new Bottom());
}

-- Calls VC from VC --
 Up u
cv(Top) in Up using VC!
cv(Top) in Up using VC!
cv(Top) in Up using VC!
Compilation error
Compilation error
ctv(Bottom) in Up using VC!
 Down d
Compilation error
cv(Middle) in Down using VC!
cv(Middle) in Down using VC!
Compilation error
ctv(Middle) in Down using VC!
ctv(Middle) in Down using VC!
 Up ud
cv(Top) in Up using VC!
cv(Top) in Up using VC!
cv(Top) in Up using VC!
Compilation error
Compilation error
ctv(Bottom) in Up using VC!