tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(13,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(19,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(30,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(36,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(51,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(57,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(63,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(77,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(82,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(89,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(96,13): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(101,13): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(103,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(105,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(111,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(112,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(122,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(127,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(129,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(139,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(141,5): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(148,9): error TS7027: Unreachable code detected.
tests/cases/conformance/controlFlow/neverReturningFunctions1.ts(153,5): error TS7027: Unreachable code detected.


==== tests/cases/conformance/controlFlow/neverReturningFunctions1.ts (23 errors) ====
    function fail(message?: string): never {
        throw new Error(message);
    }
    
    function f01(x: string | undefined) {
        if (x === undefined) fail("undefined argument");
        x.length;  // string
    }
    
    function f02(x: number): number {
        if (x >= 0) return x;
        fail("negative number");
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f03(x: string) {
        x;  // string
        fail();
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f11(x: string | undefined, fail: (message?: string) => never) {
        if (x === undefined) fail("undefined argument");
        x.length;  // string
    }
    
    function f12(x: number, fail: (message?: string) => never): number {
        if (x >= 0) return x;
        fail("negative number");
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f13(x: string, fail: (message?: string) => never) {
        x;  // string
        fail();
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    namespace Debug {
        export declare function fail(message?: string): never;
    }
    
    function f21(x: string | undefined) {
        if (x === undefined) Debug.fail("undefined argument");
        x.length;  // string
    }
    
    function f22(x: number): number {
        if (x >= 0) return x;
        Debug.fail("negative number");
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f23(x: string) {
        x;  // string
        Debug.fail();
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f24(x: string) {
        x;  // string
        ((Debug).fail)();
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    class Test {
        fail(message?: string): never {
            throw new Error(message);
        }
        f1(x: string | undefined) {
            if (x === undefined) this.fail("undefined argument");
            x.length;  // string
        }
        f2(x: number): number {
            if (x >= 0) return x;
            this.fail("negative number");
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        f3(x: string) {
            x;  // string
            this.fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
    }
    
    function f30(x: string | number | undefined) {
        if (typeof x === "string") {
            fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        else {
            x;  // number | undefined
            if (x !== undefined) {
                x;  // number
                fail();
                x;  // Unreachable
                ~~
!!! error TS7027: Unreachable code detected.
            }
            else {
                x;  // undefined
                fail();
                x;  // Unreachable
                ~~
!!! error TS7027: Unreachable code detected.
            }
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f31(x: { a: string | number }) {
        if (typeof x.a === "string") {
            fail();
            x;    // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
            x.a;  // Unreachable
            ~~~~
!!! error TS7027: Unreachable code detected.
        }
        x;    // { a: string | number }
        x.a;  // number
    }
    
    function f40(x: number) {
        try {
            x;
            fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        finally {
            x;
            fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f41(x: number) {
        try {
            x;
        }
        finally {
            x;
            fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f42(x: number) {
        try {
            x;
            fail();
            x;  // Unreachable
            ~~
!!! error TS7027: Unreachable code detected.
        }
        finally {
            x;
        }
        x;  // Unreachable
        ~~
!!! error TS7027: Unreachable code detected.
    }
    
    function f43() {
        const fail = (): never => { throw new Error(); };
        const f = [fail];
        fail();  // No effect (missing type annotation)
        f[0]();  // No effect (not a dotted name)
        f;
    }
    
    // Repro from #33582
    
    export interface Component<T extends object = any> {
    	attrName?: string;
    	data: T;
    	dependencies?: string[];
    	el: any;
    	id: string;
    	multiple?: boolean;
    	name: string;
    	schema: unknown;
    	system: any;
    
    	init(data?: T): void;
    	pause(): void;
    	play(): void;
    	remove(): void;
    	tick?(time: number, timeDelta: number): void;
    	update(oldData: T): void;
    	updateSchema?(): void;
    
    	extendSchema(update: unknown): void;
    	flushToDOM(): void;
    }
    
    export interface ComponentConstructor<T extends object> {
    	new (el: unknown, attrValue: string, id: string): T & Component;
    	prototype: T & {
    		name: string;
    		system: unknown;
    		play(): void;
    		pause(): void;
    	};
    }
    
    declare function registerComponent<T extends object>(
        name: string,
        component: ComponentDefinition<T>
    ): ComponentConstructor<T>;
    
    export type ComponentDefinition<T extends object = object> = T & Partial<Component> & ThisType<T & Component>;
    
    const Component = registerComponent('test-component', {
    	schema: {
    		myProperty: {
    			default: [],
    			parse() {
    				return [true];
    			}
    		},
    		string: { type: 'string' },
    		num: 0
    	},
    	init() {
    		this.data.num = 0;
    		this.el.setAttribute('custom-attribute', 'custom-value');
    	},
    	update() {},
    	tick() {},
    	remove() {},
    	pause() {},
    	play() {},
    
    	multiply(f: number) {
    		// Reference to system because both were registered with the same name.
    		return f * this.data.num * this.system!.data.counter;
    	}
    });
    
    // Repro from #36147
    
    class MyThrowable {
        throw(): never {
            throw new Error();
        }
    }
    
    class SuperThrowable extends MyThrowable {
        err(msg: string): never {
            super.throw()
        }
        ok(): never {
            this.throw()
        }
    }
    