module M {
  typedef long ArgType;
  const long I = 10;
  typedef short Y;
  interface A {
    struct S {
      struct T {
        ArgType x[I]; // ArgType and I introduced
        long y; // a new y is defined, the existing Y
                // is not used
      } m;
    };
    typedef string ArgType; // Error: ArgType redefined
    enum I { I1, I2 }; // Error: I redefined
    typedef short Y; // OK
  }; // Potential scope of ArgType and I ends here
  interface B : A {
    typedef long ArgType; // OK, redefined in derived interface
    struct S { // OK, redefined in derived interface
      ArgType x; // x is a long
      A::ArgType y; // y is a string
    };
  };
};
