diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b45e281c89f..b43c86b0f6d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3574,7 +3574,8 @@ module ts { // Since removeSubtypes checks the subtype relation, and the subtype relation on a union // may attempt to reduce a union, it is possible that removeSubtypes could be called - // recursively on the same set of types. + // recursively on the same set of types. The removeSubtypesStack is used to track which + // sets of types are currently undergoing subtype reduction. let removeSubtypesStack: string[] = []; function removeSubtypes(types: Type[]) { let typeListId = getTypeListId(types); diff --git a/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.errors.txt b/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.errors.txt new file mode 100644 index 00000000000..0f15bd1ed3a --- /dev/null +++ b/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.errors.txt @@ -0,0 +1,45 @@ +tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts(19,1): error TS2322: Type 'Property' is not assignable to type 'Class'. + Types of property 'parent' are incompatible. + Type 'Module | Class' is not assignable to type 'Namespace'. + Type 'Class' is not assignable to type 'Namespace'. + Property 'members' is missing in type 'Class'. +tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts(20,1): error TS2322: Type 'Class' is not assignable to type 'Property'. + Types of property 'parent' are incompatible. + Type 'Namespace' is not assignable to type 'Module | Class'. + Type 'Namespace' is not assignable to type 'Class'. + Property 'parent' is missing in type 'Namespace'. + + +==== tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts (2 errors) ==== + class Module { + public members: Class[]; + } + + class Namespace { + public members: (Class | Property)[]; + } + + class Class { + public parent: Namespace; + } + + class Property { + public parent: Module | Class; + } + + var c: Class; + var p: Property; + c = p; + ~ +!!! error TS2322: Type 'Property' is not assignable to type 'Class'. +!!! error TS2322: Types of property 'parent' are incompatible. +!!! error TS2322: Type 'Module | Class' is not assignable to type 'Namespace'. +!!! error TS2322: Type 'Class' is not assignable to type 'Namespace'. +!!! error TS2322: Property 'members' is missing in type 'Class'. + p = c; + ~ +!!! error TS2322: Type 'Class' is not assignable to type 'Property'. +!!! error TS2322: Types of property 'parent' are incompatible. +!!! error TS2322: Type 'Namespace' is not assignable to type 'Module | Class'. +!!! error TS2322: Type 'Namespace' is not assignable to type 'Class'. +!!! error TS2322: Property 'parent' is missing in type 'Namespace'. \ No newline at end of file diff --git a/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.js b/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.js new file mode 100644 index 00000000000..6b3c61dbeed --- /dev/null +++ b/tests/baselines/reference/unionTypeWithRecursiveSubtypeReduction2.js @@ -0,0 +1,47 @@ +//// [unionTypeWithRecursiveSubtypeReduction2.ts] +class Module { + public members: Class[]; +} + +class Namespace { + public members: (Class | Property)[]; +} + +class Class { + public parent: Namespace; +} + +class Property { + public parent: Module | Class; +} + +var c: Class; +var p: Property; +c = p; +p = c; + +//// [unionTypeWithRecursiveSubtypeReduction2.js] +var Module = (function () { + function Module() { + } + return Module; +})(); +var Namespace = (function () { + function Namespace() { + } + return Namespace; +})(); +var Class = (function () { + function Class() { + } + return Class; +})(); +var Property = (function () { + function Property() { + } + return Property; +})(); +var c; +var p; +c = p; +p = c; diff --git a/tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts b/tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts new file mode 100644 index 00000000000..31a8bbe0b67 --- /dev/null +++ b/tests/cases/compiler/unionTypeWithRecursiveSubtypeReduction2.ts @@ -0,0 +1,20 @@ +class Module { + public members: Class[]; +} + +class Namespace { + public members: (Class | Property)[]; +} + +class Class { + public parent: Namespace; +} + +class Property { + public parent: Module | Class; +} + +var c: Class; +var p: Property; +c = p; +p = c; \ No newline at end of file