tests/cases/compiler/protectedMembers.ts(40,1): error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(41,1): error TS2445: Property 'f' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(42,1): error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(43,1): error TS2445: Property 'sf' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(46,1): error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(47,1): error TS2445: Property 'f' is protected and only accessible within class 'C2' and its subclasses.
tests/cases/compiler/protectedMembers.ts(48,1): error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses.
tests/cases/compiler/protectedMembers.ts(49,1): error TS2445: Property 'sf' is protected and only accessible within class 'C2' and its subclasses.
tests/cases/compiler/protectedMembers.ts(68,9): error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'.
tests/cases/compiler/protectedMembers.ts(69,9): error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'.
tests/cases/compiler/protectedMembers.ts(86,5): error TS1089: 'protected' modifier cannot appear on a constructor declaration.
tests/cases/compiler/protectedMembers.ts(98,1): error TS2322: Type 'B1' is not assignable to type 'A1'.
  Property 'x' is protected but type 'B1' is not a class derived from 'A1'.
tests/cases/compiler/protectedMembers.ts(99,1): error TS2322: Type 'A1' is not assignable to type 'B1'.
  Property 'x' is protected in type 'A1' but public in type 'B1'.
tests/cases/compiler/protectedMembers.ts(112,7): error TS2415: Class 'B3' incorrectly extends base class 'A3'.
  Property 'x' is protected in type 'B3' but public in type 'A3'.


==== tests/cases/compiler/protectedMembers.ts (14 errors) ====
    // Class with protected members
    class C1 {
        protected x: number;
        protected static sx: number;
        protected f() {
            return this.x;
        }
        protected static sf() {
            return this.sx;
        }
    }
    
    // Derived class accessing protected members
    class C2 extends C1 {
        protected f() {
            return super.f() + this.x;
        }
        protected static sf() {
            return super.sf() + this.sx;
        }
    }
    
    // Derived class making protected members public
    class C3 extends C2 {
        x: number;
        static sx: number;
        f() {
            return super.f();
        }
        static sf() {
            return super.sf();
        }
    }
    
    var c1: C1;
    var c2: C2;
    var c3: C3;
    
    // All of these should be errors
    c1.x;
    ~~~~
!!! error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses.
    c1.f();
    ~~~~
!!! error TS2445: Property 'f' is protected and only accessible within class 'C1' and its subclasses.
    C1.sx;
    ~~~~~
!!! error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses.
    C1.sf();
    ~~~~~
!!! error TS2445: Property 'sf' is protected and only accessible within class 'C1' and its subclasses.
    
    // All of these should be errors
    c2.x;
    ~~~~
!!! error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses.
    c2.f();
    ~~~~
!!! error TS2445: Property 'f' is protected and only accessible within class 'C2' and its subclasses.
    C2.sx;
    ~~~~~
!!! error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses.
    C2.sf();
    ~~~~~
!!! error TS2445: Property 'sf' is protected and only accessible within class 'C2' and its subclasses.
    
    // All of these should be ok
    c3.x;
    c3.f();
    C3.sx;
    C3.sf();
    
    class A {
        protected x;
    }
    
    class B extends A {
        y;
    }
    
    class C extends A {
        z;
        static foo(a: A, b: B, c: C, d: D, e: E) {
            a.x = 1;  // Error, access must be through C or type derived from C
            ~~~
!!! error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'.
            b.x = 1;  // Error, access must be through C or type derived from C
            ~~~
!!! error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'.
            c.x = 1;
            d.x = 1;
            e.x = 1;
        }
    }
    
    class D extends C {
        d;
    }
    
    interface E extends C {
        e;
    }
    
    class CC {
        // Error, constructor cannot be protected
        protected constructor() {
        ~~~~~~~~~
!!! error TS1089: 'protected' modifier cannot appear on a constructor declaration.
        }
    }
    
    class A1 {
        protected x;
    }
    class B1 {
        x;
    }
    var a1: A1;
    var b1: B1;
    a1 = b1;  // Error, B1 doesn't derive from A1
    ~~
!!! error TS2322: Type 'B1' is not assignable to type 'A1'.
!!! error TS2322:   Property 'x' is protected but type 'B1' is not a class derived from 'A1'.
    b1 = a1;  // Error, x is protected in A1 but public in B1
    ~~
!!! error TS2322: Type 'A1' is not assignable to type 'B1'.
!!! error TS2322:   Property 'x' is protected in type 'A1' but public in type 'B1'.
    
    class A2 {
        protected x;
    }
    class B2 extends A2 {
        x;
    }
    
    class A3 {
        x;
    }
    // Error x is protected in B3 but public in A3
    class B3 extends A3 {
          ~~
!!! error TS2415: Class 'B3' incorrectly extends base class 'A3'.
!!! error TS2415:   Property 'x' is protected in type 'B3' but public in type 'A3'.
        protected x;
    }
    
    