tests/cases/compiler/protectedMembersThisParameter.ts(9,9): error TS2445: Property 'secret' is protected and only accessible within class 'Message' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(30,7): error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(41,7): error TS2446: Property 'a' is protected and only accessible through an instance of class 'C'. This is an instance of class 'B'.
tests/cases/compiler/protectedMembersThisParameter.ts(42,7): error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(46,7): error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(47,7): error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(51,7): error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(52,7): error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(55,7): error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(56,7): error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(64,9): error TS2445: Property 'd1' is protected and only accessible within class 'D1' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(68,9): error TS2445: Property 'd1' is protected and only accessible within class 'D1' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(76,9): error TS2445: Property 'd' is protected and only accessible within class 'D2' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(77,9): error TS2445: Property 'd2' is protected and only accessible within class 'D2' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(80,9): error TS2445: Property 'd' is protected and only accessible within class 'D2' and its subclasses.
tests/cases/compiler/protectedMembersThisParameter.ts(81,9): error TS2445: Property 'd2' is protected and only accessible within class 'D2' and its subclasses.


==== tests/cases/compiler/protectedMembersThisParameter.ts (16 errors) ====
    class Message {
      protected secret(): void {}
    }
    class MessageWrapper {
      message: Message = new Message();
      wrap<T>() {
        let m = this.message;
        let f = function(this: T) {
          m.secret(); // should error
            ~~~~~~
!!! error TS2445: Property 'secret' is protected and only accessible within class 'Message' and its subclasses.
        }
      }
    }
    
    class A {
      protected a() {}
    }
    class B extends A {
      protected b() {}
    }
    class C extends A {
      protected c() {}
    }
    class Z {
      protected z() {}
    }
    
    function bA<T extends A>(this: T, arg: B) {
      this.a();
      arg.a();
      arg.b(); // should error to avoid cross-hierarchy protected access https://www.typescriptlang.org/docs/handbook/2/classes.html#cross-hierarchy-protected-access
          ~
!!! error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
    }
    function bB<T extends B>(this: T, arg: B) {
      this.a();
      this.b();
      arg.a();
      arg.b();
    }
    function bC<T extends C>(this: T, arg: B) {
      this.a();
      this.c();
      arg.a(); // should error
          ~
!!! error TS2446: Property 'a' is protected and only accessible through an instance of class 'C'. This is an instance of class 'B'.
      arg.b(); // should error
          ~
!!! error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
    }
    function bZ<T extends Z>(this: T, arg: B) {
      this.z();
      arg.a(); // should error
          ~
!!! error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
      arg.b(); // should error
          ~
!!! error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
    }
    function bString<T extends string>(this: T, arg: B) {
      this.toLowerCase();
      arg.a(); // should error
          ~
!!! error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
      arg.b(); // should error
          ~
!!! error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
    }
    function bAny<T>(this: T, arg: B) {
      arg.a(); // should error
          ~
!!! error TS2445: Property 'a' is protected and only accessible within class 'A' and its subclasses.
      arg.b(); // should error
          ~
!!! error TS2445: Property 'b' is protected and only accessible within class 'B' and its subclasses.
    }
    
    class D {
      protected d() {}
    
      derived1(arg: D1) {
        arg.d();
        arg.d1(); // should error
            ~~
!!! error TS2445: Property 'd1' is protected and only accessible within class 'D1' and its subclasses.
      }
      derived1ThisD(this: D, arg: D1) {
        arg.d();
        arg.d1(); // should error
            ~~
!!! error TS2445: Property 'd1' is protected and only accessible within class 'D1' and its subclasses.
      }
      derived1ThisD1(this: D1, arg: D1) {
        arg.d();
        arg.d1();
      }
    
      derived2(arg: D2) {
        arg.d(); // should error because of overridden method in D2
            ~
!!! error TS2445: Property 'd' is protected and only accessible within class 'D2' and its subclasses.
        arg.d2(); // should error
            ~~
!!! error TS2445: Property 'd2' is protected and only accessible within class 'D2' and its subclasses.
      }
      derived2ThisD(this: D, arg: D2) {
        arg.d(); // should error because of overridden method in D2
            ~
!!! error TS2445: Property 'd' is protected and only accessible within class 'D2' and its subclasses.
        arg.d2(); // should error
            ~~
!!! error TS2445: Property 'd2' is protected and only accessible within class 'D2' and its subclasses.
      }
      derived2ThisD2(this: D2, arg: D2) {
        arg.d();
        arg.d2();
      }
    }
    class D1 extends D {
      protected d1() {}
    }
    class D2 extends D {
      protected d() {}
      protected d2() {}
    }
    
    