From 93dbec5e710a8cb28ca8b7f0c70b9ade4a8fc911 Mon Sep 17 00:00:00 2001
Date: Sat, 15 Jan 2022 21:39:48 +0800
Subject: [PATCH] test patch

---
 .../ambient/ambientDeclarations.ts            |   1 +
 .../ambientDeclarationsPatterns.ts            |  11 +
 .../declarations.d.ts                         |  18 +
 .../ambient/ambientInsideNonAmbient.ts        |   2 +
 .../ambientInsideNonAmbientExternalModule.ts  |   4 +-
 .../ambientShorthand_merging.ts               |   6 +
 .../declarations1.d.ts                        |   2 +
 .../declarations2.d.ts                        |   4 +
 .../ambientShorthand_reExport.ts              |   5 +
 .../declarations.d.ts                         |   2 +
 .../ambientShorthand_reExport/jquery.d.ts     |   2 +
 .../ambientShorthand_reExport/reExportAll.ts  |   2 +
 .../ambientShorthand_reExport/reExportX.ts    |   2 +
 .../async/es5/asyncMethodWithSuper_es5.ts     |   1 +
 .../asyncOrYieldAsBindingIdentifier1.ts       |  49 ++
 .../classAbstractAsIdentifier.ts              |   2 +-
 .../classBody/classWithEmptyBody.ts           |   4 +-
 .../classDeclarations/classInsideBlock.ts     |   1 +
 .../classWithPredefinedTypesAsNames.ts        |   4 +-
 .../classWithSemicolonClassElement1.ts        |   3 +-
 .../classWithSemicolonClassElement2.ts        |   3 +-
 .../classExpressions/classExpression2.ts      |   4 +-
 .../classStaticBlock/classStaticBlock1.ts     |  11 +
 .../classStaticBlock/classStaticBlock10.ts    |  30 ++
 .../classStaticBlock/classStaticBlock11.ts    |  15 +
 .../classStaticBlock/classStaticBlock12.ts    |  10 +
 .../classStaticBlock/classStaticBlock13.ts    |  14 +
 .../classStaticBlock/classStaticBlock14.ts    |  15 +
 .../classStaticBlock/classStaticBlock15.ts    |  18 +
 .../classStaticBlock/classStaticBlock16.ts    |  26 +
 .../classStaticBlock/classStaticBlock17.ts    |  33 ++
 .../classStaticBlock/classStaticBlock18.ts    |  15 +
 .../classStaticBlock/classStaticBlock19.ts    |   6 +
 .../classStaticBlock/classStaticBlock2.ts     |  20 +
 .../classStaticBlock/classStaticBlock20.ts    |  13 +
 .../classStaticBlock/classStaticBlock21.ts    |   7 +
 .../classStaticBlock/classStaticBlock22.ts    |  72 +++
 .../classStaticBlock/classStaticBlock23.ts    |  21 +
 .../classStaticBlock/classStaticBlock24.ts    |   8 +
 .../classStaticBlock/classStaticBlock25.ts    |  23 +
 .../classStaticBlock/classStaticBlock26.ts    |  30 ++
 .../classStaticBlock/classStaticBlock27.ts    |  17 +
 .../classStaticBlock/classStaticBlock3.ts     |  19 +
 .../classStaticBlock/classStaticBlock4.ts     |  16 +
 .../classStaticBlock/classStaticBlock5.ts     |  19 +
 .../classStaticBlock/classStaticBlock6.ts     |  62 +++
 .../classStaticBlock/classStaticBlock7.ts     |  43 ++
 .../classStaticBlock/classStaticBlock8.ts     |  48 ++
 .../classStaticBlock/classStaticBlock9.ts     |   8 +
 .../classStaticBlockUseBeforeDef1.ts          |  15 +
 .../classStaticBlockUseBeforeDef2.ts          |  10 +
 .../classConstructorAccessibility4.ts         |   4 +-
 ...structorImplementationWithDefaultValues.ts |   6 +-
 .../declarationEmitReadonly.ts                |   3 +-
 .../quotedConstructors.ts                     |   4 +
 ...idesIndexersWithAssignmentCompatibility.ts |   4 +-
 .../superInStaticMembers1.ts                  | 492 ++++++++++++++++++
 .../thisAndSuperInStaticMembers1.ts           |  42 ++
 .../thisAndSuperInStaticMembers2.ts           |  42 ++
 .../thisAndSuperInStaticMembers3.ts           |  26 +
 .../thisAndSuperInStaticMembers4.ts           |  26 +
 .../typeOfThisInStaticMembers.ts              |   3 +-
 .../typeOfThisInStaticMembers10.ts            |  51 ++
 .../typeOfThisInStaticMembers11.ts            |  51 ++
 .../typeOfThisInStaticMembers12.ts            |  10 +
 .../typeOfThisInStaticMembers13.ts            |  10 +
 .../typeOfThisInStaticMembers3.ts             |  12 +
 .../typeOfThisInStaticMembers4.ts             |  12 +
 .../typeOfThisInStaticMembers5.ts             |   9 +
 .../typeOfThisInStaticMembers6.ts             |   7 +
 .../typeOfThisInStaticMembers7.ts             |  12 +
 .../typeOfThisInStaticMembers8.ts             |  19 +
 .../typeOfThisInStaticMembers9.ts             |  22 +
 .../privateNameComputedPropertyName3.ts       |   2 +
 .../privateNames/privateNameFieldAccess.ts    |   1 +
 .../privateNames/privateNameHashCharName.ts   |  11 +
 .../privateNames/privateNameInInExpression.ts | 119 +++++
 .../privateNameInInExpressionTransform.ts     |  47 ++
 .../privateNameInInExpressionUnused.ts        |  13 +
 .../privateNamesIncompatibleModifiersJs.ts    |  65 +++
 .../classes/mixinClassesAnnotated.ts          |   3 +
 .../classes/mixinClassesAnonymous.ts          |   2 +
 .../classes/mixinClassesMembers.ts            |   5 +
 .../abstractProperty.ts                       |   3 +
 .../abstractPropertyInitializer.ts            |   5 +
 .../instanceMemberInitialization.ts           |   7 +-
 ...instanceMemberWithComputedPropertyName2.ts |   1 +
 .../staticFactory1.ts                         |   3 +-
 .../staticAndNonStaticPropertiesSameName.ts   |   3 +-
 .../staticPropertyAndFunctionWithSameName.ts  |   4 +-
 ...icPropertyNameConflictsInAmbientContext.ts |  10 +
 .../controlFlow/assertionTypePredicates2.ts   |  27 +
 .../controlFlow/controlFlowAliasing.ts        | 285 ++++++++++
 .../controlFlowAliasingCatchVariables.ts      |  28 +
 .../controlFlow/controlFlowElementAccess2.ts  |   2 +-
 .../controlFlow/controlFlowForInStatement2.ts |  25 +
 .../controlFlow/controlFlowInOperator.ts      |  26 +
 .../controlFlowInstanceofExtendsFunction.ts   |   4 +-
 .../controlFlowSuperPropertyAccess.ts         |   1 +
 .../controlFlow/controlFlowTypeofObject.ts    |  71 +++
 .../dependentDestructuredVariables.ts         | 161 ++++++
 .../typeGuardsNestedAssignments.ts            |   3 +-
 .../controlFlow/typeGuardsTypeParameters.ts   |   1 +
 .../declarationEmitWorkWithInlineComments.ts  |   5 +-
 .../declarationEmitThisPredicates01.ts        |   3 +-
 ...tionEmitThisPredicatesWithPrivateName01.ts |   3 +-
 .../typeReferenceRelatedFiles/fs.d.ts         |   5 +
 .../typeReferenceRelatedFiles/main.ts         |   2 +
 .../typeReferenceRelatedFiles/package.json    |   4 +
 .../typeReferenceRelatedFiles.ts              |  18 +
 .../decoratorOnClassConstructorParameter5.ts  |  15 +
 .../class/decoratedBlockScopedClass1.ts       |  16 +
 .../class/decoratedBlockScopedClass2.ts       |  19 +
 .../class/decoratedBlockScopedClass3.ts       |  27 +
 .../class/method/decoratorOnClassMethod14.ts  |  14 +
 .../class/method/decoratorOnClassMethod15.ts  |  12 +
 .../class/method/decoratorOnClassMethod16.ts  |  12 +
 .../class/method/decoratorOnClassMethod17.ts  |  11 +
 .../class/method/decoratorOnClassMethod18.ts  |  11 +
 .../decoratorMetadataWithTypeOnlyImport2.ts   |  17 +
 ...ter.asyncGenerators.classMethods.es2015.ts |  11 +
 .../conformance/es2018/es2018IntlAPIs.ts      |   7 +
 .../conformance/es2020/es2020IntlAPIs.ts      |  45 ++
 ...tionWithPropertyAccessInHeritageClause1.ts |   4 +-
 .../superCallBeforeThisAccessing1.ts          |   1 +
 .../superCallBeforeThisAccessing2.ts          |   1 +
 .../superCallBeforeThisAccessing5.ts          |   1 +
 .../superCallBeforeThisAccessing8.ts          |   1 +
 .../es6/spread/arraySpreadImportHelpers.ts    |  16 +
 ...mplateStringWithCommentsInArrowFunction.ts |  14 +
 .../expressions/asOperator/asOperatorASI.ts   |   1 +
 .../comparisonOperatorWithIdenticalObjects.ts |   6 +-
 .../comparisonOperatorWithIntersectionType.ts |   5 +
 ...nshipObjectsOnInstantiatedCallSignature.ts |   4 +-
 ...jectsOnInstantiatedConstructorSignature.ts |   4 +-
 ...peratorWithSubtypeObjectOnCallSignature.ts |   3 +-
 ...WithSubtypeObjectOnConstructorSignature.ts |   3 +-
 ...eratorWithSubtypeObjectOnIndexSignature.ts |   3 +-
 ...ubtypeObjectOnInstantiatedCallSignature.ts |   3 +-
 ...bjectOnInstantiatedConstructorSignature.ts |   3 +-
 ...isonOperatorWithSubtypeObjectOnProperty.ts |   6 +-
 ...anceofOperatorWithInvalidStaticToString.ts |   3 +
 .../instanceofOperatorWithLHSIsObject.ts      |   1 +
 ...ommaOperatorWithSecondOperandObjectType.ts |   1 +
 .../conditionalOperatorWithIdenticalBCT.ts    |   3 +
 .../superCallParameterContextualTyping1.ts    |   2 +
 .../superCallParameterContextualTyping3.ts    |   3 +-
 .../functionCalls/callWithSpread.ts           |   1 +
 .../functions/arrowFunctionExpressions.ts     |   1 +
 .../newOperator/newOperatorConformance.ts     |   1 +
 .../expressions/superCalls/superCalls.ts      |   2 +
 .../thisKeyword/typeOfThisGeneral.ts          | 178 +++++++
 .../typeGuards/TypeGuardWithArrayUnion.ts     |   1 +
 .../typeGuards/typeGuardFunction.ts           |   6 +-
 .../typeGuards/typeGuardFunctionGenerics.ts   |   4 +-
 .../typeGuardOfFormExpr1AndExpr2.ts           |   3 +-
 .../typeGuards/typeGuardOfFormExpr1OrExpr2.ts |   3 +-
 .../typeGuards/typeGuardOfFormInstanceOf.ts   |  45 +-
 .../typeGuards/typeGuardOfFormIsType.ts       |   5 +-
 .../typeGuardOfFormTypeOfBoolean.ts           |   1 +
 .../typeGuards/typeGuardOfFormTypeOfNumber.ts |   1 +
 .../typeGuards/typeGuardOfFormTypeOfString.ts |   1 +
 .../typeGuardOfFromPropNameInUnionType.ts     |   9 +
 .../typeGuards/typeGuardsInClassAccessors.ts  |   1 +
 .../typeGuards/typeGuardsInClassMethods.ts    |   1 +
 .../typeGuards/typeGuardsInProperties.ts      |   3 +-
 .../typeGuards/typeGuardsOnClassProperty.ts   |   3 +-
 .../bitwiseNotOperatorWithNumberType.ts       |   3 +-
 .../bitwiseNotOperatorWithStringType.ts       |   3 +-
 .../externalModules/exportNonVisibleType.ts   |   1 +
 .../moduleResolutionWithoutExtension1.ts      |  12 +
 .../moduleResolutionWithoutExtension2.ts      |   6 +
 .../moduleResolutionWithoutExtension3.ts      |  12 +
 .../moduleResolutionWithoutExtension4.ts      |  12 +
 .../moduleResolutionWithoutExtension5.ts      |   6 +
 .../moduleResolutionWithoutExtension6.ts      |   8 +
 .../moduleResolutionWithoutExtension7.ts      |   6 +
 .../moduleResolutionWithoutExtension8.ts      |   6 +
 .../typeOnly/exportSpecifiers.ts              |  21 +
 .../typeOnly/importDefaultNamedType/a.ts      |   2 +
 .../importDefaultNamedType.ts                 |   5 +
 .../typeOnly/importSpecifiers1.ts             |  46 ++
 .../typeOnly/preserveValueImports.ts          |  28 +
 .../typeOnly/preserveValueImports_errors.ts   |  47 ++
 ...erveValueImports_importsNotUsedAsValues.ts |  14 +
 .../preserveValueImports_mixedImports.ts      |  13 +
 .../typeOnly/preserveValueImports_module.ts   |   4 +
 .../importAssertion/importAssertion1.ts       |  37 ++
 .../importAssertion/importAssertion2.ts       |  17 +
 .../importAssertion/importAssertion3.ts       |  15 +
 .../importAssertion/importAssertion4.ts       |   1 +
 .../importAssertion/importAssertion5.ts       |   1 +
 .../mergedInterfacesWithMultipleBases3.ts     |   6 +-
 .../interfaceExtendsObjectIntersection.ts     |  12 +
 .../interfaceWithPropertyOfEveryType.ts       |   3 +-
 ...duleAndAmbientWithSameNameAndCommonRoot.ts |   1 -
 ...onAmbientClassWithSameNameAndCommonRoot.ts |   1 +
 ...ionAndNonExportedFunctionThatShareAName.ts |   4 +-
 ...ortedAndNonExportedClassesOfTheSameName.ts |   4 +
 ...rgeEachWithExportedModulesOfTheSameName.ts |   2 +
 .../codeGeneration/exportCodeGen.ts           |   2 +
 .../codeGeneration/nameCollision.ts           |   1 +
 .../jsdoc/constructorTagOnClassConstructor.ts |   4 +-
 ...bclassWithExplicitNoArgumentConstructor.ts |   3 +-
 .../declarations/jsDeclarationsThisTypes.ts   |   4 +-
 .../jsdoc/enumTagImported/enumTagImported.ts  |  23 +
 tests/cases/conformance/jsdoc/extendsTag1.ts  |   1 +
 .../jsdocAugments_qualifiedName.ts            |  10 +
 .../jsdoc/jsdocAugments_withTypeParameter.ts  |   1 +
 .../jsdocImplements_namespacedInterface.ts    |   2 +
 .../jsdoc/jsdocTemplateTagDefault.ts          |  71 +++
 .../jsdoc/jsdocTemplateTagNameResolution.ts   |  16 +
 .../jsdoc/jsdocTypeReferenceUseBeforeDef.ts   |   1 +
 .../conformance/jsdoc/jsdocVariadicType.ts    |  12 +
 tests/cases/conformance/jsdoc/seeTag3.ts      |   7 +
 tests/cases/conformance/jsdoc/thisTag2.ts     |  11 +
 .../conformance/jsx/jsxParsingError4.tsx      |  18 +
 .../jsx/jsxUnclosedParserRecovery.ts          | 140 +++++
 .../jsx/tsxReactEmitSpreadAttribute.ts        |  32 ++
 .../declarationNotFoundPackageBundlesTypes.ts |  23 +
 .../scopedPackages/index.d.ts                 |   3 +
 .../scopedPackages/scopedPackages.ts          |  12 +
 .../moduleResolution/scopedPackages/z.d.ts    |   2 +
 .../scopedPackagesClassic/index.d.ts          |   2 +
 .../scopedPackagesClassic.ts                  |   9 +
 .../untypedModuleImport_allowJs.ts            |  12 +
 .../declarations.d.ts                         |   4 +
 .../untypedModuleImport_vsAmbient.ts          |  12 +
 .../allowJs/nodeAllowJsPackageSelfName.ts     |  24 +
 .../node/allowJs/nodeModulesAllowJs1.ts       | 324 ++++++++++++
 .../allowJs/nodeModulesAllowJsCjsFromJs.ts    |   8 +
 ...ModulesAllowJsConditionalPackageExports.ts | 126 +++++
 .../nodeModulesAllowJsDynamicImport.ts        |  27 +
 .../nodeModulesAllowJsExportAssignment.ts     |  32 ++
 ...deModulesAllowJsGeneratedNameCollisions.ts |  29 ++
 .../nodeModulesAllowJsImportAssignment.ts     |  34 ++
 ...eModulesAllowJsImportHelpersCollisions1.ts |  34 ++
 ...eModulesAllowJsImportHelpersCollisions2.ts |  30 ++
 ...eModulesAllowJsImportHelpersCollisions3.ts |  32 ++
 .../allowJs/nodeModulesAllowJsImportMeta.ts   |  23 +
 .../nodeModulesAllowJsPackageExports.ts       |  92 ++++
 .../nodeModulesAllowJsPackageImports.ts       |  41 ++
 ...nodeModulesAllowJsPackagePatternExports.ts |  69 +++
 ...lesAllowJsPackagePatternExportsTrailers.ts |  69 +++
 ...nodeModulesAllowJsSynchronousCallErrors.ts |  37 ++
 .../nodeModulesAllowJsTopLevelAwait.ts        |  25 +
 ...lesExportsSpecifierGenerationConditions.ts |  33 ++
 tests/cases/conformance/node/nodeModules1.ts  | 321 ++++++++++++
 ...odeModulesCjsFormatFileAlwaysHasDefault.ts |  19 +
 .../nodeModulesConditionalPackageExports.ts   | 124 +++++
 ...tionEmitDynamicImportWithPackageExports.ts |  71 +++
 ...odulesDeclarationEmitWithPackageExports.ts |  93 ++++
 .../node/nodeModulesDynamicImport.ts          |  24 +
 .../node/nodeModulesExportAssignments.ts      |  20 +
 ...ModulesExportsBlocksSpecifierResolution.ts |  27 +
 ...lesExportsSpecifierGenerationConditions.ts |  34 ++
 ...ulesExportsSpecifierGenerationDirectory.ts |  29 ++
 ...odulesExportsSpecifierGenerationPattern.ts |  29 ++
 .../node/nodeModulesForbidenSyntax.ts         |  67 +++
 .../nodeModulesGeneratedNameCollisions.ts     |  26 +
 .../node/nodeModulesImportAssertions.ts       |  13 +
 .../node/nodeModulesImportAssignments.ts      |  31 ++
 .../nodeModulesImportHelpersCollisions.ts     |  31 ++
 .../nodeModulesImportHelpersCollisions2.ts    |  27 +
 .../nodeModulesImportHelpersCollisions3.ts    |  25 +
 .../conformance/node/nodeModulesImportMeta.ts |  20 +
 .../nodeModulesImportResolutionIntoExport.ts  |  24 +
 .../nodeModulesImportResolutionNoCycle.ts     |  24 +
 .../node/nodeModulesPackageExports.ts         |  90 ++++
 .../node/nodeModulesPackageImports.ts         |  38 ++
 .../node/nodeModulesPackagePatternExports.ts  |  67 +++
 ...odeModulesPackagePatternExportsTrailers.ts |  67 +++
 .../node/nodeModulesResolveJsonModule.ts      |  29 ++
 .../node/nodeModulesSynchronousCallErrors.ts  |  34 ++
 .../node/nodeModulesTopLevelAwait.ts          |  22 +
 .../nodeModulesTypesVersionPackageExports.ts  |  53 ++
 .../conformance/node/nodePackageSelfName.ts   |  21 +
 .../node/nodePackageSelfNameScoped.ts         |  21 +
 .../cases/conformance/override/override10.ts  |   3 +-
 .../cases/conformance/override/override12.ts  |   1 +
 .../cases/conformance/override/override15.ts  |   9 +
 .../cases/conformance/override/override16.ts  |   1 +
 .../cases/conformance/override/override17.ts  |   1 +
 .../cases/conformance/override/override18.ts  |   1 +
 .../cases/conformance/override/override19.ts  |  20 +
 .../cases/conformance/override/override20.ts  |  34 ++
 .../conformance/override/override_js1.ts      |   4 +-
 .../conformance/override/override_js4.ts      |  14 +
 .../parserClassDeclaration16.ts               |   3 +-
 .../parserClassDeclaration17.ts               |   1 +
 .../parserClassDeclaration19.ts               |   3 +-
 .../parserClassDeclaration20.ts               |   3 +-
 .../parserClassDeclaration23.ts               |   3 +-
 .../parserClassDeclaration26.ts               |   3 +-
 .../parserClassDeclarationIndexSignature1.ts  |   3 +-
 .../parserConstructorDeclaration1.ts          |   3 +-
 .../parserConstructorDeclaration5.ts          |   3 +-
 .../parserAccessibilityAfterStatic11.ts       |   1 +
 .../parserAccessibilityAfterStatic14.ts       |   1 +
 .../parserAccessibilityAfterStatic2.ts        |   1 +
 .../parserAccessibilityAfterStatic3.ts        |   1 +
 .../parserAccessibilityAfterStatic4.ts        |   1 +
 .../parserAccessibilityAfterStatic5.ts        |   1 +
 .../Generics/parserGenericClass1.ts           |   3 +-
 .../Generics/parserGenericClass2.ts           |   3 +-
 .../Generics/parserGenericConstraint1.ts      |   3 +-
 .../parserIndexMemberDeclaration1.ts          |   3 +-
 .../parserIndexMemberDeclaration2.ts          |   3 +-
 .../parserIndexMemberDeclaration3.ts          |   3 +-
 .../parserIndexMemberDeclaration4.ts          |   3 +-
 .../parserIndexMemberDeclaration6.ts          |   3 +-
 .../parserMemberVariableDeclaration5.ts       |   3 +-
 .../ecmascript5/Protected/Protected3.ts       |   3 +-
 .../ecmascript5/Protected/Protected5.ts       |   3 +-
 .../ecmascript5/Protected/Protected9.ts       |   3 +-
 .../RegressionTests/parser509546.ts           |   1 +
 .../RegressionTests/parser509546_1.ts         |   1 +
 .../RegressionTests/parser509546_2.ts         |   1 +
 .../parser/ecmascript5/parserUnicode3.ts      |   3 +-
 .../Iterators/parserForOfStatement22.ts       |   4 +
 .../Iterators/parserForOfStatement23.ts       |   6 +
 .../Iterators/parserForOfStatement24.ts       |   4 +
 .../inferringClassMembersFromAssignments3.ts  |   1 +
 .../conformance/salsa/plainJSBinderErrors.ts  |  44 ++
 .../conformance/salsa/plainJSRedeclare.ts     |   6 +
 .../conformance/salsa/plainJSRedeclare2.ts    |   7 +
 .../conformance/salsa/plainJSRedeclare3.ts    |   7 +
 .../salsa/plainJSReservedStrict.ts            |   7 +
 .../conformance/salsa/spellingUncheckedJS.ts  |  51 ++
 .../salsa/typeFromJSInitializer2.ts           |  18 +
 .../salsa/typeFromJSInitializer3.ts           |  18 +
 .../salsa/typeFromJSInitializer4.ts           |  29 ++
 .../salsa/typeFromPropertyAssignment23.ts     |   3 +
 .../for-inStatementsAsyncIdentifier.ts        |   4 +
 .../returnStatements/returnStatements.ts      |   1 +
 .../throwInEnclosingStatements.ts             |   1 +
 .../types/any/anyAsGenericFunctionCall.ts     |   4 +-
 .../types/any/assignAnyToEveryType.ts         |   4 +-
 .../types/any/assignEveryTypeToAny.ts         |   4 +-
 .../conformance/types/conditional/variance.ts |   2 +
 ...tatedFunctionInferenceWithTypeParameter.ts |   3 +
 .../types/import/importTypeAmbient.ts         |   5 +-
 .../types/import/importTypeGenericTypes.ts    |   5 +-
 .../types/import/importTypeLocal.ts           |   5 +
 .../intersectionOfUnionNarrowing.ts           |  16 +
 .../types/keyof/keyofAndIndexedAccess.ts      |  20 +
 .../types/literal/literalTypes2.ts            |   3 +
 .../types/localTypes/localTypes2.ts           |   3 +
 .../types/localTypes/localTypes3.ts           |   3 +
 .../mapped/mappedTypeAsClauseRelationships.ts |  27 +
 .../types/mapped/mappedTypeProperties.ts      |  42 ++
 .../conformance/types/mapped/mappedTypes3.ts  |   4 +-
 .../types/mapped/mappedTypesAndObjects.ts     |   2 +
 .../members/classWithProtectedProperty.ts     |   4 +-
 .../types/members/indexSignatures1.ts         | 325 ++++++++++++
 .../objectTypeHidingMembersOfObject.ts        |   4 +-
 .../types/members/objectTypePropertyAccess.ts |   2 +
 .../members/objectTypeWithNumericProperty.ts  |   4 +-
 ...hStringNamedPropertyOfIllegalCharacters.ts |   2 +
 .../typesWithSpecializedCallSignatures.ts     |   5 +-
 ...typesWithSpecializedConstructSignatures.ts |   5 +-
 .../namedTypes/classWithOptionalParameter.ts  |   5 +-
 .../types/namedTypes/optionalMethods.ts       |   3 +
 .../conformance/types/never/neverType.ts      |   2 +
 ...ureWithoutReturnTypeAnnotationInference.ts |   6 +-
 .../callSignaturesWithDuplicateParameters.ts  |   4 +-
 .../callSignaturesWithOptionalParameters.ts   |   2 +
 .../callSignaturesWithOptionalParameters2.ts  |   4 +-
 .../parametersWithNoAnnotationAreAny.ts       |   4 +-
 ...reIsNotSubtypeOfNonSpecializedSignature.ts |   3 +
 ...atureIsSubtypeOfNonSpecializedSignature.ts |   3 +
 ...gLiteralTypesInImplementationSignatures.ts |   2 +
 .../typeParameterAsTypeArgument.ts            |   4 +-
 ...WithOverloadsThatDifferOnlyByReturnType.ts |   5 +-
 .../indexSignatures/numericIndexingResults.ts |   4 +-
 .../indexSignatures/stringIndexingResults.ts  |   2 +
 .../propertyNameWithoutTypeAnnotation.ts      |   4 +-
 .../propertyNamesOfReservedWords.ts           |   4 +-
 .../stringNamedPropertyAccess.ts              |   4 +-
 .../number/extendNumberInterface.ts           |   2 +-
 .../undefined/invalidUndefinedValues.ts       |   4 +-
 .../undefined/validUndefinedAssignments.ts    |   4 +-
 .../types/rest/objectRestParameter.ts         |   1 +
 .../typeLiterals/arrayOfFunctionTypes3.ts     |   4 +-
 .../functionLiteralForOverloads2.ts           |   5 +-
 .../typeQueries/typeQueryOnClass.ts           |   5 +-
 .../typeQueries/typeQueryWithReservedWords.ts |   1 +
 .../typeQueries/typeofClass2.ts               |   5 +-
 .../typeQueries/typeofModuleWithoutExports.ts |   3 +-
 .../specifyingTypes/typeQueries/typeofThis.ts | 146 ++++++
 .../typeQueries/typeofThisWithImplicitThis.ts |   5 +
 .../types/spread/spreadDuplicate.ts           |  21 +
 .../types/spread/spreadDuplicateExact.ts      |  22 +
 .../conformance/types/spread/spreadUnion4.ts  |   4 +
 .../types/thisType/fluentClasses.ts           |   2 +
 .../types/thisType/thisTypeAndConstraints.ts  |   3 +
 .../types/thisType/thisTypeInClasses.ts       |   6 +
 .../types/thisType/thisTypeInFunctions3.ts    |   3 +
 .../thisType/thisTypeInTaggedTemplateCall.ts  |  10 +
 .../types/tuple/readonlyArraysAndTuples2.ts   |   2 +
 .../circularTypeAliasForUnionWithClass.ts     |   4 +
 .../classDoesNotDependOnBaseTypes.ts          |   4 +-
 .../types/typeAliases/typeAliases.ts          |   4 +-
 ...allGenericFunctionWithZeroTypeArguments.ts |   5 +-
 .../functionConstraintSatisfaction.ts         |   5 +-
 .../functionConstraintSatisfaction3.ts        |   5 +-
 .../innerTypeParameterShadowingOuterOne2.ts   |   4 +-
 ...rtyAccessOnTypeParameterWithConstraints.ts |   3 +-
 ...tyAccessOnTypeParameterWithConstraints2.ts |   7 +-
 ...tyAccessOnTypeParameterWithConstraints3.ts |   4 +-
 ...AccessOnTypeParameterWithoutConstraints.ts |   4 +-
 .../typeParameterUsedAsConstraint.ts          |   7 +
 .../anyAssignabilityInInheritance.ts          |   6 +-
 .../anyAssignableToEveryType.ts               |   1 +
 .../anyAssignableToEveryType2.ts              |   3 +
 .../assignmentCompatWithObjectMembers.ts      |   5 +-
 .../assignmentCompatWithObjectMembers2.ts     |   2 +
 .../assignmentCompatWithObjectMembers3.ts     |   2 +
 ...mentCompatWithObjectMembersNumericNames.ts |   2 +
 ...allSignatureAssignabilityInInheritance2.ts |   6 +-
 ...allSignatureAssignabilityInInheritance4.ts |   6 +-
 ...allSignatureAssignabilityInInheritance5.ts |   5 +-
 ...uctSignatureAssignabilityInInheritance2.ts |   6 +-
 ...uctSignatureAssignabilityInInheritance4.ts |   5 +-
 ...uctSignatureAssignabilityInInheritance5.ts |   5 +-
 .../everyTypeAssignableToAny.ts               |   2 +
 .../nullAssignableToEveryType.ts              |   2 +-
 .../undefinedAssignableToEveryType.ts         |   1 +
 .../bestCommonTypeOfConditionalExpressions.ts |   5 +-
 ...bestCommonTypeOfConditionalExpressions2.ts |   4 +-
 .../heterogeneousArrayLiterals.ts             |   2 +
 .../narrowingConstrainedTypeVariable.ts       |   3 +
 .../arrayLiteralsWithRecursiveGenerics.ts     |   6 +-
 .../recursiveTypeInGenericConstraint.ts       |   5 +-
 .../recursiveTypesUsedAsFunctionParameters.ts |   5 +-
 .../nullIsSubtypeOfEverythingButUndefined.ts  |   4 +
 .../stringLiteralTypeIsSubtypeOfString.ts     |   4 +-
 .../subtypesAndSuperTypes/subtypesOfAny.ts    |   5 +-
 ...subtypesOfTypeParameterWithConstraints2.ts |   5 +-
 .../subtypingWithCallSignatures2.ts           |   6 +
 .../subtypingWithCallSignatures3.ts           |   4 +
 .../subtypingWithCallSignatures4.ts           |   6 +-
 .../subtypingWithConstructSignatures2.ts      |   5 +
 .../subtypingWithConstructSignatures3.ts      |   4 +
 .../subtypingWithConstructSignatures4.ts      |   6 +-
 .../subtypingWithConstructSignatures5.ts      |   6 +-
 .../subtypingWithObjectMembers4.ts            |   6 +-
 .../undefinedIsSubtypeOfEverything.ts         |  25 +
 .../objectTypesIdentity.ts                    |   6 +-
 .../objectTypesIdentity2.ts                   |   5 +-
 .../objectTypesIdentityWithCallSignatures.ts  |   5 +-
 .../objectTypesIdentityWithCallSignatures2.ts |   5 +-
 ...yWithCallSignaturesDifferingParamCounts.ts |   5 +-
 ...IdentityWithCallSignaturesWithOverloads.ts |   6 +-
 ...ectTypesIdentityWithConstructSignatures.ts |   6 +-
 ...ctTypesIdentityWithConstructSignatures2.ts |   4 +-
 ...ConstructSignaturesDifferingParamCounts.ts |   4 +-
 ...tTypesIdentityWithGenericCallSignatures.ts |   6 +-
 ...TypesIdentityWithGenericCallSignatures2.ts |   6 +-
 ...ricCallSignaturesDifferingByConstraints.ts |   6 +-
 ...icCallSignaturesDifferingByConstraints2.ts |   6 +-
 ...icCallSignaturesDifferingByConstraints3.ts |   9 +-
 ...ericCallSignaturesDifferingByReturnType.ts |   5 +-
 ...ricCallSignaturesDifferingByReturnType2.ts |   6 +-
 ...lSignaturesDifferingTypeParameterCounts.ts |   6 +-
 ...llSignaturesDifferingTypeParameterNames.ts |   5 +-
 ...WithGenericCallSignaturesOptionalParams.ts |   5 +-
 ...ithGenericCallSignaturesOptionalParams2.ts |   5 +-
 ...ithGenericCallSignaturesOptionalParams3.ts |   6 +-
 ...nstructSignaturesDifferingByConstraints.ts |   2 +
 ...structSignaturesDifferingByConstraints2.ts |   7 +-
 ...structSignaturesDifferingByConstraints3.ts |   7 +-
 ...onstructSignaturesDifferingByReturnType.ts |   4 +-
 ...nstructSignaturesDifferingByReturnType2.ts |   6 +-
 ...tSignaturesDifferingTypeParameterCounts.ts |   4 +-
 ...ctSignaturesDifferingTypeParameterNames.ts |   6 +-
 ...enericConstructSignaturesOptionalParams.ts |   5 +-
 ...nericConstructSignaturesOptionalParams2.ts |   5 +-
 ...nericConstructSignaturesOptionalParams3.ts |   4 +-
 ...objectTypesIdentityWithNumericIndexers1.ts |   3 +
 ...objectTypesIdentityWithNumericIndexers2.ts |   5 +
 ...objectTypesIdentityWithNumericIndexers3.ts |   3 +
 .../objectTypesIdentityWithOptionality.ts     |   6 +-
 .../objectTypesIdentityWithPrivates.ts        |   4 +-
 .../objectTypesIdentityWithPrivates2.ts       |   1 +
 .../objectTypesIdentityWithPublics.ts         |   5 +-
 .../objectTypesIdentityWithStringIndexers.ts  |   3 +
 .../objectTypesIdentityWithStringIndexers2.ts |   5 +
 .../typeParametersAreIdenticalToThemselves.ts |   4 +-
 ...allWithConstraintsTypeArgumentInference.ts |   3 +
 .../genericCallWithFunctionTypedArguments4.ts |   4 +-
 .../genericCallWithObjectTypeArgs2.ts         |   4 +-
 ...ricCallWithObjectTypeArgsAndConstraints.ts |  10 +-
 ...icCallWithObjectTypeArgsAndConstraints2.ts |   1 +
 ...icClassWithObjectTypeArgsAndConstraints.ts |   7 +-
 .../keyofInferenceLowerPriorityThanReturn.ts  |   4 +
 .../types/union/discriminatedUnionTypes3.ts   |  19 +
 497 files changed, 8097 insertions(+), 197 deletions(-)
 create mode 100644 tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts
 create mode 100644 tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts
 create mode 100644 tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts
 create mode 100644 tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts
 create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts
 create mode 100644 tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts
 create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts
 create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts
 create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts
 create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts
 create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts
 create mode 100644 tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts
 create mode 100644 tests/cases/conformance/controlFlow/assertionTypePredicates2.ts
 create mode 100644 tests/cases/conformance/controlFlow/controlFlowAliasing.ts
 create mode 100644 tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts
 create mode 100644 tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts
 create mode 100644 tests/cases/conformance/controlFlow/controlFlowInOperator.ts
 create mode 100644 tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts
 create mode 100644 tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts
 create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts
 create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts
 create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json
 create mode 100644 tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts
 create mode 100644 tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts
 create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts
 create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts
 create mode 100644 tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts
 create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts
 create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts
 create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts
 create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts
 create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts
 create mode 100644 tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts
 create mode 100644 tests/cases/conformance/es2018/es2018IntlAPIs.ts
 create mode 100644 tests/cases/conformance/es2020/es2020IntlAPIs.ts
 create mode 100644 tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts
 create mode 100644 tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts
 create mode 100644 tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts
 create mode 100644 tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts
 create mode 100644 tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts
 create mode 100644 tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts
 create mode 100644 tests/cases/conformance/importAssertion/importAssertion1.ts
 create mode 100644 tests/cases/conformance/importAssertion/importAssertion2.ts
 create mode 100644 tests/cases/conformance/importAssertion/importAssertion3.ts
 create mode 100644 tests/cases/conformance/importAssertion/importAssertion4.ts
 create mode 100644 tests/cases/conformance/importAssertion/importAssertion5.ts
 create mode 100644 tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts
 create mode 100644 tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts
 create mode 100644 tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts
 create mode 100644 tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts
 create mode 100644 tests/cases/conformance/jsdoc/jsdocVariadicType.ts
 create mode 100644 tests/cases/conformance/jsdoc/seeTag3.ts
 create mode 100644 tests/cases/conformance/jsdoc/thisTag2.ts
 create mode 100644 tests/cases/conformance/jsx/jsxParsingError4.tsx
 create mode 100644 tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts
 create mode 100644 tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts
 create mode 100644 tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts
 create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts
 create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts
 create mode 100644 tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts
 create mode 100644 tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts
 create mode 100644 tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts
 create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts
 create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts
 create mode 100644 tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts
 create mode 100644 tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts
 create mode 100644 tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts
 create mode 100644 tests/cases/conformance/node/nodeModules1.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesDynamicImport.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesExportAssignments.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesForbidenSyntax.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportAssertions.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportAssignments.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportMeta.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesPackageExports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesPackageImports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesPackagePatternExports.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesResolveJsonModule.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesTopLevelAwait.ts
 create mode 100644 tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts
 create mode 100644 tests/cases/conformance/node/nodePackageSelfName.ts
 create mode 100644 tests/cases/conformance/node/nodePackageSelfNameScoped.ts
 create mode 100644 tests/cases/conformance/override/override15.ts
 create mode 100644 tests/cases/conformance/override/override19.ts
 create mode 100644 tests/cases/conformance/override/override20.ts
 create mode 100644 tests/cases/conformance/override/override_js4.ts
 create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts
 create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts
 create mode 100644 tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts
 create mode 100644 tests/cases/conformance/salsa/plainJSBinderErrors.ts
 create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare.ts
 create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare2.ts
 create mode 100644 tests/cases/conformance/salsa/plainJSRedeclare3.ts
 create mode 100644 tests/cases/conformance/salsa/plainJSReservedStrict.ts
 create mode 100644 tests/cases/conformance/salsa/spellingUncheckedJS.ts
 create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer2.ts
 create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer3.ts
 create mode 100644 tests/cases/conformance/salsa/typeFromJSInitializer4.ts
 create mode 100644 tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts
 create mode 100644 tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts
 create mode 100644 tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts
 create mode 100644 tests/cases/conformance/types/mapped/mappedTypeProperties.ts
 create mode 100644 tests/cases/conformance/types/members/indexSignatures1.ts
 create mode 100644 tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts
 create mode 100644 tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts
 create mode 100644 tests/cases/conformance/types/spread/spreadDuplicate.ts
 create mode 100644 tests/cases/conformance/types/spread/spreadDuplicateExact.ts
 create mode 100644 tests/cases/conformance/types/spread/spreadUnion4.ts
 create mode 100644 tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts
 create mode 100644 tests/cases/conformance/types/union/discriminatedUnionTypes3.ts

diff --git a/tests/cases/conformance/ambient/ambientDeclarations.ts b/tests/cases/conformance/ambient/ambientDeclarations.ts
index 379f5a5440..156ca565af 100644
--- a/tests/cases/conformance/ambient/ambientDeclarations.ts
+++ b/tests/cases/conformance/ambient/ambientDeclarations.ts
@@ -73,3 +73,4 @@ declare module 'external1' {
     var q;
 }
 
+let qq2 = new cls();
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts
new file mode 100644
index 0000000000..8b2be7e0b2
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/ambientDeclarationsPatterns.ts
@@ -0,0 +1,11 @@
+// @Filename: user.ts
+///<reference path="declarations.d.ts" />
+import {foo, baz} from "foobarbaz";
+foo(baz);
+
+import {foos} from "foosball";
+foo(foos);
+
+// Works with relative file name
+import fileText from "./file!text";
+foo(fileText);
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts
new file mode 100644
index 0000000000..725593c54e
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientDeclarationsPatterns/declarations.d.ts
@@ -0,0 +1,18 @@
+// @Filename: declarations.d.ts
+declare module "foo*baz" {
+    export function foo(s: string): void;
+}
+// Augmentations still work
+declare module "foo*baz" {
+    export const baz: string;
+}
+
+// Longest prefix wins
+declare module "foos*" {
+    export const foos: string;
+}
+
+declare module "*!text" {
+    const x: string;
+    export default x;
+}
diff --git a/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts b/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts
index e2f24113c9..d07ac13995 100644
--- a/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts
+++ b/tests/cases/conformance/ambient/ambientInsideNonAmbient.ts
@@ -4,6 +4,7 @@ module M {
     export declare class C { }
     export declare enum E { }
     export declare module M { }
+    let qq1 = new C();
 }
 
 module M2 {
@@ -12,4 +13,5 @@ module M2 {
     declare class C { }
     declare enum E { }
     declare module M { }
+    let qq1 = new C();
 }
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts b/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts
index dbdc315c74..3e1e4bfa35 100644
--- a/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts
+++ b/tests/cases/conformance/ambient/ambientInsideNonAmbientExternalModule.ts
@@ -3,4 +3,6 @@ export declare var x;
 export declare function f();
 export declare class C { }
 export declare enum E { }
-export declare module M { }
\ No newline at end of file
+export declare module M { }
+
+let qq1 = new C();
diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts
new file mode 100644
index 0000000000..a52d4c04bf
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_merging/ambientShorthand_merging.ts
@@ -0,0 +1,6 @@
+// @Filename: user.ts
+///<reference path="declarations1.d.ts" />
+///<reference path="declarations1.d.ts" />
+import foo, {bar} from "foo";
+foo;
+bar;
diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts
new file mode 100644
index 0000000000..66bdaa0fc8
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations1.d.ts
@@ -0,0 +1,2 @@
+// @Filename: declarations1.d.ts
+declare module "foo";
diff --git a/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts
new file mode 100644
index 0000000000..ff7233979a
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_merging/declarations2.d.ts
@@ -0,0 +1,4 @@
+// @Filename: declarations2.d.ts
+declare module "foo" {
+    export const bar: number;
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts
new file mode 100644
index 0000000000..45ba9cd111
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/ambientShorthand_reExport.ts
@@ -0,0 +1,5 @@
+// @Filename: reExportUser.ts
+import {x} from "./reExportX";
+import * as $ from "./reExportAll";
+// '$' is not callable, it is an object.
+x($);
diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts
new file mode 100644
index 0000000000..58d1d8215b
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/declarations.d.ts
@@ -0,0 +1,2 @@
+// @Filename: declarations.d.ts
+declare module "jquery";
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts
new file mode 100644
index 0000000000..58d1d8215b
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/jquery.d.ts
@@ -0,0 +1,2 @@
+// @Filename: declarations.d.ts
+declare module "jquery";
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts
new file mode 100644
index 0000000000..ae6c5d4864
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportAll.ts
@@ -0,0 +1,2 @@
+// @Filename: reExportAll.ts
+export * from "jquery";
\ No newline at end of file
diff --git a/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts
new file mode 100644
index 0000000000..07420e1616
--- /dev/null
+++ b/tests/cases/conformance/ambient/ambientShorthand_reExport/reExportX.ts
@@ -0,0 +1,2 @@
+// @Filename: reExportX.ts
+export {x} from "jquery";
\ No newline at end of file
diff --git a/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts b/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts
index c89369d02b..9f7e496b8a 100644
--- a/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts
+++ b/tests/cases/conformance/async/es5/asyncMethodWithSuper_es5.ts
@@ -55,3 +55,4 @@ class B extends A {
         ({ f: super["x"] } = { f });
     }
 }
+let b1 = new B();
diff --git a/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts
new file mode 100644
index 0000000000..31c1c4055c
--- /dev/null
+++ b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts
@@ -0,0 +1,49 @@
+// @target: esnext
+
+function f_let () {
+    let await = 1
+}
+
+function f1_var () {
+    var await = 1
+}
+
+function f1_const () {
+    const await = 1
+}
+
+async function f2_let () {
+    let await = 1
+}
+
+async function f2_var () {
+    var await = 1
+}
+
+async function f2_const () {
+    const await = 1
+}
+
+function f3_let () {
+    let yield = 2
+}
+
+function f3_var () {
+    var yield = 2
+}
+
+function f3_const () {
+    const yield = 2
+}
+
+function * f4_let () {
+    let yield = 2;
+}
+
+function * f4_var () {
+    var yield = 2;
+}
+
+function * f4_const () {
+    const yield = 2;
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts
index 4c251a03c3..1a1aeedd41 100644
--- a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAsIdentifier.ts
@@ -1,5 +1,5 @@
 class abstract {
     foo() { return 1; }
 }
-
+let a = new abstract()
 new abstract;
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts b/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts
index 1a2e456e0f..5437d3a67d 100644
--- a/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classBody/classWithEmptyBody.ts
@@ -17,4 +17,6 @@ var d: D;
 var o: {} = d;
 d = 1;
 d = { foo: '' }
-d = () => { }
\ No newline at end of file
+d = () => { }
+let cc = new C();
+let dd = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts b/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts
index efc3ccff9a..3184fc17d5 100644
--- a/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classInsideBlock.ts
@@ -1,3 +1,4 @@
 function foo() {
     class C { }
+    let a1 = new C()
 }
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts b/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts
index 93daf743f8..1d496f4eaf 100644
--- a/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classWithPredefinedTypesAsNames.ts
@@ -3,4 +3,6 @@
 class any { }
 class number { }
 class boolean { }
-class string { }
\ No newline at end of file
+class string { }
+
+let aa = new any();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts
index 6571258d9d..5f049c27e3 100644
--- a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement1.ts
@@ -1,3 +1,4 @@
 class C {
     ;
-}
\ No newline at end of file
+}
+let c9 = new C()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts
index 716c8b58ae..511baa19f9 100644
--- a/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts
+++ b/tests/cases/conformance/classes/classDeclarations/classWithSemicolonClassElement2.ts
@@ -1,4 +1,5 @@
 class C {
     ;
     ;
-}
\ No newline at end of file
+}
+let a15 = new C()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classExpressions/classExpression2.ts b/tests/cases/conformance/classes/classExpressions/classExpression2.ts
index 6365cd07eb..d39896a361 100644
--- a/tests/cases/conformance/classes/classExpressions/classExpression2.ts
+++ b/tests/cases/conformance/classes/classExpressions/classExpression2.ts
@@ -1,2 +1,4 @@
 class D { }
-var v = class C extends D {};
\ No newline at end of file
+var v = class C extends D {};
+let dd = new D()
+let vv = new v()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts
new file mode 100644
index 0000000000..dd9455ad8c
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts
@@ -0,0 +1,11 @@
+// @target: esnext, es2015, es5
+const a = 2;
+
+class C {
+    static {
+        const a = 1;
+
+        a;
+    }
+}
+let  a1 = new C()
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts
new file mode 100644
index 0000000000..aa82e1db13
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts
@@ -0,0 +1,30 @@
+// @target: esnext, es2015, es5
+var a1 = 1;
+var a2 = 1;
+const b1 = 2;
+const b2 = 2;
+
+function f () {
+    var a1 = 11;
+    const b1 = 22;
+
+    class C1 {
+        static {
+            var a1 = 111;
+            var a2 = 111;
+            const b1 = 222;
+            const b2 = 222;
+        }
+    }
+    let c1 = new C1();
+}
+
+class C2 {
+    static {
+        var a1 = 111;
+        var a2 = 111;
+        const b1 = 222;
+        const b2 = 222;
+    }
+}
+let c2 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts
new file mode 100644
index 0000000000..00492ae619
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts
@@ -0,0 +1,15 @@
+// @target: esnext, es2015
+
+let getX;
+class C {
+  #x = 1
+  constructor(x: number) {
+    this.#x = x;
+  }
+
+  static {
+    // getX has privileged access to #x
+    getX = (obj: C) => obj.#x;
+  }
+}
+let cc = new C(1);
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts
new file mode 100644
index 0000000000..436c690665
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts
@@ -0,0 +1,10 @@
+// @useDefineForClassFields: false
+// @target: es2015
+
+class C {
+  static #x = 1;
+  
+  static {
+    C.#x;
+  }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts
new file mode 100644
index 0000000000..8120cc3575
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts
@@ -0,0 +1,14 @@
+// @target: esnext, es2015
+// @useDefineForClassFields: true
+
+class C {
+  static #x = 123;
+  
+  static {
+    console.log(C.#x)
+  }
+
+  foo () {
+    return C.#x;
+  }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts
new file mode 100644
index 0000000000..ff510c8436
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts
@@ -0,0 +1,15 @@
+// @useDefineForClassFields: false
+// @target: es2015
+
+class C {
+  static #_1 = 1;
+  static #_3 = 1;
+  static #_5 = 1;
+
+  static {}
+  static {}
+  static {}
+  static {}
+  static {}
+  static {}
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts
new file mode 100644
index 0000000000..ec2727660f
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts
@@ -0,0 +1,18 @@
+// @target: esnext, es2015
+// @useDefineForClassFields: true
+var _C__1;
+
+class C {
+  static #_1 = 1;
+  static #_3 = 3;
+  static #_5 = 5;
+
+  static {}
+  static {}
+  static {}
+  static {}
+  static {}
+  static {}
+}
+
+console.log(_C__1)
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts
new file mode 100644
index 0000000000..bc15e5f1ab
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts
@@ -0,0 +1,26 @@
+// @target: es2015
+
+let getX: (c: C) => number;
+class C {
+  #x = 1
+  constructor(x: number) {
+    this.#x = x;
+  }
+
+  static {
+    // getX has privileged access to #x
+    getX = (obj: C) => obj.#x;
+    getY = (obj: D) => obj.#y;
+  }
+}
+
+let getY: (c: D) => number;
+class D {
+  #y = 1
+
+  static {
+    // getY has privileged access to y
+    getX = (obj: C) => obj.#x;
+    getY = (obj: D) => obj.#y;
+  }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts
new file mode 100644
index 0000000000..8d26cb4a08
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts
@@ -0,0 +1,33 @@
+// @target: es2015
+
+let friendA: { getX(o: A): number, setX(o: A, v: number): void };
+
+class A {
+  #x: number;
+
+  constructor (v: number) {
+    this.#x = v;
+  }
+
+  getX () {
+    return this.#x;
+  }
+
+  static {
+    friendA = {
+      getX(obj) { return obj.#x },
+      setX(obj, value) { obj.#x = value }
+    };
+  }
+};
+
+class B {
+  constructor(a: A) {
+    const x = friendA.getX(a); // ok
+    friendA.setX(a, x + 1); // ok
+  }
+};
+
+const a = new A(41);
+const b = new B(a);
+a.getX();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts
new file mode 100644
index 0000000000..a36bd50917
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock18.ts
@@ -0,0 +1,15 @@
+// @target: esnext, es2015, es5
+
+function foo () {
+  return class {
+    static foo = 1;
+    static {
+      const c = class {
+        static bar = 2;
+        static {
+          // do
+        }
+      }
+    }
+  }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts
new file mode 100644
index 0000000000..33bb993be6
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock19.ts
@@ -0,0 +1,6 @@
+class C {
+    @decorator
+    static {
+        // something
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts
new file mode 100644
index 0000000000..292d7181bb
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts
@@ -0,0 +1,20 @@
+// @target: esnext, es2015, es5
+
+const a = 1;
+const b = 2;
+
+class C {
+    static {
+        const a = 11;
+
+        a;
+        b;
+    }
+
+    static {
+        const a = 11;
+
+        a;
+        b;
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts
new file mode 100644
index 0000000000..72a9d09161
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock20.ts
@@ -0,0 +1,13 @@
+class C {
+    async static {
+        // something
+    }
+
+    public static {
+        // something
+    }
+
+    readonly private static {
+        // something
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts
new file mode 100644
index 0000000000..65422df9cd
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock21.ts
@@ -0,0 +1,7 @@
+class C {
+    /* jsdocs */
+    static {
+        // something
+    }
+}
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts
new file mode 100644
index 0000000000..8d3be9861a
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock22.ts
@@ -0,0 +1,72 @@
+// @target: esnext
+
+let await: "any";
+class C {
+  static {
+    let await: any; // illegal, cannot declare a new binding for await
+  }
+  static {
+    let { await } = {} as any; // illegal, cannot declare a new binding for await
+  }
+  static {
+    let { await: other } = {} as any; // legal
+  }
+  static {
+    let await; // illegal, cannot declare a new binding for await
+  }
+  static {
+    function await() { }; // illegal
+  }
+  static {
+    class await { }; // illegal
+  }
+
+  static {
+    class D {
+      await = 1; // legal
+      x = await; // legal (initializers have an implicit function boundary)
+    };
+  }
+  static {
+    (function await() { }); // legal, 'await' in function expression name not bound inside of static block
+  }
+  static {
+    (class await { }); // legal, 'await' in class expression name not bound inside of static block
+  }
+  static {
+    (function () { return await; }); // legal, 'await' is inside of a new function boundary
+  }
+  static {
+    (() => await); // legal, 'await' is inside of a new function boundary
+  }
+
+  static {
+    class E {
+      constructor() { await; }
+      method() { await; }
+      get accessor() {
+        await;
+        return 1;
+      }
+      set accessor(v: any) {
+        await;
+      }
+      propLambda = () => { await; }
+      propFunc = function () { await; }
+    }
+  }
+  static {
+    class S {
+      static method() { await; }
+      static get accessor() {
+        await;
+        return 1;
+      }
+      static set accessor(v: any) {
+        await;
+      }
+      static propLambda = () => { await; }
+      static propFunc = function () { await; }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts
new file mode 100644
index 0000000000..bb83b27dca
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock23.ts
@@ -0,0 +1,21 @@
+// @target: esnext
+
+const nums = [1, 2, 3].map(n => Promise.resolve(n))
+
+class C {
+  static {
+    for await (const nn of nums) {
+        console.log(nn)
+    }
+  }
+}
+
+async function foo () {
+  class C {
+    static {
+      for await (const nn of nums) {
+          console.log(nn)
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts
new file mode 100644
index 0000000000..8132238772
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock24.ts
@@ -0,0 +1,8 @@
+// @module: commonjs, es2015, es2020, UMD, AMD, System, esnext
+
+export class C {
+  static x: number;
+  static {
+    C.x = 1;
+  }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts
new file mode 100644
index 0000000000..56f99a6122
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock25.ts
@@ -0,0 +1,23 @@
+// @target: esnext
+// @declaration: true
+// @declarationMap: true
+// @sourceMap: true
+
+const a = 1;
+const b = 2;
+
+class C {
+    static {
+        const a = 11;
+
+        a;
+        b;
+    }
+
+    static {
+        const a = 11;
+
+        a;
+        b;
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts
new file mode 100644
index 0000000000..1081729acd
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock26.ts
@@ -0,0 +1,30 @@
+// @target: esnext
+
+class C {
+    static {
+        await; // illegal
+    }
+    static {
+        await (1); // illegal
+    }
+    static {
+        ({ [await]: 1 }); // illegal
+    }
+    static {
+        class D {
+            [await] = 1; // illegal (computed property names are evaluated outside of a class body
+        };
+    }
+    static {
+        ({ await }); // illegal short-hand property reference
+    }
+    static {
+        await: // illegal, 'await' cannot be used as a label
+        break await; // illegal, 'await' cannot be used as a label
+    }
+    static {
+        function f(await) { }
+        const ff = (await) => { }
+        const fff = await => { }
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts
new file mode 100644
index 0000000000..a0429bbb54
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock27.ts
@@ -0,0 +1,17 @@
+// https://github.com/microsoft/TypeScript/issues/44872
+
+void class Foo {
+    static prop = 1
+    static {
+        console.log(Foo.prop);
+        Foo.prop++;
+    }
+    static {
+        console.log(Foo.prop);
+        Foo.prop++;
+    }
+    static {
+        console.log(Foo.prop);
+        Foo.prop++;
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts
new file mode 100644
index 0000000000..84125fdbed
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts
@@ -0,0 +1,19 @@
+// @target: esnext
+
+const a = 1;
+
+class C {
+    static f1 = 1;
+
+    static {
+        console.log(C.f1, C.f2, C.f3)
+    }
+
+    static f2 = 2;
+
+    static {
+        console.log(C.f1, C.f2, C.f3)
+    }
+
+    static f3 = 3;
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts
new file mode 100644
index 0000000000..7a944a4969
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts
@@ -0,0 +1,16 @@
+// @target: esnext
+
+class C {
+    static s1 = 1;
+
+    static {
+        this.s1;
+        C.s1;
+
+        this.s2;
+        C.s2;
+    }
+
+    static s2 = 2;
+    static ss2 = this.s1;
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts
new file mode 100644
index 0000000000..2410b532ab
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts
@@ -0,0 +1,19 @@
+// @target: esnext, es2015, es5
+
+class B {
+    static a = 1;
+    static b = 2;
+}
+
+class C extends B {
+    static b = 3;
+    static c = super.a
+
+    static {
+        this.b;
+        super.b;
+        super.a;
+    }
+}
+
+let cc = new C();
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts
new file mode 100644
index 0000000000..cdd0cda2fe
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts
@@ -0,0 +1,62 @@
+class B {
+    static a = 1;
+}
+
+class C extends B {
+    static {
+        let await = 1;
+        let arguments = 1;
+        let eval = 1;
+    }
+
+    static {
+        await: if (true) {
+
+        }
+
+        arguments;
+        await;
+        super();
+    }
+}
+
+class CC {
+    constructor () {
+        class C extends B {
+            static {
+                class CC extends B {
+                    constructor () {
+                        super();
+                    }
+                }
+                super();
+            }
+        }
+    }
+}
+
+async function foo () {
+    class C extends B {
+        static {
+            arguments;
+            await;
+
+            async function ff () {
+                arguments;
+                await;
+            }
+        }
+    }
+}
+
+function foo1 () {
+    class C extends B {
+        static {
+            arguments;
+
+            function ff () {
+                arguments;
+            }
+        }
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts
new file mode 100644
index 0000000000..727ada0342
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts
@@ -0,0 +1,43 @@
+class C {
+    static {
+        await 1;
+        yield 1;
+        return 1;
+    }
+}
+
+async function f1 () {
+    class C {
+        static {
+            await 1;
+
+            async function ff () {
+                await 1;
+            }
+        }
+    }
+}
+
+function * f2 () {
+    class C {
+        static {
+            yield 1;
+
+            function * ff () {
+                yield 1;
+            }
+        }
+    }
+}
+
+function f3 () {
+    class C {
+        static {
+            return 1;
+
+            function ff () {
+                return 1
+            }
+        }
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts
new file mode 100644
index 0000000000..d2e5220b83
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts
@@ -0,0 +1,48 @@
+function foo (v: number) {
+    label: while (v) {
+        class C {
+            static {
+                if (v === 1) {
+                    break label;
+                }
+                if (v === 2) {
+                    continue label;
+                }
+                if (v === 3) {
+                    break
+                }
+                if (v === 4) {
+                    continue
+                }
+            }
+        }
+
+        if (v === 5) {
+            break label;
+        }
+        if (v === 6) {
+            continue label;
+        }
+        if (v === 7) {
+            break;
+        }
+        if (v === 8) {
+            continue;
+        }
+    }
+
+    class C {
+        static {
+            outer: break outer; // valid
+            loop: while (v) {
+                if (v === 1) break loop; // valid
+                if (v === 2) continue loop; // valid
+                if (v === 3) break; // valid
+                if (v === 4) continue; // valid
+            }
+            switch (v) {
+                default: break; // valid
+            }
+        }
+    }
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts
new file mode 100644
index 0000000000..d99157b190
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts
@@ -0,0 +1,8 @@
+// @target: esnext, es2015, es5
+class A {
+    static bar = A.foo + 1
+    static {
+        A.foo + 2;
+    }
+    static foo = 1;
+}
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts
new file mode 100644
index 0000000000..11f8b7f554
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef1.ts
@@ -0,0 +1,15 @@
+// @target: esnext
+// @noEmit: true
+// @strict: true
+
+class C {
+    static x;
+    static {
+        this.x = 1;
+    }
+    static y = this.x;
+    static z;
+    static {
+        this.z = this.y;
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts
new file mode 100644
index 0000000000..89658a6ebe
--- /dev/null
+++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlockUseBeforeDef2.ts
@@ -0,0 +1,10 @@
+// @target: esnext
+// @noEmit: true
+// @strict: true
+
+class C {
+    static {
+        this.x = 1;
+    }
+    static x;
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts b/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts
index 3760f2176a..83c7d721b0 100644
--- a/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts
+++ b/tests/cases/conformance/classes/constructorDeclarations/classConstructorAccessibility4.ts
@@ -14,6 +14,7 @@ class A {
         }
     }
 }
+let aa = new A();
 
 class D {
     protected constructor() { }
@@ -28,4 +29,5 @@ class D {
         class F extends D { // OK
         }
     }
-}
\ No newline at end of file
+}
+let dd = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts
index bdbcd7f959..c75a4f196b 100644
--- a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts
+++ b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/constructorImplementationWithDefaultValues.ts
@@ -17,4 +17,8 @@ class E<T extends Date> {
     constructor(x: T = null) {
         var y = x;
     }
-}
\ No newline at end of file
+}
+
+let cc = new C(null);
+let dd = new D(null);
+let ee = new E(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts
index 76b41eabba..ffd568ede1 100644
--- a/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts
+++ b/tests/cases/conformance/classes/constructorDeclarations/constructorParameters/declarationEmitReadonly.ts
@@ -2,4 +2,5 @@
 
 class C {
     constructor(readonly x: number) {}
-}
\ No newline at end of file
+}
+let c7 = new C(1)
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts b/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts
index c03ce26cc2..e22bf5d126 100644
--- a/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts
+++ b/tests/cases/conformance/classes/constructorDeclarations/quotedConstructors.ts
@@ -29,3 +29,7 @@ class F {
         console.log(this);
     }
 }
+let c3 =new C()
+let c4 =new D()
+let c5 =new E()
+let c6 =new F()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts b/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts
index 20243d55be..7806d4f33e 100644
--- a/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts
+++ b/tests/cases/conformance/classes/members/inheritanceAndOverriding/derivedClassOverridesIndexersWithAssignmentCompatibility.ts
@@ -14,4 +14,6 @@ class Base2 {
 // ok, use assignment compatibility
 class Derived2 extends Base2 {
     [x: number]: any;
-}
\ No newline at end of file
+}
+let c1 = new Derived()
+let c2 = new Derived2()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts
new file mode 100644
index 0000000000..fd281b1606
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/superInStaticMembers1.ts
@@ -0,0 +1,492 @@
+// @target: es5, es2015, es2021, esnext
+// @noTypesAndSymbols: true
+
+// @filename: external.ts
+export class Reflect {}
+export interface Foo {}
+export declare namespace Bar { type _ = unknown; }
+export const enum Baz {}
+export default class {};
+
+// @filename: locals.ts
+export {};
+declare class B { static w(): number; }
+class C extends B {
+    static _ = [
+        (() => {
+            var Reflect; // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            var [Reflect] = [null]; // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            class Reflect {} // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            function Reflect() {} // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            enum Reflect {} // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            const enum Reflect {} // collision (es2015-es2021 only)
+            super.w();
+        })(),
+        (() => {
+            type Reflect = unknown; // no collision
+            super.w();
+        })(),
+        (() => {
+            interface Reflect {}; // no collision
+            super.w();
+        })(),
+        (() => {
+            (class Reflect {}); // no collision
+            super.w();
+        })(),
+        (() => {
+            (function Reflect() {}); // no collision
+            super.w();
+        })(),
+    ];
+
+    static {
+        var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        var [Reflect] = [null]; // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        var Reflect; // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        class Reflect {} // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        function Reflect() {} // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        enum Reflect {} // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        const enum Reflect {} // collision (es2015-es2021 only)
+        super.w();
+    }
+
+    static {
+        type Reflect = unknown; // no collision
+        super.w();
+    }
+
+    static {
+        interface Reflect {} // no collision
+        super.w();
+    }
+
+    static {
+        (class Reflect {}) // no collision
+        super.w();
+    }
+
+    static {
+        (function Reflect() {}) // no collision
+        super.w();
+    }
+}
+
+// @filename: varInContainingScopeStaticField1.ts
+export {};
+declare class B { static w(): number; }
+var Reflect = null; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: varInContainingScopeStaticField2.ts
+export {};
+declare class B { static w(): number; }
+var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: varInContainingScopeStaticField3.ts
+export {};
+declare class B { static w(): number; }
+var [Reflect] = [null]; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: varInContainingScopeStaticBlock1.ts
+export {};
+declare class B { static w(): number; }
+var Reflect = null; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: varInContainingScopeStaticBlock2.ts
+export {};
+declare class B { static w(): number; }
+var { Reflect } = { Reflect: null }; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: varInContainingScopeStaticBlock3.ts
+export {};
+declare class B { static w(): number; }
+var [Reflect] = [null]; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: classDeclInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+class Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: classDeclInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+class Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: funcDeclInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+function Reflect() {} // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: funcDeclInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+function Reflect() {} // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: valueNamespaceInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+namespace Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: valueNamespaceInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+namespace Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: enumInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+enum Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: enumInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+enum Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: constEnumInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+const enum Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: constEnumInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+const enum Reflect {} // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: namespaceImportInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import * as Reflect from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: namespaceImportInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import * as Reflect from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: namedImportInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import { Reflect } from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: namedImportInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import { Reflect } from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: namedImportOfInterfaceInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import { Foo as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: namedImportOfInterfaceInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import { Foo as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: namedImportOfUninstantiatedNamespaceInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import { Bar as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: namedImportOfUninstantiatedNamespaceInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import { Bar as Reflect } from "./external"; // collision (es2015-es2021 only, not a type-only import)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: namedImportOfConstEnumInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import { Baz as Reflect } from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: namedImportOfConstEnumInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import { Baz as Reflect } from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: typeOnlyNamedImportInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import type { Reflect } from "./external"; // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: typeOnlyNamedImportInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import type { Reflect } from "./external"; // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: defaultImportInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import Reflect from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: defaultImportInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import Reflect from "./external"; // collision (es2015-es2021 only)
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: typeOnlyDefaultImportInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+import type Reflect from "./external"; // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: typeOnlyDefaultImportInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+import type Reflect from "./external"; // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: typeInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+type Reflect = unknown; // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: typeInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+type Reflect = unknown; // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: interfaceInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+interface Reflect {}; // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: interfaceInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+interface Reflect {}; // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: uninstantiatedNamespaceInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+declare namespace Reflect { type _ = unknown; }; // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: uninstantiatedNamespaceInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+declare namespace Reflect { type _ = unknown; }; // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: classExprInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+(class Reflect {}); // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: classExprInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+(class Reflect {}); // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: inContainingClassExprStaticField.ts
+export {};
+declare class B { static w(): number; }
+(class Reflect { // collision (es2015-es2021 only)
+    static {
+        class C extends B {
+            static _ = super.w();
+        }
+    }
+});
+
+// @filename: inContainingClassExprStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+(class Reflect { // collision (es2015-es2021 only)
+    static {
+        class C extends B {
+            static { super.w(); }
+        }
+    }
+});
+
+// @filename: funcExprInContainingScopeStaticField.ts
+export {};
+declare class B { static w(): number; }
+(function Reflect() {}); // no collision
+class C extends B {
+    static _ = super.w();
+}
+
+// @filename: funcExprInContainingScopeStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+(function Reflect() {}); // no collision
+class C extends B {
+    static { super.w(); }
+}
+
+// @filename: inContainingFuncExprStaticField.ts
+export {};
+declare class B { static w(): number; }
+(function Reflect() { // collision (es2015-es2021 only)
+    class C extends B {
+        static _ = super.w();
+    }
+});
+
+// @filename: inContainingFuncExprStaticBlock.ts
+export {};
+declare class B { static w(): number; }
+(function Reflect() { // collision (es2015-es2021 only)
+    class C extends B {
+        static { super.w(); }
+    }
+});
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts
new file mode 100644
index 0000000000..e3bfff9aed
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers1.ts
@@ -0,0 +1,42 @@
+// @target: esnext, es2015
+// @useDefineForClassFields: true
+// @noTypesAndSymbols: true
+
+declare class B {
+    static a: any;
+    static f(): number;
+    a: number;
+    f(): number;
+}
+
+class C extends B {
+    static x: any = undefined!;
+    static y1 = this.x;
+    static y2 = this.x();
+    static y3 = this?.x();
+    static y4 = this[("x")]();
+    static y5 = this?.[("x")]();
+    static z1 = super.a;
+    static z2 = super["a"];
+    static z3 = super.f();
+    static z4 = super["f"]();
+    static z5 = super.a = 0;
+    static z6 = super.a += 1;
+    static z7 = (() => { super.a = 0; })();
+    static z8 = [super.a] = [0];
+    static z9 = [super.a = 0] = [0];
+    static z10 = [...super.a] = [0];
+    static z11 = { x: super.a } = { x: 0 };
+    static z12 = { x: super.a = 0 } = { x: 0 };
+    static z13 = { ...super.a } = { x: 0 };
+    static z14 = ++super.a;
+    static z15 = --super.a;
+    static z16 = ++super[("a")];
+    static z17 = super.a++;
+    static z18 = super.a``;
+
+    // these should be unaffected
+    x = 1;
+    y = this.x;
+    z = super.f();
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts
new file mode 100644
index 0000000000..7e751c3d67
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers2.ts
@@ -0,0 +1,42 @@
+// @target: esnext, es2015
+// @useDefineForClassFields: false
+// @noTypesAndSymbols: true
+
+declare class B {
+    static a: any;
+    static f(): number;
+    a: number;
+    f(): number;
+}
+
+class C extends B {
+    static x: any = undefined!;
+    static y1 = this.x;
+    static y2 = this.x();
+    static y3 = this?.x();
+    static y4 = this[("x")]();
+    static y5 = this?.[("x")]();
+    static z1 = super.a;
+    static z2 = super["a"];
+    static z3 = super.f();
+    static z4 = super["f"]();
+    static z5 = super.a = 0;
+    static z6 = super.a += 1;
+    static z7 = (() => { super.a = 0; })();
+    static z8 = [super.a] = [0];
+    static z9 = [super.a = 0] = [0];
+    static z10 = [...super.a] = [0];
+    static z11 = { x: super.a } = { x: 0 };
+    static z12 = { x: super.a = 0 } = { x: 0 };
+    static z13 = { ...super.a } = { x: 0 };
+    static z14 = ++super.a;
+    static z15 = --super.a;
+    static z16 = ++super[("a")];
+    static z17 = super.a++;
+    static z18 = super.a``;
+
+    // these should be unaffected
+    x = 1;
+    y = this.x;
+    z = super.f();
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts
new file mode 100644
index 0000000000..413c7c54bc
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers3.ts
@@ -0,0 +1,26 @@
+// @target: es5
+// @useDefineForClassFields: true
+// @noTypesAndSymbols: true
+
+declare class B {
+    static a: any;
+    static f(): number;
+    a: number;
+    f(): number;
+}
+
+class C extends B {
+    static x: any = undefined!;
+    static y1 = this.x;
+    static y2 = this.x();
+    static y3 = this?.x();
+    static y4 = this[("x")]();
+    static y5 = this?.[("x")]();
+    static z3 = super.f();
+    static z4 = super["f"]();
+    
+    // these should be unaffected
+    x = 1;
+    y = this.x;
+    z = super.f();
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts
new file mode 100644
index 0000000000..aad82e41dc
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/thisAndSuperInStaticMembers4.ts
@@ -0,0 +1,26 @@
+// @target: es5
+// @useDefineForClassFields: false
+// @noTypesAndSymbols: true
+
+declare class B {
+    static a: any;
+    static f(): number;
+    a: number;
+    f(): number;
+}
+
+class C extends B {
+    static x: any = undefined!;
+    static y1 = this.x;
+    static y2 = this.x();
+    static y3 = this?.x();
+    static y4 = this[("x")]();
+    static y5 = this?.[("x")]();
+    static z3 = super.f();
+    static z4 = super["f"]();
+    
+    // these should be unaffected
+    x = 1;
+    y = this.x;
+    z = super.f();
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts
index dcba533725..f05e58dcb5 100644
--- a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers.ts
@@ -30,4 +30,5 @@ var t2 = C2.bar();
 var r5 = t2.foo + 1;
 var r6 = t2.bar();
 var r7 = new t2('');
-
+let b2 = new C(1)
+let b3 = new C2('null')
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts
new file mode 100644
index 0000000000..bb458c87d2
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers10.ts
@@ -0,0 +1,51 @@
+// @target: esnext, es6, es5
+// @experimentalDecorators: true
+// @useDefineForClassFields: false
+
+declare const foo: any;
+
+@foo
+class C {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+@foo
+class D extends C {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+    static f = () => this.c + 1;
+    static ff = function () { this.c + 1 }
+    static foo () {
+        return this.c + 1;
+    }
+    static get fa () {
+        return this.c + 1;
+    }
+    static set fa (v: number) {
+        this.c = v + 1;
+    }
+}
+
+class CC {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+class DD extends CC {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+    static f = () => this.c + 1;
+    static ff = function () { this.c + 1 }
+    static foo () {
+        return this.c + 1;
+    }
+    static get fa () {
+        return this.c + 1;
+    }
+    static set fa (v: number) {
+        this.c = v + 1;
+    }
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts
new file mode 100644
index 0000000000..6c4025bc47
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers11.ts
@@ -0,0 +1,51 @@
+// @target: esnext, es6, es5
+// @experimentalDecorators: true
+// @useDefineForClassFields: true
+
+declare const foo: any;
+
+@foo
+class C {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+@foo
+class D extends C {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+    static f = () => this.c + 1;
+    static ff = function () { this.c + 1 }
+    static foo () {
+        return this.c + 1;
+    }
+    static get fa () {
+        return this.c + 1;
+    }
+    static set fa (v: number) {
+        this.c = v + 1;
+    }
+}
+
+class CC {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+class DD extends CC {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+    static f = () => this.c + 1;
+    static ff = function () { this.c + 1 }
+    static foo () {
+        return this.c + 1;
+    }
+    static get fa () {
+        return this.c + 1;
+    }
+    static set fa (v: number) {
+        this.c = v + 1;
+    }
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts
new file mode 100644
index 0000000000..041089512b
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers12.ts
@@ -0,0 +1,10 @@
+// @target: esnext, es6, es5
+// @useDefineForClassFields: false
+
+class C {
+    static readonly c: "foo" = "foo"
+    static bar =  class Inner {
+        static [this.c] = 123;
+        [this.c] = 123;
+    }
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts
new file mode 100644
index 0000000000..6c965e0e2d
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers13.ts
@@ -0,0 +1,10 @@
+// @target: esnext, es6, es5
+// @useDefineForClassFields: true
+
+class C {
+    static readonly c: "foo" = "foo"
+    static bar =  class Inner {
+        static [this.c] = 123;
+        [this.c] = 123;
+    }
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts
new file mode 100644
index 0000000000..27541ce361
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers3.ts
@@ -0,0 +1,12 @@
+// @target: esnext, es6, es5
+// @useDefineForClassFields: false
+class C {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+class D extends C {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts
new file mode 100644
index 0000000000..0d08423bb9
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers4.ts
@@ -0,0 +1,12 @@
+// @target: esnext, es6, es5
+// @useDefineForClassFields: true
+class C {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+class D extends C {
+    static c = 2;
+    static d = this.c + 1;
+    static e = super.a + this.c + 1;
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts
new file mode 100644
index 0000000000..db6e8a76c6
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers5.ts
@@ -0,0 +1,9 @@
+// @target: esnext, es6, es5
+
+class C {
+    static create = () => new this("yep")
+
+    constructor (private foo: string) {
+
+    }
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts
new file mode 100644
index 0000000000..b27d0855a2
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers6.ts
@@ -0,0 +1,7 @@
+class C {
+    static f = 1
+}
+
+class D extends C {
+    static c = super();
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts
new file mode 100644
index 0000000000..1a2d9cd2e2
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers7.ts
@@ -0,0 +1,12 @@
+// @target: esnext, es6, es5
+
+class C {
+    static a = 1;
+    static b = this.a + 1;
+}
+
+class D extends C {
+    static c = 2;
+    static d = this.c + 1;
+    static e = 1 + (super.a) + (this.c + 1) + 1;
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts
new file mode 100644
index 0000000000..8b26476f14
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers8.ts
@@ -0,0 +1,19 @@
+// @target: esnext, es6, es5
+
+class C {
+    static f = 1;
+    static arrowFunctionBoundary = () => this.f + 1;
+    static functionExprBoundary = function () { return this.f + 2 };
+    static classExprBoundary = class { a = this.f + 3 };
+    static functionAndClassDeclBoundary = (() => {
+        function foo () {
+            return this.f + 4
+        }
+        class CC {
+            a = this.f + 5
+            method () {
+                return this.f + 6
+            }
+        }
+    })();
+}
diff --git a/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts
new file mode 100644
index 0000000000..0a648d2fa0
--- /dev/null
+++ b/tests/cases/conformance/classes/members/instanceAndStaticMembers/typeOfThisInStaticMembers9.ts
@@ -0,0 +1,22 @@
+// @target: esnext, es6, es5
+
+class C {
+    static f = 1
+}
+
+class D extends C {
+    static arrowFunctionBoundary = () => super.f + 1;
+    static functionExprBoundary = function () { return super.f + 2 };
+    static classExprBoundary = class { a = super.f + 3 };
+    static functionAndClassDeclBoundary = (() => {
+        function foo () {
+            return super.f + 4
+        }
+        class C {
+            a = super.f + 5
+            method () {
+                return super.f +6
+            }
+        }
+    })();
+}
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts
index 09573f98c9..f57d3afc8b 100644
--- a/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameComputedPropertyName3.ts
@@ -23,3 +23,5 @@ class Foo {
 }
 
 console.log(new Foo("NAME").getValue(100));
+
+let ff = new Foo(null)
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts
index 4c02159bfa..af502334e7 100644
--- a/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameFieldAccess.ts
@@ -6,3 +6,4 @@ class A {
         console.log(this.#myField);
     }
 }
+let aa = new A();
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts b/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts
new file mode 100644
index 0000000000..4a076565bf
--- /dev/null
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameHashCharName.ts
@@ -0,0 +1,11 @@
+// @target: es6
+
+#
+
+class C {
+    #
+
+    m() {
+        this.#
+    }
+}
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts
new file mode 100644
index 0000000000..e274378150
--- /dev/null
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpression.ts
@@ -0,0 +1,119 @@
+// @strict: true
+// @target: esnext
+// @useDefineForClassFields: true
+
+class Foo {
+    #field = 1;
+    static #staticField = 2;
+    #method() {}
+    static #staticMethod() {}
+
+    goodRhs(v: any) {
+        const a = #field in v;
+
+        const b = #field in v.p1.p2;
+
+        const c = #field in (v as {});
+
+        const d = #field in (v as Foo);
+
+        const e = #field in (v as never);
+
+        for (let f in #field in v as any) { /**/ } // unlikely but valid
+    }
+    badRhs(v: any) {
+        const a = #field in (v as unknown); // Bad - RHS of in must be object type or any
+
+        const b = #fiel in v; // Bad - typo in privateID
+
+        const c = (#field) in v; // Bad - privateID is not an expression on its own
+
+        for (#field in v) { /**/ } // Bad - 'in' not allowed
+
+        for (let d in #field in v) { /**/ } // Bad - rhs of in should be a object/any
+    }
+    whitespace(v: any) {
+        const a = v && /*0*/#field/*1*/
+            /*2*/in/*3*/
+                /*4*/v/*5*/
+    }
+    flow(u: unknown, n: never, fb: Foo | Bar, fs: FooSub, b: Bar, fsb: FooSub | Bar, fsfb: Foo | FooSub | Bar) {
+
+        if (typeof u === 'object') {
+            if (#field in n) {
+                n; // good n is never
+            }
+
+            if (#field in u) {
+                u; // good u is Foo
+            } else {
+                u; // good u is object | null
+            }
+
+            if (u !== null) {
+                if (#field in u) {
+                    u; // good u is Foo
+                } else {
+                    u; // good u is object
+                }
+
+                if (#method in u) {
+                    u; // good u is Foo
+                }
+
+                if (#staticField in u) {
+                    u; // good u is typeof Foo
+                }
+
+                if (#staticMethod in u) {
+                    u; // good u is typeof Foo
+                }
+            }
+        }
+
+        if (#field in fb) {
+            fb; // good fb is Foo
+        } else {
+            fb; // good fb is Bar
+        }
+
+        if (#field in fs) {
+            fs; // good fs is FooSub
+        } else {
+            fs; // good fs is never
+        }
+
+        if (#field in b) {
+            b; // good b is 'Bar & Foo'
+        } else {
+            b; // good b is Bar
+        }
+
+        if (#field in fsb) {
+            fsb; // good fsb is FooSub
+        } else {
+            fsb; // good fsb is Bar
+        }
+
+        if (#field in fsfb) {
+            fsfb; // good fsfb is 'Foo | FooSub'
+        } else {
+            fsfb; // good fsfb is Bar
+        }
+
+        class Nested {
+            m(v: any) {
+                if (#field in v) {
+                    v; // good v is Foo
+                }
+            }
+        }
+    }
+}
+
+class FooSub extends Foo { subTypeOfFoo = true }
+class Bar { notFoo = true }
+
+function badSyntax(v: Foo) {
+    return #field in v; // Bad - outside of class
+}
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts
new file mode 100644
index 0000000000..f7be176373
--- /dev/null
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionTransform.ts
@@ -0,0 +1,47 @@
+// @target: esnext, es2020
+
+class Foo {
+    #field = 1;
+    #method() {}
+    static #staticField= 2;
+    static #staticMethod() {}
+
+    check(v: any) {
+        #field in v; // expect Foo's 'field' WeakMap
+        #method in v; // expect Foo's 'instances' WeakSet
+        #staticField in v; // expect Foo's constructor
+        #staticMethod in v; // expect Foo's constructor
+    }
+    precedence(v: any) {
+        // '==' and '||' have lower precedence than 'in'
+        // 'in'  naturally has same precedence as 'in'
+        // '<<' has higher precedence than 'in'
+
+        v == #field in v || v; // Good precedence: (v == (#field in v)) || v
+
+        v << #field in v << v; // Good precedence (SyntaxError): (v << #field) in (v << v)
+
+        v << #field in v == v; // Good precedence (SyntaxError): ((v << #field) in v) == v
+
+        v == #field in v in v; // Good precedence: v == ((#field in v) in v)
+
+        #field in v && #field in v; // Good precedence: (#field in v) && (#field in v)
+    }
+    invalidLHS(v: any) {
+        'prop' in v = 10;
+        #field in v = 10;
+    }
+}
+
+class Bar {
+    #field = 1;
+    check(v: any) {
+        #field in v; // expect Bar's 'field' WeakMap
+    }
+}
+
+function syntaxError(v: Foo) {
+    return #field in v; // expect `return in v` so runtime will have a syntax error
+}
+
+export { }
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts
new file mode 100644
index 0000000000..4b214a2b9e
--- /dev/null
+++ b/tests/cases/conformance/classes/members/privateNames/privateNameInInExpressionUnused.ts
@@ -0,0 +1,13 @@
+// @strict: true
+// @noUnusedLocals: true
+// @target: esnext
+
+class Foo {
+    #unused: undefined; // expect unused error
+    #brand: undefined; // expect no error
+
+    isFoo(v: any): v is Foo {
+        // This should count as using/reading '#brand'
+        return #brand in v;
+    }
+}
diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts
new file mode 100644
index 0000000000..5154b5e439
--- /dev/null
+++ b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiersJs.ts
@@ -0,0 +1,65 @@
+// @allowJs: true
+// @checkJs: true
+// @strict: true
+// @target: es6
+// @outDir: ./out
+// @filename: privateNamesIncompatibleModifiersJs.js
+
+class A {
+    /**
+     * @public
+     */
+    #a = 1;
+
+    /**
+     * @private
+     */
+    #b = 1;
+
+    /**
+     * @protected
+     */
+    #c = 1;
+
+    /**
+     * @public
+     */
+    #aMethod() { return 1; }
+
+    /**
+     * @private
+     */
+    #bMethod() { return 1; }
+
+    /**
+     * @protected
+     */
+    #cMethod() { return 1; }
+
+    /**
+     * @public
+     */
+    get #aProp() { return 1; }
+    /**
+     * @public
+     */
+    set #aProp(value) { }
+
+    /**
+     * @private
+     */
+    get #bProp() { return 1; }
+    /**
+     * @private
+     */
+    set #bProp(value) { }
+
+    /**
+    * @protected
+    */
+    get #cProp() { return 1; }
+    /**
+     * @protected
+     */
+    set #cProp(value) { }
+}
diff --git a/tests/cases/conformance/classes/mixinClassesAnnotated.ts b/tests/cases/conformance/classes/mixinClassesAnnotated.ts
index 62f5e30c9a..8bca7d06d1 100644
--- a/tests/cases/conformance/classes/mixinClassesAnnotated.ts
+++ b/tests/cases/conformance/classes/mixinClassesAnnotated.ts
@@ -36,6 +36,7 @@ function Tagged<T extends Constructor<{}>>(superClass: T): Constructor<Tagged> &
             this._tag = "hello";
         }
     }
+    let c = new C();
     return C;
 }
 
@@ -65,3 +66,5 @@ class Thing3 extends Thing2 {
         this.print();
     }
 }
+let der = new Derived(1,1,1);
+let th3 = new Thing3('');
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/mixinClassesAnonymous.ts b/tests/cases/conformance/classes/mixinClassesAnonymous.ts
index 0e42288808..aa639e71e3 100644
--- a/tests/cases/conformance/classes/mixinClassesAnonymous.ts
+++ b/tests/cases/conformance/classes/mixinClassesAnonymous.ts
@@ -62,3 +62,5 @@ const Timestamped = <CT extends Constructor<object>>(Base: CT) => {
         timestamp = new Date();
     };
 }
+let aa = new Derived(1,1,1);
+let bb = new Thing3('');
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/mixinClassesMembers.ts b/tests/cases/conformance/classes/mixinClassesMembers.ts
index 905518c88f..7deb2ac30b 100644
--- a/tests/cases/conformance/classes/mixinClassesMembers.ts
+++ b/tests/cases/conformance/classes/mixinClassesMembers.ts
@@ -97,3 +97,8 @@ class C3 extends Mixed3 {
     }
     f() { return super.f(); }
 }
+let aa = new C1('');
+let bb = new M1();
+let cc = new M2();
+let dd = new C2();
+let ee = new C3();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts
index 5f7266c0ea..7870b163db 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractProperty.ts
@@ -14,3 +14,6 @@ class B extends A {
 class C extends A {
     protected get x() { return 'C.x' };
 }
+
+let b = new B();
+let c = new C();
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts
new file mode 100644
index 0000000000..42a0999748
--- /dev/null
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts
@@ -0,0 +1,5 @@
+// @strict: true
+// @declaration: true
+abstract class C {
+    abstract prop = 1
+}
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts
index 04b44a6835..d7c518964d 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts
@@ -4,8 +4,8 @@ class C {
 
 var c = new C();
 c.x = 3;
-var c2 = new C();
-var r = c.x === c2.x;
+// var c2 = new C();
+// var r = c.x === c2.x;
 
 // #31792
 
@@ -14,4 +14,5 @@ var r = c.x === c2.x;
 class MyMap<K, V> {
     constructor(private readonly Map_: { new<K, V>(): any }) {}
     private readonly store = new this.Map_<K, V>();
-}
\ No newline at end of file
+}
+let mm = new MyMap(null)
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts
index e597b6b9d9..ed03d54763 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName2.ts
@@ -6,3 +6,4 @@ const x = 1;
 class C {
     [x]: string;
 }
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts
index 5d786cd4cf..0277ffa658 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/memberFunctionDeclarations/staticFactory1.ts
@@ -10,4 +10,5 @@ class Derived extends Base {
 }
 var d = Derived.create(); 
 
-d.foo();  
\ No newline at end of file
+d.foo();  
+let b1 =new Derived()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts
index 06a784c782..d3b03f9716 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticAndNonStaticPropertiesSameName.ts
@@ -4,4 +4,5 @@ class C {
 
     f() { }
     static f() { }
-}
\ No newline at end of file
+}
+let a4 = new C()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts
index 4566ce26f0..4a275f4eef 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyAndFunctionWithSameName.ts
@@ -6,4 +6,6 @@ class C {
 class D {
     static f: number;
     f() { }
-}
\ No newline at end of file
+}
+let a2 =new C()
+let a3 = new D()
\ No newline at end of file
diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts
index 198c923b0d..d937176b83 100644
--- a/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts
+++ b/tests/cases/conformance/classes/propertyMemberDeclarations/staticPropertyNameConflictsInAmbientContext.ts
@@ -54,3 +54,13 @@ declare class StaticArgumentsFn {
     static arguments(): any; // ok
     arguments(): any; // ok
 }
+let a5 =new StaticName()
+let a6 =new StaticNameFn()
+let a7 =new StaticLength()
+let a8 =new StaticLengthFn()
+let a9 =new StaticPrototype()
+let a10 =new StaticPrototypeFn()
+let a11 =new StaticCaller()
+let a12 =new StaticCallerFn()
+let a13 =new StaticArguments()
+let a14 =new StaticArgumentsFn()
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts b/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts
new file mode 100644
index 0000000000..915c9ae94f
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/assertionTypePredicates2.ts
@@ -0,0 +1,27 @@
+// @allowJs: true
+// @checkJs: true
+// @outDir: ./out
+// @filename: assertionTypePredicates2.js
+
+/**
+ * @typedef {{ x: number }} A
+ */
+
+/**
+ * @typedef { A & { y: number } } B
+ */
+
+/**
+ * @param {A} a
+ * @returns { asserts a is B }
+ */
+const foo = (a) => {
+    if (/** @type { B } */ (a).y !== 0) throw TypeError();
+    return undefined;
+};
+
+export const main = () => {
+    /** @type { A } */
+    const a = { x: 1 };
+    foo(a);
+};
diff --git a/tests/cases/conformance/controlFlow/controlFlowAliasing.ts b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts
new file mode 100644
index 0000000000..03b7530921
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts
@@ -0,0 +1,285 @@
+// @strict: true
+// @declaration: true
+
+// Narrowing by aliased conditional expressions
+
+function f10(x: string | number) {
+    const isString = typeof x === "string";
+    if (isString) {
+        let t: string = x;
+    }
+    else {
+        let t: number = x;
+    }
+}
+
+function f11(x: unknown) {
+    const isString = typeof x === "string";
+    if (isString) {
+        let t: string = x;
+    }
+}
+
+function f12(x: string | number | boolean) {
+    const isString = typeof x === "string";
+    const isNumber = typeof x === "number";
+    if (isString || isNumber) {
+        let t: string | number = x;
+    }
+    else {
+        let t: boolean = x;
+    }
+}
+
+function f13(x: string | number | boolean) {
+    const isString = typeof x === "string";
+    const isNumber = typeof x === "number";
+    const isStringOrNumber = isString || isNumber;
+    if (isStringOrNumber) {
+        let t: string | number = x;
+    }
+    else {
+        let t: boolean = x;
+    }
+}
+
+function f14(x: number | null | undefined): number | null {
+    const notUndefined = x !== undefined;
+    return notUndefined ? x : 0;
+}
+
+function f15(obj: { readonly x: string | number }) {
+    const isString = typeof obj.x === 'string';
+    if (isString) {
+        let s: string = obj.x;
+    }
+}
+
+function f16(obj: { readonly x: string | number }) {
+    const isString = typeof obj.x === 'string';
+    obj = { x: 42 };
+    if (isString) {
+        let s: string = obj.x;  // Not narrowed because of is assigned in function body
+    }
+}
+
+function f17(obj: readonly [string | number]) {
+    const isString = typeof obj[0] === 'string';
+    if (isString) {
+        let s: string = obj[0];
+    }
+}
+
+function f18(obj: readonly [string | number]) {
+    const isString = typeof obj[0] === 'string';
+    obj = [42];
+    if (isString) {
+        let s: string = obj[0];  // Not narrowed because of is assigned in function body
+    }
+}
+
+function f20(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const isFoo = obj.kind === 'foo';
+    if (isFoo) {
+        obj.foo;
+    }
+    else {
+        obj.bar;
+    }
+}
+
+function f21(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const isFoo: boolean = obj.kind === 'foo';
+    if (isFoo) {
+        obj.foo;  // Not narrowed because isFoo has type annotation
+    }
+    else {
+        obj.bar;  // Not narrowed because isFoo has type annotation
+    }
+}
+
+function f22(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    let isFoo = obj.kind === 'foo';
+    if (isFoo) {
+        obj.foo;  // Not narrowed because isFoo is mutable
+    }
+    else {
+        obj.bar;  // Not narrowed because isFoo is mutable
+    }
+}
+
+function f23(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const isFoo = obj.kind === 'foo';
+    obj = obj;
+    if (isFoo) {
+        obj.foo;  // Not narrowed because obj is assigned in function body
+    }
+    else {
+        obj.bar;  // Not narrowed because obj is assigned in function body
+    }
+}
+
+function f24(arg: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const obj = arg;
+    const isFoo = obj.kind === 'foo';
+    if (isFoo) {
+        obj.foo;
+    }
+    else {
+        obj.bar;
+    }
+}
+
+function f25(arg: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    let obj = arg;
+    const isFoo = obj.kind === 'foo';
+    if (isFoo) {
+        obj.foo;  // Not narrowed because obj is mutable
+    }
+    else {
+        obj.bar;  // Not narrowed because obj is mutable
+    }
+}
+
+function f26(outer: { readonly obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number } }) {
+    const isFoo = outer.obj.kind === 'foo';
+    if (isFoo) {
+        outer.obj.foo;
+    }
+    else {
+        outer.obj.bar;
+    }
+}
+
+function f27(outer: { obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number } }) {
+    const isFoo = outer.obj.kind === 'foo';
+    if (isFoo) {
+        outer.obj.foo;  // Not narrowed because obj is mutable
+    }
+    else {
+        outer.obj.bar;  // Not narrowed because obj is mutable
+    }
+}
+
+function f28(obj?: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const isFoo = obj && obj.kind === 'foo';
+    const isBar = obj && obj.kind === 'bar';
+    if (isFoo) {
+        obj.foo;
+    }
+    if (isBar) {
+        obj.bar;
+    }
+}
+
+// Narrowing by aliased discriminant property access
+
+function f30(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const kind = obj.kind;
+    if (kind === 'foo') {
+        obj.foo;
+    }
+    else {
+        obj.bar;
+    }
+}
+
+function f31(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const { kind } = obj;
+    if (kind === 'foo') {
+        obj.foo;
+    }
+    else {
+        obj.bar;
+    }
+}
+
+function f32(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const { kind: k } = obj;
+    if (k === 'foo') {
+        obj.foo;
+    }
+    else {
+        obj.bar;
+    }
+}
+
+function f33(obj: { kind: 'foo', foo: string } | { kind: 'bar', bar: number }) {
+    const { kind } = obj;
+    switch (kind) {
+        case 'foo': obj.foo; break;
+        case 'bar': obj.bar; break;
+    }
+}
+
+
+class C10 {
+    constructor(readonly x: string | number) {
+        const thisX_isString = typeof this.x === 'string';
+        const xIsString = typeof x === 'string';
+        if (thisX_isString && xIsString) {
+            let s: string;
+            s = this.x;
+            s = x;
+        }
+    }
+}
+
+class C11 {
+    constructor(readonly x: string | number) {
+        const thisX_isString = typeof this.x === 'string';
+        const xIsString = typeof x === 'string';
+        if (thisX_isString && xIsString) {
+            // Some narrowings may be invalidated due to later assignments.
+            let s: string;
+            s = this.x;
+            s = x;
+        }
+        else {
+            this.x = 10;
+            x = 10;
+        }
+    }
+}
+
+// Mixing of aliased discriminants and conditionals
+
+function f40(obj: { kind: 'foo', foo?: string } | { kind: 'bar', bar?: number }) {
+    const { kind } = obj;
+    const isFoo = kind == 'foo';
+    if (isFoo && obj.foo) {
+        let t: string = obj.foo;
+    }
+}
+
+// Unsupported narrowing of destructured payload by destructured discriminant
+
+type Data = { kind: 'str', payload: string } | { kind: 'num', payload: number };
+
+function gg2(obj: Data) {
+    if (obj.kind === 'str') {
+        let t: string = obj.payload;
+    }
+    else {
+        let t: number = obj.payload;
+    }
+}
+
+function foo({ kind, payload }: Data) {
+    if (kind === 'str') {
+        let t: string = payload;
+    }
+    else {
+        let t: number = payload;
+    }
+}
+
+// Repro from #45830
+
+const obj = {
+    fn: () => true
+};
+
+if (a) { }
+
+const a = obj.fn();
diff --git a/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts b/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts
new file mode 100644
index 0000000000..a746fa1cd0
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/controlFlowAliasingCatchVariables.ts
@@ -0,0 +1,28 @@
+// @useUnknownInCatchVariables: true,false
+
+try {}
+catch (e) {
+    const isString = typeof e === 'string';
+    if (isString) {
+        e.toUpperCase(); // e string
+    }
+
+    if (typeof e === 'string') {
+        e.toUpperCase(); // e string
+    }
+}
+
+try {}
+catch (e) {
+    const isString = typeof e === 'string';
+
+    e = 1;
+
+    if (isString) {
+        e.toUpperCase(); // e any/unknown
+    }
+
+    if (typeof e === 'string') {
+        e.toUpperCase(); // e string
+    }
+}
diff --git a/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts b/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts
index fa0592c973..17a2af7895 100644
--- a/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts
+++ b/tests/cases/conformance/controlFlow/controlFlowElementAccess2.ts
@@ -10,4 +10,4 @@ if (typeof config['works'] !== 'boolean') {
 if (typeof config.works !== 'boolean') {
     config['works'].prop = 'test'; // error, config['works']: boolean | { 'prop': string }
     config.works.prop = 'test'; // ok
-}
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts b/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts
new file mode 100644
index 0000000000..450e50cadc
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/controlFlowForInStatement2.ts
@@ -0,0 +1,25 @@
+const keywordA = 'a';
+const keywordB = 'b';
+
+type A = { [keywordA]: number };
+type B = { [keywordB]: string };
+
+declare const c: A | B;
+
+if ('a' in c) {
+    c; // narrowed to `A`
+}
+
+if (keywordA in c) {
+    c; // also narrowed to `A`
+}
+
+let stringB: string = 'b';
+
+if ((stringB as 'b') in c) {
+    c; // narrowed to `B`
+}
+
+if ((stringB as ('a' | 'b')) in c) {
+    c; // not narrowed
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/controlFlowInOperator.ts b/tests/cases/conformance/controlFlow/controlFlowInOperator.ts
new file mode 100644
index 0000000000..5dc27c45e8
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/controlFlowInOperator.ts
@@ -0,0 +1,26 @@
+const a = 'a';
+const b = 'b';
+const d = 'd';
+
+type A = { [a]: number; };
+type B = { [b]: string; };
+
+declare const c: A | B;
+
+if ('a' in c) {
+    c;      // A
+    c['a']; // number;
+}
+
+if ('d' in c) {
+    c; // never
+}
+
+if (a in c) {
+    c;    // A
+    c[a]; // number;
+}
+
+if (d in c) {
+    c; // never
+}
diff --git a/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts b/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts
index 4a1ff7ff86..8780db0c12 100644
--- a/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts
+++ b/tests/cases/conformance/controlFlow/controlFlowInstanceofExtendsFunction.ts
@@ -29,4 +29,6 @@ export const x: X | number = Math.random() > 0.5 ? new X() : 1
 
 if (x instanceof X) {
     x.why() // should compile
-}
\ No newline at end of file
+}
+let xx = new X();
+let yy = new Y();
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts b/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts
index b42af687c0..b3710bae0d 100644
--- a/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts
+++ b/tests/cases/conformance/controlFlow/controlFlowSuperPropertyAccess.ts
@@ -7,3 +7,4 @@ class C extends B {
         super.m && super.m();
     }
 }
+let qq3 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts b/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts
new file mode 100644
index 0000000000..db134447ed
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/controlFlowTypeofObject.ts
@@ -0,0 +1,71 @@
+// @strict: true
+// @declaration: true
+
+declare function obj(x: object): void;
+
+function f1(x: unknown) {
+    if (!x) {
+        return;
+    }
+    if (typeof x === 'object') {
+        obj(x);
+    }
+}
+
+function f2(x: unknown) {
+    if (x === null) {
+        return;
+    }
+    if (typeof x === 'object') {
+        obj(x);
+    }
+}
+
+function f3(x: unknown) {
+    if (x == null) {
+        return;
+    }
+    if (typeof x === 'object') {
+        obj(x);
+    }
+}
+
+function f4(x: unknown) {
+    if (x == undefined) {
+        return;
+    }
+    if (typeof x === 'object') {
+        obj(x);
+    }
+}
+
+function f5(x: unknown) {
+    if (!!true) {
+        if (!x) {
+            return;
+        }
+    }
+    else {
+        if (x === null) {
+            return;
+        }
+    }
+    if (typeof x === 'object') {
+        obj(x);
+    }
+}
+
+function f6(x: unknown) {
+    if (x === null) {
+        x;
+    }
+    else {
+        x;
+        if (typeof x === 'object') {
+            obj(x);
+        }
+    }
+    if (typeof x === 'object') {
+        obj(x);  // Error
+    }
+}
diff --git a/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts
new file mode 100644
index 0000000000..55e95ddf09
--- /dev/null
+++ b/tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts
@@ -0,0 +1,161 @@
+// @strict: true
+// @declaration: true
+// @target: es2015
+
+type Action =
+    | { kind: 'A', payload: number }
+    | { kind: 'B', payload: string };
+
+function f10({ kind, payload }: Action) {
+    if (kind === 'A') {
+        payload.toFixed();
+    }
+    if (kind === 'B') {
+        payload.toUpperCase();
+    }
+}
+
+function f11(action: Action) {
+    const { kind, payload } = action;
+    if (kind === 'A') {
+        payload.toFixed();
+    }
+    if (kind === 'B') {
+        payload.toUpperCase();
+    }
+}
+
+function f12({ kind, payload }: Action) {
+    switch (kind) {
+        case 'A':
+            payload.toFixed();
+            break;
+        case 'B':
+            payload.toUpperCase();
+            break;
+        default:
+            payload;  // never
+    }
+}
+
+type Action2 =
+    | { kind: 'A', payload: number | undefined }
+    | { kind: 'B', payload: string | undefined };
+
+function f20({ kind, payload }: Action2) {
+    if (payload) {
+        if (kind === 'A') {
+            payload.toFixed();
+        }
+        if (kind === 'B') {
+            payload.toUpperCase();
+        }
+    }
+}
+
+function f21(action: Action2) {
+    const { kind, payload } = action;
+    if (payload) {
+        if (kind === 'A') {
+            payload.toFixed();
+        }
+        if (kind === 'B') {
+            payload.toUpperCase();
+        }
+    }
+}
+
+function f22(action: Action2) {
+    if (action.payload) {
+        const { kind, payload } = action;
+        if (kind === 'A') {
+            payload.toFixed();
+        }
+        if (kind === 'B') {
+            payload.toUpperCase();
+        }
+    }
+}
+
+function f23({ kind, payload }: Action2) {
+    if (payload) {
+        switch (kind) {
+            case 'A':
+                payload.toFixed();
+                break;
+            case 'B':
+                payload.toUpperCase();
+                break;
+            default:
+                payload;  // never
+        }
+    }
+}
+
+type Foo =
+    | { kind: 'A', isA: true }
+    | { kind: 'B', isA: false }
+    | { kind: 'C', isA: false };
+
+function f30({ kind, isA }: Foo) {
+    if (kind === 'A') {
+        isA;   // true
+    }
+    if (kind === 'B') {
+        isA;   // false
+    }
+    if (kind === 'C') {
+        isA;   // false
+    }
+    if (isA) {
+        kind;  // 'A'
+    }
+    else {
+        kind;  // 'B' | 'C'
+    }
+}
+
+// Repro from #35283
+
+interface A<T> { variant: 'a', value: T }
+
+interface B<T> { variant: 'b', value: Array<T> }
+
+type AB<T> = A<T> | B<T>;
+
+declare function printValue<T>(t: T): void;
+
+declare function printValueList<T>(t: Array<T>): void;
+
+function unrefined1<T>(ab: AB<T>): void {
+    const { variant, value } = ab;
+    if (variant === 'a') {
+        printValue<T>(value);
+    }
+    else {
+        printValueList<T>(value);
+    }
+}
+
+// Repro from #38020
+
+type Action3 =
+    | {type: 'add', payload: { toAdd: number } }
+    | {type: 'remove', payload: { toRemove: number } };
+
+const reducerBroken = (state: number, { type, payload }: Action3) => {
+    switch (type) {
+        case 'add':
+            return state + payload.toAdd;
+        case 'remove':
+            return state - payload.toRemove;
+    }
+}
+
+// Repro from #46143
+
+declare var it: Iterator<number>;
+const { value, done } = it.next();
+if (!done) {
+    value;  // number
+}
diff --git a/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts b/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts
index 41e3ffe572..1a42e77ae0 100644
--- a/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts
+++ b/tests/cases/conformance/controlFlow/typeGuardsNestedAssignments.ts
@@ -44,4 +44,5 @@ let match: RegExpExecArray | null
 
 while ((match = re.exec("xxx")) != null) {
     const length = match[1].length + match[2].length
-}
\ No newline at end of file
+}
+let qq4 = new Foo();
\ No newline at end of file
diff --git a/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts b/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts
index 169dbc7a7c..708fcceab8 100644
--- a/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts
+++ b/tests/cases/conformance/controlFlow/typeGuardsTypeParameters.ts
@@ -33,3 +33,4 @@ function fun<T>(item: { [P in keyof T]: T[P] }) {
         }
     }
 }
+let qq6 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts b/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts
index a5b3074a5c..20e4ef968e 100644
--- a/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts
+++ b/tests/cases/conformance/declarationEmit/declarationEmitWorkWithInlineComments.ts
@@ -34,4 +34,7 @@ export class Baz {
   constructor(/* @internal */
     public isInternal: string
   ) {}
-}
\ No newline at end of file
+}
+// let ff = new Foo('','','','','','','','','','')
+// let bar = new Bar('');
+// let baz = new Baz('');
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts
index 69af9c5b07..1b88b5d2bb 100644
--- a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts
+++ b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicates01.ts
@@ -8,4 +8,5 @@ export class C {
 }
 
 export class D extends C {
-}
\ No newline at end of file
+}
+let qq6 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts
index 461c7d1757..d22941e2f2 100644
--- a/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts
+++ b/tests/cases/conformance/declarationEmit/typePredicates/declarationEmitThisPredicatesWithPrivateName01.ts
@@ -8,4 +8,5 @@ export class C {
 }
 
 class D extends C {
-}
\ No newline at end of file
+}
+let qq7 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts
new file mode 100644
index 0000000000..fe6e6774e2
--- /dev/null
+++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/fs.d.ts
@@ -0,0 +1,5 @@
+// @filename: node_modules/@types/node/fs.d.ts
+declare module "fs" {
+    function FSWatcher() 
+    // interface FSWatcher {}
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts
new file mode 100644
index 0000000000..38de3dcf37
--- /dev/null
+++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/main.ts
@@ -0,0 +1,2 @@
+// @filename: main.ts
+/// <reference types="node" />
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json
new file mode 100644
index 0000000000..f93a231130
--- /dev/null
+++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/package.json
@@ -0,0 +1,4 @@
+{
+    "name": "@types/node",
+    "version": "1.0.0"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts
new file mode 100644
index 0000000000..957e4b37af
--- /dev/null
+++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles/typeReferenceRelatedFiles.ts
@@ -0,0 +1,18 @@
+// @declaration: true
+// @filename: node_modules/@types/node/index.d.ts
+/// <reference path="fs.d.ts" />
+
+// @filename: node_modules/@types/node/package.json
+// {
+//     "name": "@types/node",
+//     "version": "1.0.0"
+// }
+// @filename: main.ts
+// / <reference types="node" />
+import { FSWatcher } from "fs";
+
+FSWatcher();
+
+export function f() {
+    // return {} as FSWatcher;
+}
diff --git a/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts b/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts
new file mode 100644
index 0000000000..3679047895
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts
@@ -0,0 +1,15 @@
+// @target: es2018
+// @experimentalDecorators: true
+// @noEmitHelpers: true
+// @noTypesAndSymbols: true
+
+// https://github.com/microsoft/TypeScript/issues/44931
+interface IFoo { }
+declare const IFoo: any;
+class BulkEditPreviewProvider {
+    static readonly Schema = 'vscode-bulkeditpreview';
+    static emptyPreview = { scheme: BulkEditPreviewProvider.Schema };
+    constructor(
+        @IFoo private readonly _modeService: IFoo,
+    ) { }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts
new file mode 100644
index 0000000000..521dd6a31c
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass1.ts
@@ -0,0 +1,16 @@
+// @target: es5
+// @experimentaldecorators: true
+// @emitDecoratorMetadata: true
+// @filename: a.ts
+
+function decorator() {
+    return (target: new (...args: any[]) => any) => {}
+}
+
+@decorator()
+class Foo {
+    public static func(): Foo {
+        return new Foo();
+    }
+}
+Foo.func();
diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts
new file mode 100644
index 0000000000..7d8de6894f
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass2.ts
@@ -0,0 +1,19 @@
+// @target: es5
+// @experimentaldecorators: true
+// @emitDecoratorMetadata: true
+// @filename: a.ts
+
+function decorator() {
+    return (target: new (...args: any[]) => any) => {}
+}
+
+try {
+    @decorator()
+    class Foo {
+        public static func(): Foo {
+            return new Foo();
+        }
+    }
+    Foo.func();
+}
+catch (e) {}
diff --git a/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts
new file mode 100644
index 0000000000..48eebc559f
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/decoratedBlockScopedClass3.ts
@@ -0,0 +1,27 @@
+// @target: es5
+// @experimentaldecorators: true
+// @emitDecoratorMetadata: true
+// @filename: a.ts
+
+function decorator() {
+    return (target: new (...args: any[]) => any) => {}
+}
+
+@decorator()
+class Foo {
+    public static func(): Foo {
+        return new Foo();
+    }
+}
+Foo.func();
+
+try {
+    @decorator()
+    class Foo {
+        public static func(): Foo {
+            return new Foo();
+        }
+    }
+    Foo.func();
+}
+catch (e) {}
diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts
new file mode 100644
index 0000000000..18f3df79bc
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod14.ts
@@ -0,0 +1,14 @@
+// @target: esnext
+// @experimentaldecorators: true
+// @emitdecoratormetadata: true
+declare var decorator: any;
+
+class Foo {
+    private prop = () => {
+        return 0;
+    }
+    @decorator
+    foo() {
+        return 0;
+    }
+}
diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts
new file mode 100644
index 0000000000..70f86b1bbe
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod15.ts
@@ -0,0 +1,12 @@
+// @target: esnext
+// @experimentaldecorators: true
+// @emitdecoratormetadata: true
+declare var decorator: any;
+
+class Foo {
+    private prop = 1
+    @decorator
+    foo() {
+        return 0;
+    }
+}
diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts
new file mode 100644
index 0000000000..400d4fbe5a
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod16.ts
@@ -0,0 +1,12 @@
+// @target: esnext
+// @experimentaldecorators: true
+// @emitdecoratormetadata: true
+declare var decorator: any;
+
+class Foo {
+    private prop
+    @decorator
+    foo() {
+        return 0;
+    }
+}
diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts
new file mode 100644
index 0000000000..1aa25d7f32
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod17.ts
@@ -0,0 +1,11 @@
+// @target: esnext
+// @experimentaldecorators: true
+// @emitdecoratormetadata: true
+declare var decorator: any;
+
+class Foo {
+    private prop @decorator
+    foo() {
+        return 0;
+    }
+}
diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts
new file mode 100644
index 0000000000..9417c44c5b
--- /dev/null
+++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethod18.ts
@@ -0,0 +1,11 @@
+// @target: esnext
+// @experimentaldecorators: true
+// @emitdecoratormetadata: true
+declare var decorator: any;
+
+class Foo {
+    p1
+
+    @decorator()
+    p2;
+}
diff --git a/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts b/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts
new file mode 100644
index 0000000000..c63fcf1a16
--- /dev/null
+++ b/tests/cases/conformance/decorators/decoratorMetadataWithTypeOnlyImport2.ts
@@ -0,0 +1,17 @@
+// @experimentalDecorators: true
+// @emitDecoratorMetadata: true
+
+
+// @filename: services.ts
+export namespace Services {
+  export class Service {}
+}
+
+// @filename: index.ts
+import type { Services } from './services';
+
+declare const decorator: any;
+export class Main {
+  @decorator()
+  field: Services.Service;
+}
diff --git a/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts b/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts
index fe1bc56dd1..20e20e00dc 100644
--- a/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts
+++ b/tests/cases/conformance/emitter/es2015/asyncGenerators/emitter.asyncGenerators.classMethods.es2015.ts
@@ -58,3 +58,14 @@ class C9 extends B9 {
         super.g();
     }
 }
+
+let c1 = new C1();
+let c2 = new C2();
+let c3 = new C3();
+let c4 = new C4();
+let c5 = new C5();
+let c6 = new C6();
+let c7 = new C7();
+let c8 = new C8();
+let c9 = new C9();
+
diff --git a/tests/cases/conformance/es2018/es2018IntlAPIs.ts b/tests/cases/conformance/es2018/es2018IntlAPIs.ts
new file mode 100644
index 0000000000..c1f6739202
--- /dev/null
+++ b/tests/cases/conformance/es2018/es2018IntlAPIs.ts
@@ -0,0 +1,7 @@
+// @target: es2018
+
+// Sample from
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules/supportedLocalesOf
+const locales = ['ban', 'id-u-co-pinyin', 'de-ID'];
+const options = { localeMatcher: 'lookup' } as const;
+console.log(Intl.PluralRules.supportedLocalesOf(locales, options).join(', '));
\ No newline at end of file
diff --git a/tests/cases/conformance/es2020/es2020IntlAPIs.ts b/tests/cases/conformance/es2020/es2020IntlAPIs.ts
new file mode 100644
index 0000000000..464ecc01ec
--- /dev/null
+++ b/tests/cases/conformance/es2020/es2020IntlAPIs.ts
@@ -0,0 +1,45 @@
+// @target: es2020
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation
+const count = 26254.39;
+const date = new Date("2012-05-24");
+
+function log(locale: string) {
+  console.log(
+    `${new Intl.DateTimeFormat(locale).format(date)} ${new Intl.NumberFormat(locale).format(count)}`
+  );
+}
+
+log("en-US");
+// expected output: 5/24/2012 26,254.39
+
+log("de-DE");
+// expected output: 24.5.2012 26.254,39
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat
+const rtf1 = new Intl.RelativeTimeFormat('en', { style: 'narrow' });
+
+console.log(rtf1.format(3, 'quarter'));
+//expected output: "in 3 qtrs."
+
+console.log(rtf1.format(-1, 'day'));
+//expected output: "1 day ago"
+
+const rtf2 = new Intl.RelativeTimeFormat('es', { numeric: 'auto' });
+
+console.log(rtf2.format(2, 'day'));
+//expected output: "pasado mañana"
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames
+const regionNamesInEnglish = new Intl.DisplayNames(['en'], { type: 'region' });
+const regionNamesInTraditionalChinese = new Intl.DisplayNames(['zh-Hant'], { type: 'region' });
+
+console.log(regionNamesInEnglish.of('US'));
+// expected output: "United States"
+
+console.log(regionNamesInTraditionalChinese.of('US'));
+// expected output: "美國"
+
+const locales1 = ['ban', 'id-u-co-pinyin', 'de-ID'];
+const options1 = { localeMatcher: 'lookup' } as const;
+console.log(Intl.DisplayNames.supportedLocalesOf(locales1, options1).join(', '));
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts b/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts
index 5d18229ea0..de26b4fc10 100644
--- a/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts
+++ b/tests/cases/conformance/es6/classDeclaration/emitClassDeclarationWithPropertyAccessInHeritageClause1.ts
@@ -2,4 +2,6 @@ class B {}
 function foo() {
     return {B: B};
 }
-class C extends (foo()).B {}
\ No newline at end of file
+class C extends (foo()).B {}
+let qt6 = new B();
+let qt7 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts
index e5d63f2e93..a872204ec7 100644
--- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts
+++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing1.ts
@@ -13,3 +13,4 @@ class D extends Base {
         var i = Factory.create(s);
     }
 }
+let qt2 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts
index 1b0a0d541e..826baf9d02 100644
--- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts
+++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing2.ts
@@ -7,3 +7,4 @@ class D extends Base {
         super(() => { this._t }); // no error. only check when this is directly accessing in constructor
     }
 }
+let qt5 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts
index 1782027758..10e7ca31aa 100644
--- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts
+++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing5.ts
@@ -4,3 +4,4 @@
         this._t;  // No error
     }
 }
+let qt4 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts
index 5742cdab84..3b55dbc70f 100644
--- a/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts
+++ b/tests/cases/conformance/es6/classDeclaration/superCallBeforeThisAccessing8.ts
@@ -10,3 +10,4 @@ class D extends Base {
         }
     }
 }
+let qt3 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts b/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts
new file mode 100644
index 0000000000..ebeb117ed0
--- /dev/null
+++ b/tests/cases/conformance/es6/spread/arraySpreadImportHelpers.ts
@@ -0,0 +1,16 @@
+// @target: es5
+// @importHelpers: true
+// @isolatedModules: true
+// @noTypesAndSymbols: true
+// @noEmit: true
+// @filename: main.ts
+
+export {};
+const k = [1, , 2];
+const o = [3, ...k, 4];
+
+// @filename: tslib.d.ts
+// this is a pre-TS4.4 versions of emit helper, which always forced array packing
+declare module "tslib" {
+    function __spreadArray(to: any[], from: any[]): any[];
+}
diff --git a/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts b/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts
new file mode 100644
index 0000000000..c344bea1fb
--- /dev/null
+++ b/tests/cases/conformance/es6/templates/templateStringWithCommentsInArrowFunction.ts
@@ -0,0 +1,14 @@
+// @removeComments: false
+
+const a = 1;
+const f1 = () =>
+    `${
+      // a
+      a
+    }a`;
+
+const f2 = () =>
+    `${
+      // a
+      a
+    }`;
diff --git a/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts b/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts
index a4dd44a15a..ea325aefaf 100644
--- a/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts
+++ b/tests/cases/conformance/expressions/asOperator/asOperatorASI.ts
@@ -8,3 +8,4 @@ as `Hello world`; // should not error
 // Example 2
 var y = 20
 as(Foo); // should emit
+let qw11 = new Foo();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts
index 05b8e135cb..285f41f742 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIdenticalObjects.ts
@@ -191,4 +191,8 @@ var r8b3 = b2 !== a2;
 var r8b4 = b3 !== a3;
 var r8b5 = b4 !== a4;
 var r8b6 = b5 !== a5;
-var r8b7 = b6 !== a6;
\ No newline at end of file
+var r8b7 = b6 !== a6;
+let qr1 = new A1();
+let qr2 = new B1();
+let qr3 = new A2();
+let qr4 = new B2();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts
new file mode 100644
index 0000000000..68900e5f91
--- /dev/null
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithIntersectionType.ts
@@ -0,0 +1,5 @@
+declare let a: { a: 1 }
+a > 1;
+
+declare let b: { a: 1 } & { b: number }
+b > 1;
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts
index 5670cf8ef1..441748fb1a 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedCallSignature.ts
@@ -146,4 +146,6 @@ var r8b2 = b2 !== a2;
 var r8b3 = b3 !== a3;
 var r8b4 = b4 !== a4;
 var r8b5 = b5 !== a5;
-var r8b6 = b6 !== a6;
\ No newline at end of file
+var r8b6 = b6 !== a6;
+let qe5 = new Derived();
+let qe6 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts
index 8f3d914934..3f0d1adb65 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipObjectsOnInstantiatedConstructorSignature.ts
@@ -146,4 +146,6 @@ var r8b2 = b2 !== a2;
 var r8b3 = b3 !== a3;
 var r8b4 = b4 !== a4;
 var r8b5 = b5 !== a5;
-var r8b6 = b6 !== a6;
\ No newline at end of file
+var r8b6 = b6 !== a6;
+let qe7 = new Derived();
+let qe8 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts
index 6b6ae79015..e60a012739 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnCallSignature.ts
@@ -256,4 +256,5 @@ var r8b8 = b8 !== a8;
 var r8b9 = b9 !== a9;
 var r8b10 = b10 !== a10;
 var r8b11 = b11 !== a11;
-//var r8b12 = b12 !== a12;
\ No newline at end of file
+//var r8b12 = b12 !== a12;
+let qw12 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts
index 363192f49f..e42a1cc1c1 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnConstructorSignature.ts
@@ -218,4 +218,5 @@ var r8b6 = b6 !== a6;
 var r8b7 = b7 !== a7;
 var r8b8 = b8 !== a8;
 var r8b9 = b9 !== a9;
-//var r8b10 = b10 !== a10;
\ No newline at end of file
+//var r8b10 = b10 !== a10;
+let qe9 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts
index 8246c6dd18..9154c7f806 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnIndexSignature.ts
@@ -104,4 +104,5 @@ var r8a1 = a4 !== b4;
 var r8b1 = b1 !== a1;
 var r8b1 = b2 !== a2;
 var r8b1 = b3 !== a3;
-var r8b1 = b4 !== a4;
\ No newline at end of file
+var r8b1 = b4 !== a4;
+let qr5 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts
index da3d4131c6..59f9a78a38 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedCallSignature.ts
@@ -161,4 +161,5 @@ var r8b3 = b3 !== a3;
 var r8b4 = b4 !== a4;
 var r8b5 = b5 !== a5;
 var r8b6 = b6 !== a6;
-//var r8b7 = b7 !== a7;
\ No newline at end of file
+//var r8b7 = b7 !== a7;
+let qw14 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts
index 5a2356eadb..05f49336bf 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnInstantiatedConstructorSignature.ts
@@ -161,4 +161,5 @@ var r8b3 = b3 !== a3;
 var r8b4 = b4 !== a4;
 var r8b5 = b5 !== a5;
 var r8b6 = b6 !== a6;
-//var r8b7 = b7 !== a7;
\ No newline at end of file
+//var r8b7 = b7 !== a7;
+let qw13 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts
index 6401feb11c..fb2cd09f76 100644
--- a/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithSubtypeObjectOnProperty.ts
@@ -75,4 +75,8 @@ var rg4 = b2 === a2;
 var rh1 = a1 !== b1;
 var rh2 = a2 !== b2;
 var rh3 = b1 !== a1;
-var rh4 = b2 !== a2;
\ No newline at end of file
+var rh4 = b2 !== a2;
+let qe1 = new Derived();
+let qe2 = new A1();
+let qe3 = new B1();
+let qe4 = new B2();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts
index b99f8d7114..1399026e80 100644
--- a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithInvalidStaticToString.ts
@@ -19,3 +19,6 @@ declare class NormalToString {
 function baz(normal: NormalToString) {
     return normal instanceof NormalToString;
 }
+let qr7 = new StaticToString();
+let qr8 = new StaticToNumber();
+let qr9 = new NormalToString();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts
index 6b88cd39f2..47a60b104b 100644
--- a/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts
+++ b/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithLHSIsObject.ts
@@ -12,3 +12,4 @@ var r1 = a instanceof x1;
 var r2 = b instanceof x2;
 var r3 = c instanceof x1;
 var r4 = d instanceof x1;
+let qr0 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts b/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts
index 0a6a47dfbb..4e2e1e494d 100644
--- a/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts
+++ b/tests/cases/conformance/expressions/commaOperator/commaOperatorWithSecondOperandObjectType.ts
@@ -38,3 +38,4 @@ var resultIsObject8 = (true, {});
 var resultIsObject9 = (!BOOLEAN, { a: 1, b: "s" });
 var resultIsObject10 = ("string", new Date());
 var resultIsObject11 = (STRING.toLowerCase(), new CLASS());
+let qw10 = new CLASS();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts b/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts
index 11652b023d..93bdd906c6 100644
--- a/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts
+++ b/tests/cases/conformance/expressions/conditonalOperator/conditionalOperatorWithIdenticalBCT.ts
@@ -44,3 +44,6 @@ var result10: (t: X) => any = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
 
 //Expr1 and Expr2 are literals
 var result11: any = true ? 1 : 'string';
+
+let qq1 = new A();
+let qq0 = new B();
diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts
index 7bcde9a695..fc8bde2595 100644
--- a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts
+++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts
@@ -9,3 +9,5 @@ class B extends A<number, string> {
     // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method.
     constructor() { super(value => String(value.toExponential())); }
 }
+
+let  qr17 = new B();
diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts
index 760337f3ef..6eac51e440 100644
--- a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts
+++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts
@@ -28,4 +28,5 @@ class C extends CBase<string> {
             }
         });
     }
-}
\ No newline at end of file
+}
+let qt1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts b/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts
index b1e2ee7578..3ba8aa488a 100644
--- a/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts
+++ b/tests/cases/conformance/expressions/functionCalls/callWithSpread.ts
@@ -55,3 +55,4 @@ class D extends C {
         super.foo(1, 2, ...a);
     }
 }
+let qr13 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts b/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts
index 707ef02de8..304d6792dc 100644
--- a/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts
+++ b/tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts
@@ -96,3 +96,4 @@ function tryCatchFn() {
         var m = () => this + '';
     }
 }
+let qr14 = new MyClass();
diff --git a/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts b/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts
index b50751c7ae..051e4e3c3e 100644
--- a/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts
+++ b/tests/cases/conformance/expressions/newOperator/newOperatorConformance.ts
@@ -60,3 +60,4 @@ var t: any;
 var nested = new (new (new nestedCtor())())();
 var n = new nested();
 var n = new nested();
+let aa1 = new C1(null,null);
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/superCalls/superCalls.ts b/tests/cases/conformance/expressions/superCalls/superCalls.ts
index fdebc85906..da0fe9656b 100644
--- a/tests/cases/conformance/expressions/superCalls/superCalls.ts
+++ b/tests/cases/conformance/expressions/superCalls/superCalls.ts
@@ -27,3 +27,5 @@ class OtherDerived extends OtherBase {
         super();
     }
 }
+let qr15 = new Derived(null);
+let qr16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts b/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts
new file mode 100644
index 0000000000..99d6a50b00
--- /dev/null
+++ b/tests/cases/conformance/expressions/thisKeyword/typeOfThisGeneral.ts
@@ -0,0 +1,178 @@
+// @target: esnext
+// @useDefineForClassFields: false
+class MyTestClass {
+    private canary: number;
+    static staticCanary: number;
+
+    constructor() {
+        //type of 'this' in constructor body is the class instance type
+        var p = this.canary;
+        var p: number;
+        this.canary = 3;
+    }
+
+    //type of 'this' in member function param list is the class instance type
+    memberFunc(t = this) {
+        var t: MyTestClass;
+
+        //type of 'this' in member function body is the class instance type
+        var p = this;
+        var p: MyTestClass;
+    }
+
+    //type of 'this' in member accessor(get and set) body is the class instance type
+    get prop() {
+        var p = this;
+        var p: MyTestClass;
+        return this;
+    }
+    set prop(v) {
+        var p = this;
+        var p: MyTestClass;
+        p = v;
+        v = p;
+    }
+
+    someFunc = () => {
+        //type of 'this' in member variable initializer is the class instance type
+        var t = this;
+        var t: MyTestClass;
+    };
+
+    //type of 'this' in static function param list is constructor function type
+    static staticFn(t = this) {
+        var t: typeof MyTestClass;
+        var t = MyTestClass;
+        t.staticCanary;
+
+        //type of 'this' in static function body is constructor function type
+        var p = this;
+        var p: typeof MyTestClass;
+        var p = MyTestClass;
+        p.staticCanary;
+    }
+
+    static get staticProp() {
+        //type of 'this' in static accessor body is constructor function type
+        var p = this;
+        var p: typeof MyTestClass;
+        var p = MyTestClass;
+        p.staticCanary;
+        return this;
+    }
+    static set staticProp(v: typeof MyTestClass) {
+        //type of 'this' in static accessor body is constructor function type
+        var p = this;
+        var p: typeof MyTestClass;
+        var p = MyTestClass;
+        p.staticCanary;
+    }
+}
+
+class MyGenericTestClass<T, U> {
+    private canary: number;
+    static staticCanary: number;
+
+    constructor() {
+        //type of 'this' in constructor body is the class instance type
+        var p = this.canary;
+        var p: number;
+        this.canary = 3;
+    }
+
+    //type of 'this' in member function param list is the class instance type
+    memberFunc(t = this) {
+        var t: MyGenericTestClass<T, U>;
+
+        //type of 'this' in member function body is the class instance type
+        var p = this;
+        var p: MyGenericTestClass<T, U>;
+    }
+
+    //type of 'this' in member accessor(get and set) body is the class instance type
+    get prop() {
+        var p = this;
+        var p: MyGenericTestClass<T, U>;
+        return this;
+    }
+    set prop(v) {
+        var p = this;
+        var p: MyGenericTestClass<T, U>;
+        p = v;
+        v = p;
+    }
+
+    someFunc = () => {
+        //type of 'this' in member variable initializer is the class instance type
+        var t = this;
+        var t: MyGenericTestClass<T, U>;
+    };
+
+    //type of 'this' in static function param list is constructor function type
+    static staticFn(t = this) {
+        var t: typeof MyGenericTestClass;
+        var t = MyGenericTestClass;
+        t.staticCanary;
+
+        //type of 'this' in static function body is constructor function type
+        var p = this;
+        var p: typeof MyGenericTestClass;
+        var p = MyGenericTestClass;
+        p.staticCanary;
+    }
+
+    static get staticProp() {
+        //type of 'this' in static accessor body is constructor function type
+        var p = this;
+        var p: typeof MyGenericTestClass;
+        var p = MyGenericTestClass;
+        p.staticCanary;
+        return this;
+    }
+    static set staticProp(v: typeof MyGenericTestClass) {
+        //type of 'this' in static accessor body is constructor function type
+        var p = this;
+        var p: typeof MyGenericTestClass;
+        var p = MyGenericTestClass;
+        p.staticCanary;
+    }
+}
+
+//type of 'this' in a function declaration param list is Any
+function fn(s = this) {
+    var s: any;
+    s.spaaaaaaace = 4;
+
+    //type of 'this' in a function declaration body is Any
+    var t: any;
+    var t = this;
+    this.spaaaaace = 4;
+}
+
+//type of 'this' in a function expression param list list is Any
+var q1 = function (s = this) {
+    var s: any;
+    s.spaaaaaaace = 4;
+
+    //type of 'this' in a function expression body is Any
+    var t: any;
+    var t = this;
+    this.spaaaaace = 4;
+}
+
+//type of 'this' in a fat arrow expression param list is typeof globalThis
+var q2 = (s = this) => {
+    var s: typeof globalThis;
+    s.spaaaaaaace = 4;
+
+    //type of 'this' in a fat arrow expression body is typeof globalThis
+    var t: typeof globalThis;
+    var t = this;
+    this.spaaaaace = 4;
+}
+
+//type of 'this' in global module is GlobalThis
+var t: typeof globalThis;
+var t = this;
+this.spaaaaace = 4;
+
diff --git a/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts b/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts
index 8884754b48..c6378e0dc3 100644
--- a/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts
+++ b/tests/cases/conformance/expressions/typeGuards/TypeGuardWithArrayUnion.ts
@@ -7,3 +7,4 @@ function saySize(message: Message | Message[]) {
         return message.length;  // Should have type Message[] here
     }
 }
+let rr5 = new Message();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts
index 57d56ccc3b..0f531ea811 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardFunction.ts
@@ -80,4 +80,8 @@ acceptingTypeGuardFunction(isA);
 
 // Binary expressions
 let union2: C | B;
-let union3: boolean | B = isA(union2) || union2;
\ No newline at end of file
+let union3: boolean | B = isA(union2) || union2;
+
+let ee2 = new B();
+let ee3 = new C();
+let ee4 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts
index d0e108b573..3511cc54b1 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardFunctionGenerics.ts
@@ -30,4 +30,6 @@ let test2: B = funC(isB);
 if (funD(isC, a)) {
     a.propC;
 }
-let test3: B = funE(isB, 1);
\ No newline at end of file
+let test3: B = funE(isB, 1);
+let qw7 = new B();
+let qw8 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts
index 1ed8e6ebb0..e14dd79116 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1AndExpr2.ts
@@ -43,4 +43,5 @@ if (typeof strOrNumOrBool !== "string" && numOrBool !== strOrNumOrBool) {
 }
 else {
     var r3: string | number | boolean = strOrNumOrBool; // string | number | boolean
-}
\ No newline at end of file
+}
+let rr1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts
index 1d72f35828..3411e32bcf 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormExpr1OrExpr2.ts
@@ -43,4 +43,5 @@ if (typeof strOrNumOrBool === "string" || numOrBool !== strOrNumOrBool) {
 }
 else {
     numOrBool = strOrNumOrBool; // number | boolean
-}
\ No newline at end of file
+}
+let qw2 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts
index 31514fca74..db3d488209 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormInstanceOf.ts
@@ -1,25 +1,25 @@
-// A type guard of the form x instanceof C, where C is of a subtype of the global type 'Function' 
-// and C has a property named 'prototype'
-//  - when true, narrows the type of x to the type of the 'prototype' property in C provided 
-//    it is a subtype of the type of x, or
-//  - when false, has no effect on the type of x.
-
-class C1 {
-    p1: string;
-}
-class C2 {
-    p2: number;
-}
-class D1 extends C1 {
-    p3: number;
-}
+// A type guard of the form x instanceof C, where C is of a subtype of the global type 'Function' 
+// and C has a property named 'prototype'
+//  - when true, narrows the type of x to the type of the 'prototype' property in C provided 
+//    it is a subtype of the type of x, or
+//  - when false, has no effect on the type of x.
+
+class C1 {
+    p1: string;
+}
+class C2 {
+    p2: number;
+}
+class D1 extends C1 {
+    p3: number;
+}
 class C3 {
     p4: number;
 }
-var str: string;
-var num: number;
-var strOrNum: string | number;
-
+var str: string;
+var num: number;
+var strOrNum: string | number;
+
 var ctor1: C1 | C2;
 str = ctor1 instanceof C1 && ctor1.p1; // C1
 num = ctor1 instanceof C2 && ctor1.p2; // C2
@@ -31,7 +31,7 @@ num = ctor2 instanceof C2 && ctor2.p2; // C2
 num = ctor2 instanceof D1 && ctor2.p3; // D1
 str = ctor2 instanceof D1 && ctor2.p1; // D1
 var r2: D1 | C2 = ctor2 instanceof C1 && ctor2; // C2 | D1
-
+
 var ctor3: C1 | C2;
 if (ctor3 instanceof C1) {
     ctor3.p1; // C1
@@ -64,4 +64,7 @@ if (ctor6 instanceof C1 || ctor6 instanceof C2) {
 }
 else {
     ctor6.p4; // C3
-}
\ No newline at end of file
+}
+let qw4 = new C2();
+let qw3 = new D1();
+let qw5 = new C3();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts
index 9f5ca611ee..e0953773d5 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormIsType.ts
@@ -34,4 +34,7 @@ var c2Ord1: C2 | D1;
 num = isC2(c2Ord1) && c2Ord1.p2; // C2
 num = isD1(c2Ord1) && c2Ord1.p3; // D1
 str = isD1(c2Ord1) && c2Ord1.p1; // D1
-var r2: C2 | D1 = isC1(c2Ord1) && c2Ord1; // C2 | D1
\ No newline at end of file
+var r2: C2 | D1 = isC1(c2Ord1) && c2Ord1; // C2 | D1
+
+let rr2 = new C2();
+let rr3 = new D1();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts
index 37651071b7..610f0da2c8 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfBoolean.ts
@@ -83,3 +83,4 @@ if (typeof strOrNum !== "boolean") {
 else {
     let z2: {} = strOrNum; // {}
 }
+let qw9 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts
index b4cdf81660..f00736781f 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfNumber.ts
@@ -82,3 +82,4 @@ if (typeof strOrBool !== "number") {
 else {
     let y2: {} = strOrBool; // {}
 }
+let ee6 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts
index f742124708..a20093f868 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFormTypeOfString.ts
@@ -82,3 +82,4 @@ if (typeof numOrBool !== "string") {
 else {
     let x2: {} = numOrBool; // {}
 }
+let rr4 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts
index e1256e4288..ceee99f7e2 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardOfFromPropNameInUnionType.ts
@@ -103,3 +103,12 @@ function f(i: Indexed) {
     }
     return "c" in i && i.c;
 }
+let tt1 = new A();
+let tt2 = new B();
+let tt3 = new C();
+let tt4 = new D();
+let tt5 = new AWithOptionalProp();
+let tt6 = new BWithOptionalProp();
+let tt7 = new ClassWithUnionProp();
+let tt8 = new InMemberOfClass();
+let tt9 = new SelfAssert();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts
index 04b9a6a394..044131068a 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassAccessors.ts
@@ -101,3 +101,4 @@ class ClassWithAccessors {
         num = typeof var2 === "string" && var2.length; // string
     }
 }
+let ee1 = new ClassWithAccessors();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts
index cb1327027c..7bb36dfefe 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInClassMethods.ts
@@ -65,3 +65,4 @@ class C1 {
         num = typeof param === "string" && param.length; // string
     }
 }
+let qw1 = new C1(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts
index bffe8d3d1b..b7fd3f9c34 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsInProperties.ts
@@ -24,4 +24,5 @@ strOrNum = typeof c1.pp3 === "string" && c1.pp3; // string | number
 var obj1: {
     x: string | number;
 };
-strOrNum = typeof obj1.x === "string" && obj1.x;  // string | number
\ No newline at end of file
+strOrNum = typeof obj1.x === "string" && obj1.x;  // string | number
+let ee5 = new C1();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts b/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts
index 2c26b10c6a..574f2af39c 100644
--- a/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts
+++ b/tests/cases/conformance/expressions/typeGuards/typeGuardsOnClassProperty.ts
@@ -25,4 +25,5 @@ var o: {
 
 if (typeof o.prop1 === "string" && o.prop1.toLowerCase()) {}
 var prop1 = o.prop1;
-if (typeof prop1 === "string" && prop1.toLocaleLowerCase()) { }
\ No newline at end of file
+if (typeof prop1 === "string" && prop1.toLocaleLowerCase()) { }
+let qw6 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts
index b41a114503..87e1d09bea 100644
--- a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts
+++ b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithNumberType.ts
@@ -43,4 +43,5 @@ var ResultIsNumber13 = ~~~(NUMBER + NUMBER);
 ~foo();
 ~objA.a;
 ~M.n;
-~objA.a, M.n;
\ No newline at end of file
+~objA.a, M.n;
+let qr11 = new A();
\ No newline at end of file
diff --git a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts
index 0b60c73ef9..4495309b10 100644
--- a/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts
+++ b/tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithStringType.ts
@@ -42,4 +42,5 @@ var ResultIsNumber14 = ~~~(STRING + STRING);
 ~STRING;
 ~STRING1;
 ~foo();
-~objA.a,M.n;
\ No newline at end of file
+~objA.a,M.n;
+let qr12 = new A();
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/exportNonVisibleType.ts b/tests/cases/conformance/externalModules/exportNonVisibleType.ts
index 4f4722fd86..cc56bd2f0b 100644
--- a/tests/cases/conformance/externalModules/exportNonVisibleType.ts
+++ b/tests/cases/conformance/externalModules/exportNonVisibleType.ts
@@ -31,3 +31,4 @@ class C1 {
 }
 
 export = C1; // Should work, private type I1 of visible class C1 only used in private member m1.
+let qt8 = new C1();
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts
new file mode 100644
index 0000000000..83e86fc6c6
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension1.ts
@@ -0,0 +1,12 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/foo.mts
+export function foo() {
+    return "";
+}
+
+// @filename: /src/bar.mts
+// Extensionless relative path ES import in an ES module
+import { foo } from "./foo"; // should error, suggest adding ".mjs"
+import { baz } from "./baz"; // should error, ask for extension, no extension suggestion
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts
new file mode 100644
index 0000000000..0051e17401
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension2.ts
@@ -0,0 +1,6 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/buzz.mts
+// Extensionless relative path cjs import in an ES module
+import foo = require("./foo"); // should error, should not ask for extension
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts
new file mode 100644
index 0000000000..2ec3ff1ad0
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension3.ts
@@ -0,0 +1,12 @@
+// @moduleResolution: nodenext
+// @module: nodenext
+// @jsx: preserve
+
+// @filename: /src/foo.tsx
+export function foo() {
+    return "";
+}
+
+// @filename: /src/bar.mts
+// Extensionless relative path ES import in an ES module
+import { foo } from "./foo"; // should error, suggest adding ".jsx"
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts
new file mode 100644
index 0000000000..c1eab70f92
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension4.ts
@@ -0,0 +1,12 @@
+// @moduleResolution: nodenext
+// @module: nodenext
+// @jsx: react
+
+// @filename: /src/foo.tsx
+export function foo() {
+    return "";
+}
+
+// @filename: /src/bar.mts
+// Extensionless relative path ES import in an ES module
+import { foo } from "./foo"; // should error, suggest adding ".js"
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts
new file mode 100644
index 0000000000..5053a242cd
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension5.ts
@@ -0,0 +1,6 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/buzz.mts
+// Extensionless relative path dynamic import in an ES module
+import("./foo").then(x => x); // should error, ask for extension
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts
new file mode 100644
index 0000000000..2a6ef2645d
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension6.ts
@@ -0,0 +1,8 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/bar.cts
+// Extensionless relative path import statement in a cjs module
+// Import statements are not allowed in cjs files,
+// but other errors should not assume that they are allowed
+import { foo } from "./foo"; // should error, should not ask for extension
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts
new file mode 100644
index 0000000000..3b10dd6e48
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension7.ts
@@ -0,0 +1,6 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/bar.cts
+// Extensionless relative path cjs import in a cjs module
+import foo = require("./foo"); // should error, should not ask for extension
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts
new file mode 100644
index 0000000000..fef17b3aa1
--- /dev/null
+++ b/tests/cases/conformance/externalModules/moduleResolutionWithoutExtension8.ts
@@ -0,0 +1,6 @@
+// @moduleResolution: node12
+// @module: node12
+
+// @filename: /src/bar.cts
+// Extensionless relative path dynamic import in a cjs module
+import("./foo").then(x => x); // should error, ask for extension
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts b/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts
new file mode 100644
index 0000000000..c8c584f66d
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/exportSpecifiers.ts
@@ -0,0 +1,21 @@
+// @module: esnext
+// @declaration: true
+
+// @Filename: /imports.ts
+import { type, as, something, foo, bar } from "./exports.js";
+type;
+as; // Error (used in emitting position)
+something; // Error (used in emitting position)
+foo; // Error (used in emitting position)
+bar; // Error (used in emitting position)
+
+// @Filename: /exports.ts
+const type = 0;
+const as = 0;
+const something = 0;
+export { type };
+export { type as };
+export { type something };
+export { type type as foo };
+export { type as as bar };
+export type { type something as whatever }; // Error
diff --git a/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts
new file mode 100644
index 0000000000..3e949a0611
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/a.ts
@@ -0,0 +1,2 @@
+// @Filename: /a.ts
+export default class A {}
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts
new file mode 100644
index 0000000000..3bb8cdfce2
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/importDefaultNamedType/importDefaultNamedType.ts
@@ -0,0 +1,5 @@
+
+
+// @Filename: /b.ts
+import type from './a';
+type;
\ No newline at end of file
diff --git a/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts b/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts
new file mode 100644
index 0000000000..348784befd
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/importSpecifiers1.ts
@@ -0,0 +1,46 @@
+// @module: esnext
+// @declaration: true
+
+// @Filename: /mod.ts
+export const as = 0;
+export const type = 0;
+export const something = 0;
+
+// @Filename: /a.ts
+import { type } from "./mod.js";
+import { type as } from "./mod.js";
+type;
+as; // Error (used in emitting position)
+
+// @Filename: /b.ts
+import { type as as } from "./mod.js";
+type; // Error (cannot resolve name)
+as;
+
+// @Filename: /c.ts
+import { type as as as } from "./mod.js";
+type; // Error (cannot resolve name)
+as; // Error (used in emitting position)
+
+// @Filename: /d.ts
+import { type as as as as } from "./mod.js"; // Error
+
+// @Filename: /e.ts
+import { type type as as } from "./mod.js";
+import { type as type } from "./mod.js";
+type;
+as; // Error (used in emitting position)
+
+// @Filename: /f.ts
+import { type import } from "./mod.js"; // Error
+import { type as export } from "./mod.js"; // Error
+import { type as as export } from "./mod.js"; // Error
+import { type something } from "./mod.js";
+import { type something as s } from "./mod.js";
+type; // Error (cannot resolve name)
+as; // Error (cannot resolve name)
+something; // Error (used in emitting position)
+s; // Error (used in emitting position)
+
+// @Filename: /g.ts
+import type { type something } from "./mod.js"; // Error
diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts
new file mode 100644
index 0000000000..66326cb98b
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports.ts
@@ -0,0 +1,28 @@
+// @preserveValueImports: true
+// @isolatedModules: true,false
+// @module: esnext
+
+// @Filename: a.ts
+export default {};
+export const b = 0;
+export const c = 1;
+export interface D {}
+
+// @Filename: b.ts
+import a, { b, c, D } from "./a";
+
+// @Filename: c.ts
+import * as a from "./a";
+
+// @Filename: d.ts
+export = {};
+
+// @Filename: e.ts
+import D = require("./d");
+import DD = require("./d");
+DD;
+
+// @Filename: f.ts
+import type a from "./a";
+import { b, c } from "./a";
+b;
diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts
new file mode 100644
index 0000000000..fc2a3612e7
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_errors.ts
@@ -0,0 +1,47 @@
+// @preserveValueImports: true
+// @isolatedModules: true,false
+// @module: esnext
+
+// @Filename: a.ts
+export type A = {};
+export type { A as default };
+
+// @Filename: b.ts
+class B {};
+export type { B, B as default };
+
+// @Filename: c.ts
+import DefaultA from "./a";
+import { A } from "./a";
+import DefaultB from "./b";
+import { B } from "./b";
+
+// @Filename: c.fixed.ts
+import type DefaultA from "./a";
+import type { A } from "./a";
+import type DefaultB from "./b";
+import type { B } from "./b";
+
+// @Filename: d.ts
+export { A as AA } from "./a";
+export { B as BB } from "./b";
+
+// @Filename: d.fixed.ts
+export type { A as AA } from "./a";
+export type { B as BB } from "./b";
+
+// @Filename: e.ts
+import { AA, BB } from "./d";
+
+// @Filename: e.fixed.ts
+import type { AA, BB } from "./d";
+
+// @Filename: f.ts
+import type { A } from "./a";
+import type { B } from "./b";
+export { A, B as BB };
+
+// @Filename: f.fixed.ts
+import type { A } from "./a";
+import type { B } from "./b";
+export type { A, B as BB };
diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts
new file mode 100644
index 0000000000..4797a30727
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_importsNotUsedAsValues.ts
@@ -0,0 +1,14 @@
+// @preserveValueImports: true
+// @importsNotUsedAsValues: preserve
+// @module: esnext
+
+// @Filename: /mod.ts
+export type A = unknown;
+export type B = never;
+export type C = any;
+
+// @Filename: /index.ts
+import { type A, type B, type C } from "./mod.js";
+
+// @Filename: /reexport.ts
+export { type A, type B, type C } from "./mod.js";
diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts
new file mode 100644
index 0000000000..85cbae30f7
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_mixedImports.ts
@@ -0,0 +1,13 @@
+// @preserveValueImports: true
+// @isolatedModules: true
+// @module: es2015
+
+// @Filename: /exports.ts
+export function Component() {}
+export interface ComponentProps {}
+
+// @Filename: /index.ts
+import { Component, ComponentProps } from "./exports.js";
+
+// @Filename: /index.fixed.ts
+import { Component, type ComponentProps } from "./exports.js";
diff --git a/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts
new file mode 100644
index 0000000000..27f78f707c
--- /dev/null
+++ b/tests/cases/conformance/externalModules/typeOnly/preserveValueImports_module.ts
@@ -0,0 +1,4 @@
+// @preserveValueImports: true
+// @module: amd,system,commonjs,es2015
+// @noTypesAndSymbols: true
+export {};
diff --git a/tests/cases/conformance/importAssertion/importAssertion1.ts b/tests/cases/conformance/importAssertion/importAssertion1.ts
new file mode 100644
index 0000000000..b547158cf1
--- /dev/null
+++ b/tests/cases/conformance/importAssertion/importAssertion1.ts
@@ -0,0 +1,37 @@
+// @declaration: true
+// @target: es2015
+// @module: es2015, commonjs, esnext
+
+// @filename: 0.ts
+export const a = 1;
+export const b = 2;
+
+// @filename: 1.ts
+import './0' assert { type: "json" }
+import { a, b } from './0' assert { "type": "json" }
+import * as foo from './0' assert { type: "json" }
+a;
+b;
+foo.a;
+foo.b;
+
+// @filename: 2.ts
+import { a, b } from './0' assert {}
+import { a as c, b as d } from './0' assert { a: "a", b: "b", c: "c" }
+a;
+b;
+c;
+d;
+
+// @filename: 3.ts
+const a = import('./0')
+const b = import('./0', { assert: { type: "json" } })
+const c = import('./0', { assert: { type: "json", ttype: "typo" } })
+const d = import('./0', { assert: {} })
+const dd = import('./0', {})
+declare function foo(): any;
+const e = import('./0', foo())
+const f = import()
+const g = import('./0', {}, {})
+const h = import('./0', { assert: { type: "json" }},)
+
diff --git a/tests/cases/conformance/importAssertion/importAssertion2.ts b/tests/cases/conformance/importAssertion/importAssertion2.ts
new file mode 100644
index 0000000000..42a26af43e
--- /dev/null
+++ b/tests/cases/conformance/importAssertion/importAssertion2.ts
@@ -0,0 +1,17 @@
+// @declaration: true
+// @target: es2015
+// @module: es2015, commonjs, esnext
+
+// @filename: 0.ts
+export const a = 1;
+export const b = 2;
+
+// @filename: 1.ts
+export {} from './0' assert { type: "json" }
+export { a, b } from './0' assert { type: "json" }
+export * from './0' assert { type: "json" }
+export * as ns from './0' assert { type: "json" }
+
+// @filename: 2.ts
+export { a, b } from './0' assert {}
+export { a as c, b as d } from './0' assert { a: "a", b: "b", c: "c" }
diff --git a/tests/cases/conformance/importAssertion/importAssertion3.ts b/tests/cases/conformance/importAssertion/importAssertion3.ts
new file mode 100644
index 0000000000..28479378b1
--- /dev/null
+++ b/tests/cases/conformance/importAssertion/importAssertion3.ts
@@ -0,0 +1,15 @@
+// @declaration: true
+// @target: es2015
+// @module: es2015, esnext
+
+// @filename: 0.ts
+export interface I { }
+
+// @filename: 1.ts
+export type {} from './0' assert { type: "json" }
+export type { I } from './0' assert { type: "json" }
+
+// @filename: 2.ts
+import type { I } from './0'  assert { type: "json" }
+import type * as foo from './0' assert { type: "json" }
+
diff --git a/tests/cases/conformance/importAssertion/importAssertion4.ts b/tests/cases/conformance/importAssertion/importAssertion4.ts
new file mode 100644
index 0000000000..242d7dd375
--- /dev/null
+++ b/tests/cases/conformance/importAssertion/importAssertion4.ts
@@ -0,0 +1 @@
+import * as f from "./first" assert
diff --git a/tests/cases/conformance/importAssertion/importAssertion5.ts b/tests/cases/conformance/importAssertion/importAssertion5.ts
new file mode 100644
index 0000000000..ef09d84e66
--- /dev/null
+++ b/tests/cases/conformance/importAssertion/importAssertion5.ts
@@ -0,0 +1 @@
+import * as f from "./first" assert {
diff --git a/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts b/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts
index e3d076707b..8b95f5e240 100644
--- a/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts
+++ b/tests/cases/conformance/interfaces/declarationMerging/mergedInterfacesWithMultipleBases3.ts
@@ -32,4 +32,8 @@ class D implements A<boolean> {
     d: string;
     y: boolean;
     z: boolean;
-}
\ No newline at end of file
+}
+let ww1 = new C();
+let ww2 = new C2();
+let ww3 = new C3();
+let ww4 = new C4();
diff --git a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts
index 003976a2b2..1ab2942311 100644
--- a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts
+++ b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceExtendsObjectIntersection.ts
@@ -53,3 +53,15 @@ class C20 extends Constructor<Partial<T1>>() { x: string }
 class C21 extends Constructor<Readonly<T1>>() { x: string }
 class C22 extends Constructor<Identifiable<T1>>() { x: string }
 class C23 extends Constructor<Identifiable<T1 & { b: number}>>() { x: string }
+let c1 = new C1();
+let c2 = new C2();
+let c3 = new C3();
+let c4 = new C4();
+let c5 = new C5();
+let c6 = new C6();
+let c7 = new C7();
+let cx = new CX();
+let c20 = new C20();
+let c21 = new C21();
+let c22 = new C22();
+let c23 = new C23();
\ No newline at end of file
diff --git a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts
index 6979b40579..20d877f7a2 100644
--- a/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts
+++ b/tests/cases/conformance/interfaces/interfaceDeclarations/interfaceWithPropertyOfEveryType.ts
@@ -39,4 +39,5 @@ var a: Foo = {
     m: M,
     n: {},
     o: E.A
-}
\ No newline at end of file
+}
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts
index 12f51f90a7..e1af2f0ac6 100644
--- a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts
+++ b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndAmbientWithSameNameAndCommonRoot.ts
@@ -21,4 +21,3 @@ declare module A {
 var p: { x: number; y: number; }
 var p = A.Point.Origin;
 var p = new A.Point(0, 0); // unexpected error here, bug 840000
- 
\ No newline at end of file
diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts
index e923f1f002..b9bb58e89e 100644
--- a/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts
+++ b/tests/cases/conformance/internalModules/DeclarationMerging/AmbientModuleAndNonAmbientClassWithSameNameAndCommonRoot.ts
@@ -13,6 +13,7 @@ module A {
     export class Point {
         constructor(public x: number, public y: number) { }
     }
+    let pp = new Point(1,1);
 }
 
 // @filename: test.ts
diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts
index d285d9b422..9dca12bc2e 100644
--- a/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts
+++ b/tests/cases/conformance/internalModules/DeclarationMerging/ClassAndModuleThatMergeWithStaticFunctionAndNonExportedFunctionThatShareAName.ts
@@ -19,4 +19,6 @@ module A {
     export module Point {
         function Origin() { return ""; }// not an error since not exported
     }
-}
\ No newline at end of file
+    let pp = new Point(1,1);
+}
+let pp1 = new Point(1,1);
\ No newline at end of file
diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts
index 7d88bf6292..71433fbef5 100644
--- a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts
+++ b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedAndNonExportedClassesOfTheSameName.ts
@@ -3,6 +3,7 @@ module A {
         x: number;
         y: number;
     }
+    let pp = new Point();
 }
 
 module A {
@@ -11,6 +12,7 @@ module A {
             return { x: p.x, y: p.y };
         }
     }
+    let pp1 = new Point();
 }
 
 // ensure merges as expected
@@ -21,6 +23,7 @@ module X.Y.Z {
     export class Line {
         length: number;
     }
+    let ll = new Line();
 }
 
 module X {
@@ -29,6 +32,7 @@ module X {
             class Line {
                 name: string;
             }
+            let ll1 = new Line()
         }
     }
 }
diff --git a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts
index 449e6e76a2..a0c9072675 100644
--- a/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts
+++ b/tests/cases/conformance/internalModules/DeclarationMerging/TwoInternalModulesThatMergeEachWithExportedModulesOfTheSameName.ts
@@ -16,6 +16,7 @@ module X.Y.Z {
     export class Line {
         length: number;
     }
+    let ll = new Line();
 }
 
 module X {
@@ -24,6 +25,7 @@ module X {
             export class Line {
                 name: string;
             }
+            let ll1 = new Line(); 
         }
     }
 }
diff --git a/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts b/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts
index 02398acbbb..321d84cd56 100644
--- a/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts
+++ b/tests/cases/conformance/internalModules/codeGeneration/exportCodeGen.ts
@@ -39,6 +39,7 @@ module E {
     export module M {
         export var x = 42;
     }
+    let c1 = new C();
 }
 
 // validate all exportable statements,
@@ -51,4 +52,5 @@ module F {
     module M {
         var x = 42;
     }
+    let c2 = new C();
 }
\ No newline at end of file
diff --git a/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts b/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts
index aef48103cd..14d12af759 100644
--- a/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts
+++ b/tests/cases/conformance/internalModules/codeGeneration/nameCollision.ts
@@ -15,6 +15,7 @@ module B {
     class B {
         name: string;
     }
+    let bb = new B();
 }
 
 module X {
diff --git a/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts b/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts
index 6d2f3780ee..72a97ff055 100644
--- a/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts
+++ b/tests/cases/conformance/jsdoc/constructorTagOnClassConstructor.ts
@@ -11,4 +11,6 @@ export class Beta {
   }
 }
 
-const arr = [Alpha, Beta];
+// const arr = [Alpha, Beta];
+let aa = new Alpha();
+let be = new Beta();
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts
index eb609720d7..b0bf85be74 100644
--- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts
+++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsSubclassWithExplicitNoArgumentConstructor.ts
@@ -16,4 +16,5 @@ export class Sub extends Super {
     constructor() {
         super('first', 'second');
     }
-}
\ No newline at end of file
+}
+let ss = new Sub();
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts
index bc2eae7dac..29ba837ef9 100644
--- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts
+++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsThisTypes.ts
@@ -14,4 +14,6 @@ export class A {
 export default class Base extends A {
     // This method is required to reproduce #35932
     verify() { }
-}
\ No newline at end of file
+}
+
+let b = new Base();
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts b/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts
new file mode 100644
index 0000000000..859c60103b
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/enumTagImported/enumTagImported.ts
@@ -0,0 +1,23 @@
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+// @Filename: type.js
+/** @typedef {import("./mod1").TestEnum} TE */
+/** @type {TE} */
+const test = 'add'
+/** @type {import("./mod1").TestEnum} */
+const tost = 'remove'
+
+// @Filename: value.js
+import { TestEnum } from "./mod1"
+/** @type {TestEnum} */
+const tist = TestEnum.ADD
+
+
+// @Filename: mod1.js
+
+/** @enum {string} */
+// export const TestEnum = {
+//     ADD: 'add',
+//     REMOVE: 'remove'
+// }
diff --git a/tests/cases/conformance/jsdoc/extendsTag1.ts b/tests/cases/conformance/jsdoc/extendsTag1.ts
index 194982760e..79b3bc7079 100644
--- a/tests/cases/conformance/jsdoc/extendsTag1.ts
+++ b/tests/cases/conformance/jsdoc/extendsTag1.ts
@@ -8,3 +8,4 @@
  * @extends {Set<T>} Should prefer this Set<T>, not the Set in the heritage clause
  */
 class My extends Set {}
+let q4 = new My();
diff --git a/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts b/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts
new file mode 100644
index 0000000000..ce4fb95ff2
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/jsdocAugments_qualifiedName/jsdocAugments_qualifiedName.ts
@@ -0,0 +1,10 @@
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+
+
+// @Filename: /b.js
+import * as a from "./a";
+let b = a.A;
+/** @augments a.A */
+class B {}
diff --git a/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts b/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts
index e94df03fbc..aba2b989e7 100644
--- a/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts
+++ b/tests/cases/conformance/jsdoc/jsdocAugments_withTypeParameter.ts
@@ -12,3 +12,4 @@ class B extends A {
         return this.x;
     }
 }
+let q7 = new B();
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts b/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts
index c298e6685a..9af8207ba4 100644
--- a/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts
+++ b/tests/cases/conformance/jsdoc/jsdocImplements_namespacedInterface.ts
@@ -26,3 +26,5 @@ class BAT {
         return "";
     }
 }
+let q1 = new B();
+let q2 = new BAT();
diff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts
new file mode 100644
index 0000000000..c93359a7a6
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/jsdocTemplateTagDefault.ts
@@ -0,0 +1,71 @@
+// @allowJs: true
+// @checkJs: true
+// @declaration: true
+// @outDir: out
+// @Filename: file.js
+
+/**
+ * @template {string | number} [T=string] - ok: defaults are permitted
+ * @typedef {[T]} A
+ */
+
+/** @type {A} */ // ok, default for `T` in `A` is `string`
+const aDefault1 = [""];
+/** @type {A} */ // error: `number` is not assignable to string`
+const aDefault2 = [0];
+/** @type {A<string>} */ // ok, `T` is provided for `A`
+const aString = [""];
+/** @type {A<number>} */ // ok, `T` is provided for `A`
+const aNumber = [0];
+
+/**
+ * @template T
+ * @template [U=T] - ok: default can reference earlier type parameter
+ * @typedef {[T, U]} B
+ */
+
+/**
+ * @template {string | number} [T] - error: default requires an `=type`
+ * @typedef {[T]} C
+ */
+
+/**
+ * @template {string | number} [T=] - error: default requires a `type`
+ * @typedef {[T]} D
+ */
+
+/**
+ * @template {string | number} [T=string]
+ * @template U - error: Required type parameters cannot follow optional type parameters
+ * @typedef {[T, U]} E
+ */
+
+/**
+ * @template [T=U] - error: Type parameter defaults can only reference previously declared type parameters.
+ * @template [U=T]
+ * @typedef {[T, U]} G
+ */
+
+/**
+ * @template T
+ * @template [U=T] - ok: default can reference earlier type parameter
+ * @param {T} a
+ * @param {U} b
+ */
+function f1(a, b) {}
+
+ /**
+ * @template {string | number} [T=string]
+ * @template U - error: Required type parameters cannot follow optional type parameters
+ * @param {T} a
+ * @param {U} b
+ */
+function f2(a, b) {}
+
+/**
+ * @template [T=U] - error: Type parameter defaults can only reference previously declared type parameters.
+ * @template [U=T]
+ * @param {T} a
+ * @param {U} b
+ */
+function f3(a, b) {}
diff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts
new file mode 100644
index 0000000000..a5b4d052ad
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/jsdocTemplateTagNameResolution.ts
@@ -0,0 +1,16 @@
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @declaration: true
+// @Filename: file.js
+
+/**
+ * @template T
+ * @template {keyof T} K
+ * @typedef {T[K]} Foo
+ */
+
+const x = { a: 1 };
+
+/** @type {Foo<typeof x, "a">} */
+const y = "a";
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts b/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts
index 93e735e1fa..b38836e7e7 100644
--- a/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts
+++ b/tests/cases/conformance/jsdoc/jsdocTypeReferenceUseBeforeDef.ts
@@ -6,3 +6,4 @@
 const c = null
 class C {
 }
+let q3 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/jsdoc/jsdocVariadicType.ts b/tests/cases/conformance/jsdoc/jsdocVariadicType.ts
new file mode 100644
index 0000000000..cd4e75a54a
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/jsdocVariadicType.ts
@@ -0,0 +1,12 @@
+// @allowJS: true
+// @checkJs: true
+// @noEmit: true
+
+// @filename: a.js
+/**
+ * @type {function(boolean, string, ...*):void}
+ */
+const foo = function (a, b, ...r) { };
+
+// @filename: b.ts
+foo(false, '');
diff --git a/tests/cases/conformance/jsdoc/seeTag3.ts b/tests/cases/conformance/jsdoc/seeTag3.ts
new file mode 100644
index 0000000000..abd16226fe
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/seeTag3.ts
@@ -0,0 +1,7 @@
+// @outdir: out/
+// @checkJs: true
+// @filename: seeTag3.js
+
+/** @see [The typescript web site](https://typescriptlang.org)  */
+function theWholeThing() {
+}
diff --git a/tests/cases/conformance/jsdoc/thisTag2.ts b/tests/cases/conformance/jsdoc/thisTag2.ts
new file mode 100644
index 0000000000..187ac9b932
--- /dev/null
+++ b/tests/cases/conformance/jsdoc/thisTag2.ts
@@ -0,0 +1,11 @@
+// @target: esnext
+// @allowJs: true
+// @declaration: true
+// @emitDeclarationOnly: true
+// @filename: a.js
+
+/** @this {string} */
+export function f1() {}
+
+/** @this */
+export function f2() {}
diff --git a/tests/cases/conformance/jsx/jsxParsingError4.tsx b/tests/cases/conformance/jsx/jsxParsingError4.tsx
new file mode 100644
index 0000000000..c4db4fe7ab
--- /dev/null
+++ b/tests/cases/conformance/jsx/jsxParsingError4.tsx
@@ -0,0 +1,18 @@
+// @strict: true, false
+// @jsx: react
+// @filename: a.tsx
+
+declare const React: any
+declare namespace JSX {
+    interface IntrinsicElements {
+        [k: string]: any
+    }
+}
+
+const a = (
+  <public-foo></public-foo>
+);
+
+const b = (
+  <public></public>
+);
diff --git a/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts b/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts
new file mode 100644
index 0000000000..08b6149d37
--- /dev/null
+++ b/tests/cases/conformance/jsx/jsxUnclosedParserRecovery.ts
@@ -0,0 +1,140 @@
+// @Filename: jsxParserRecovery.tsx
+// @jsx: preserve
+
+// should have no errors here; all these functions should parse and resolve
+noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
+noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
+noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
+
+function diddy() {
+    return null;
+}
+
+var donkey = <div>
+    <
+</div>;
+function noName() { }
+var donkey = <div>
+    <diddy
+</div>;
+function noClose() { }
+var donkey = <div>
+    <diddy<boolean>
+</div>;
+function noCloseTypeArg() { }
+var donkey = <div>
+    <diddy bananas="please"
+</div>;
+function noCloseAttrs() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"
+</div>;
+function noCloseTypeArgAttrs() { }
+var donkey = <div>
+    <diddy/
+</div>;
+function noCloseBracket() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"/
+</div>;
+function noCloseBracketTypeArgAttrs() { }
+var donkey = <div>
+    <diddy>
+</div>;
+function noSelfclose() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please">
+</div>;
+function noSelfcloseTypeArgAttrs() { }
+
+var donkey = <div>
+    <
+    <diddy/>
+</div>;
+function noNameTrailingTag() { }
+var donkey = <div>
+    <diddy
+    <diddy/>
+</div>;
+function noCloseTrailingTag() { }
+var donkey = <div>
+    <diddy<boolean>
+    <diddy/>
+</div>;
+function noCloseTypeArgTrailingTag() { }
+var donkey = <div>
+    <diddy bananas="please"
+    <diddy/>
+</div>;
+function noCloseAttrsTrailingTag() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"
+    <diddy/>
+</div>;
+function noCloseTypeArgAttrsTrailingTag() { }
+var donkey = <div>
+    <diddy/
+    <diddy/>
+</div>;
+function noCloseBracketTrailingTag() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"/
+    <diddy/>
+</div>;
+function noCloseBracketTypeArgAttrsTrailingTag() { }
+var donkey = <div>
+    <diddy>
+    <diddy/>
+</div>;
+function noSelfcloseTrailingTag() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please">
+    <diddy/>
+</div>;
+function noSelfcloseTypeArgAttrsTrailingTag() { }
+
+var donkey = <div>
+    <
+    Cranky Wrinkly Funky
+</div>;
+function noNameTrailingText() { }
+var donkey = <div>
+    <diddy
+    Cranky Wrinkly Funky
+</div>;
+function noCloseTrailingText() { }
+var donkey = <div>
+    <diddy<boolean>
+    Cranky Wrinkly Funky
+</div>;
+function noCloseTypeArgTrailingText() { }
+var donkey = <div>
+    <diddy bananas="please"
+    Cranky Wrinkly Funky
+</div>;
+function noCloseAttrsTrailingText() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"
+    Cranky Wrinkly Funky
+</div>;
+function noCloseTypeArgAttrsTrailingText() { }
+var donkey = <div>
+    <diddy/
+    Cranky Wrinkly Funky
+</div>;
+function noCloseBracketTrailingText() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please"/
+    Cranky Wrinkly Funky
+</div>;
+function noCloseBracketTypeArgAttrsTrailingText() { }
+var donkey = <div>
+    <diddy>
+    Cranky Wrinkly Funky
+</div>;
+function noSelfcloseTrailingText() { }
+var donkey = <div>
+    <diddy<boolean> bananas="please">
+    Cranky Wrinkly Funky
+</div>;
+function noSelfcloseTypeArgAttrsTrailingText() { }
diff --git a/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts b/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts
new file mode 100644
index 0000000000..2ddc20ae39
--- /dev/null
+++ b/tests/cases/conformance/jsx/tsxReactEmitSpreadAttribute.ts
@@ -0,0 +1,32 @@
+// @jsx: react-jsx
+// @target: es2015,es2018,esnext
+// @filename: test.tsx
+/// <reference path="/.lib/react16.d.ts" />
+
+export function T1(a: any) {
+    return <div className={"T1"} { ...a }>T1</div>;
+}
+
+export function T2(a: any, b: any) {
+    return <div className={"T2"} { ...a } { ...b }>T2</div>;
+}
+
+export function T3(a: any, b: any) {
+    return <div { ...a } className={"T3"} { ...b }>T3</div>;
+}
+
+export function T4(a: any, b: any) {
+    return <div className={"T4"} { ...{ ...a, ...b } }>T4</div>;
+}
+
+export function T5(a: any, b: any, c: any, d: any) {
+    return <div className={"T5"} { ...{ ...a, ...b, ...{ c, d } } }>T5</div>;
+}
+
+export function T6(a: any, b: any, c: any, d: any) {
+    return <div className={"T6"} { ...{ ...a, ...b, ...{ ...c, ...d } } }>T6</div>;
+}
+
+export function T7(a: any, b: any, c: any, d: any) {
+    return <div>T7</div>;
+}
diff --git a/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts b/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts
new file mode 100644
index 0000000000..75c681daf0
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/declarationNotFoundPackageBundlesTypes.ts
@@ -0,0 +1,23 @@
+// @noImplicitAny: true
+// @noImplicitReferences: true
+
+// @filename: node_modules/foo/package.json
+{   
+    "name": "foo",
+    "version": "1.0.0"
+}
+
+// @filename: node_modules/foo/index.js
+var foo = 0;
+module.exports = foo;
+
+// @filename: node_modules/foo/index.d.ts
+declare const foo: any;
+export = foo;
+
+// @filename: node_modules/foo/other.js
+module.exports = {};
+
+// @filename: index.ts
+import * as Foo from "foo";
+import * as Other from "foo/other"/*1*/;
\ No newline at end of file
diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts b/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts
new file mode 100644
index 0000000000..04d4f15421
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/scopedPackages/index.d.ts
@@ -0,0 +1,3 @@
+// @filename: /node_modules/@cow/boy/index.d.ts
+export const x: number;
+export const y: number;
\ No newline at end of file
diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts b/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts
new file mode 100644
index 0000000000..80db9778d1
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/scopedPackages/scopedPackages.ts
@@ -0,0 +1,12 @@
+// @noImplicitReferences: true
+// @traceResolution: true
+// @typeRoots: types
+
+
+// @filename: /a.ts
+import { x } from "./index";
+import { y } from "./index";
+import { z } from "./z";
+x;
+y;
+z;
\ No newline at end of file
diff --git a/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts b/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts
new file mode 100644
index 0000000000..8af8c4b248
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/scopedPackages/z.d.ts
@@ -0,0 +1,2 @@
+// @filename: /node_modules/@types/be__bop/e/z.d.ts
+export const z: number;
\ No newline at end of file
diff --git a/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts
new file mode 100644
index 0000000000..7cfe77597d
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/index.d.ts
@@ -0,0 +1,2 @@
+// @filename: /node_modules/@types/see__saw/index.d.ts
+export const x = 0;
diff --git a/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts
new file mode 100644
index 0000000000..4f491b9532
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/scopedPackagesClassic/scopedPackagesClassic.ts
@@ -0,0 +1,9 @@
+// @noImplicitReferences: true
+// @traceResolution: true
+// @typeRoots: types
+// @moduleResolution: classic
+
+
+// @filename: /a.ts
+import { x } from "./index";
+x;
\ No newline at end of file
diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts
new file mode 100644
index 0000000000..b2c0c1f81c
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_allowJs/untypedModuleImport_allowJs.ts
@@ -0,0 +1,12 @@
+// @noImplicitReferences: true
+// @currentDirectory: /
+// @allowJs: true
+// @maxNodeModuleJsDepth: 1
+// Same as untypedModuleImport.ts but with --allowJs, so the package will actually be typed.
+
+// @filename: /node_modules/foo/index.js
+// exports.default = { bar() { return 0; } }
+
+// @filename: /a.ts
+import foo from "foo";
+foo.bar();
diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts
new file mode 100644
index 0000000000..c54d01514d
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/declarations.d.ts
@@ -0,0 +1,4 @@
+// @filename: /declarations.d.ts
+declare module "foo" {
+    export const x: number;
+}
diff --git a/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts
new file mode 100644
index 0000000000..577d258b72
--- /dev/null
+++ b/tests/cases/conformance/moduleResolution/untypedModuleImport_vsAmbient/untypedModuleImport_vsAmbient.ts
@@ -0,0 +1,12 @@
+// @noImplicitReferences: true
+// @currentDirectory: /
+// This tests that an ambient module declaration overrides an untyped import.
+
+// @filename: /node_modules/foo/index.js
+// This file is not processed.
+
+
+// @filename: /a.ts
+/// <reference path="./declarations.d.ts" />
+import { x } from "foo";
+x;
diff --git a/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts b/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts
new file mode 100644
index 0000000000..a19a7104ae
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeAllowJsPackageSelfName.ts
@@ -0,0 +1,24 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as self from "package";
+self;
+// @filename: index.mjs
+// esm format file
+import * as self from "package";
+self;
+// @filename: index.cjs
+// esm format file
+import * as self from "package";
+self;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts
new file mode 100644
index 0000000000..113c1fdeb8
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJs1.ts
@@ -0,0 +1,324 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder/index.cjs
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder/index.mjs
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.js
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.cjs
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.mjs
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.js
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.cjs
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.mjs
+// esm format file
+const x = 1;
+export {x};
+// @filename: index.js
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones shouldn't all work - esm format files have no index resolution or extension resolution
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+// esm format file
+const x = 1;
+export {x};
+// @filename: index.cjs
+// ESM-format imports below should issue errors
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones should _mostly_ work - cjs format files have index resolution and extension resolution (except for those which resolve to an esm format file)
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+// cjs format file
+const x = 1;
+export {x};
+// @filename: index.mjs
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones should all fail - esm format files have no index resolution or extension resolution
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+
+// esm format file
+const x = 1;
+export {x};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: subfolder2/package.json
+{
+}
+// @filename: subfolder2/another/package.json
+{
+    "type": "module"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts
new file mode 100644
index 0000000000..ea0821742f
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsCjsFromJs.ts
@@ -0,0 +1,8 @@
+// @module: node12,nodenext
+// @allowJs: true
+// @noEmit: true
+// @filename: foo.cjs
+exports.foo = "foo"
+// @filename: bar.ts
+import foo from "./foo.cjs"
+foo.foo;
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts
new file mode 100644
index 0000000000..1020812d5a
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsConditionalPackageExports.ts
@@ -0,0 +1,126 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.mjsSource;
+mjsi.mjsSource;
+typei.mjsSource;
+ts.mjsSource;
+// @filename: index.mjs
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.mjsSource;
+mjsi.mjsSource;
+typei.mjsSource;
+ts.mjsSource;
+// @filename: index.cjs
+// cjs format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.cjsSource;
+mjsi.cjsSource;
+typei.implicitCjsSource;
+ts.cjsSource;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const implicitCjsSource = true;
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const mjsSource = true;
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const cjsSource = true;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./a": {
+            "require": "./index.cjs",
+            "node": "./index.mjs"
+        },
+        "./b": {
+            "import": "./index.mjs",
+            "node": "./index.cjs"
+        },
+        ".": {
+            "import": "./index.mjs",
+            "node": "./index.js"
+        },
+        "./types": {
+            "types": {
+                "import": "./index.d.mts",
+                "require": "./index.d.cts",
+            },
+            "node": {
+                "import": "./index.mjs",
+                "require": "./index.cjs"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts
new file mode 100644
index 0000000000..d7032c648b
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsDynamicImport.ts
@@ -0,0 +1,27 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+export async function main() {
+    const { readFile } = await import("fs");
+}
+// @filename: index.js
+// esm format file
+export async function main() {
+    const { readFile } = await import("fs");
+}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts
new file mode 100644
index 0000000000..f7d5aaf822
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsExportAssignment.ts
@@ -0,0 +1,32 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+const a = {};
+export = a;
+// @filename: subfolder/file.js
+// cjs format file
+const a = {};
+module.exports = a;
+// @filename: index.js
+// esm format file
+const a = {};
+export = a;
+// @filename: file.js
+// esm format file
+import "fs";
+const a = {};
+module.exports = a;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts
new file mode 100644
index 0000000000..14783731bf
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsGeneratedNameCollisions.ts
@@ -0,0 +1,29 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+function require() {}
+const exports = {};
+class Object {}
+export const __esModule = false;
+export {require, exports, Object};
+// @filename: index.js
+// esm format file
+function require() {}
+const exports = {};
+class Object {}
+export const __esModule = false;
+export {require, exports, Object};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts
new file mode 100644
index 0000000000..53e6b94450
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportAssignment.ts
@@ -0,0 +1,34 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: index.js
+// esm format file
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: file.js
+// esm format file
+const __require = null;
+const _createRequire = null;
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts
new file mode 100644
index 0000000000..d5727a3dc7
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions1.ts
@@ -0,0 +1,34 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+import {default as _fs} from "fs";
+_fs.readFile;
+import * as fs from "fs";
+fs.readFile;
+// @filename: index.js
+// esm format file
+import {default as _fs} from "fs";
+_fs.readFile;
+import * as fs from "fs";
+fs.readFile;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts
new file mode 100644
index 0000000000..032290f78b
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions2.ts
@@ -0,0 +1,30 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.ts
+// cjs format file
+export * from "fs";
+export * as fs from "fs";
+// @filename: index.js
+// esm format file
+export * from "fs";
+export * as fs from "fs";
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts
new file mode 100644
index 0000000000..9452e2003a
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportHelpersCollisions3.ts
@@ -0,0 +1,32 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+export {default} from "fs";
+export {default as foo} from "fs";
+export {bar as baz} from "fs";
+// @filename: index.js
+// esm format file
+export {default} from "fs";
+export {default as foo} from "fs";
+export {bar as baz} from "fs";
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts
new file mode 100644
index 0000000000..a8708434b9
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsImportMeta.ts
@@ -0,0 +1,23 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+const x = import.meta.url;
+export {x};
+// @filename: index.js
+// esm format file
+const x = import.meta.url;
+export {x};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts
new file mode 100644
index 0000000000..65e5721b0b
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageExports.ts
@@ -0,0 +1,92 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mjs
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cjs
+// cjs format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts
new file mode 100644
index 0000000000..b9d6027f5d
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackageImports.ts
@@ -0,0 +1,41 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: index.mjs
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: index.cjs
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js",
+    "imports": {
+        "#cjs": "./index.cjs",
+        "#mjs": "./index.mjs",
+        "#type": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts
new file mode 100644
index 0000000000..2691885690
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExports.ts
@@ -0,0 +1,69 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mjs
+// esm format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cjs
+// cjs format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs/*": "./*.cjs",
+        "./mjs/*": "./*.mjs",
+        "./js/*": "./*.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts
new file mode 100644
index 0000000000..6b96f34758
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsPackagePatternExportsTrailers.ts
@@ -0,0 +1,69 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: index.js
+// esm format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mjs
+// esm format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cjs
+// cjs format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs/*.cjs": "./*.cjs",
+        "./mjs/*.mjs": "./*.mjs",
+        "./js/*.js": "./*.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts
new file mode 100644
index 0000000000..15892edbe3
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsSynchronousCallErrors.ts
@@ -0,0 +1,37 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+import {h} from "../index.js";
+import mod = require("../index.js");
+import {f as _f} from "./index.js";
+import mod2 = require("./index.js");
+export async function f() {
+    const mod3 = await import ("../index.js");
+    const mod4 = await import ("./index.js");
+    h();
+}
+// @filename: index.js
+// esm format file
+import {h as _h} from "./index.js";
+import mod = require("./index.js");
+import {f} from "./subfolder/index.js";
+import mod2 = require("./subfolder/index.js");
+export async function h() {
+    const mod3 = await import ("./index.js");
+    const mod4 = await import ("./subfolder/index.js");
+    f();
+}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts
new file mode 100644
index 0000000000..872cad71c9
--- /dev/null
+++ b/tests/cases/conformance/node/allowJs/nodeModulesAllowJsTopLevelAwait.ts
@@ -0,0 +1,25 @@
+// @module: node12,nodenext
+// @declaration: true
+// @allowJs: true
+// @checkJs: true
+// @outDir: out
+// @filename: subfolder/index.js
+// cjs format file
+const x = await 1;
+export {x};
+for await (const y of []) {}
+// @filename: index.js
+// esm format file
+const x = await 1;
+export {x};
+for await (const y of []) {}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts b/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts
new file mode 100644
index 0000000000..656465829e
--- /dev/null
+++ b/tests/cases/conformance/node/legacyNodeModulesExportsSpecifierGenerationConditions.ts
@@ -0,0 +1,33 @@
+// @module: commonjs
+// @lib: es2020
+// @declaration: true
+// @filename: index.ts
+export const a = async () => (await import("inner")).x();
+// @filename: node_modules/inner/index.d.ts
+export { x } from "./other.js";
+// @filename: node_modules/inner/other.d.ts
+import { Thing } from "./private.js"
+export const x: () => Thing;
+// @filename: node_modules/inner/private.d.ts
+export interface Thing {} // not exported in export map, inaccessible under new module modes
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "type": "module",
+    "exports": {
+        ".": {
+            "default": "./index.js"
+        },
+        "./other": {
+            "default": "./other.js"
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModules1.ts b/tests/cases/conformance/node/nodeModules1.ts
new file mode 100644
index 0000000000..698a6efec1
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModules1.ts
@@ -0,0 +1,321 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder/index.cts
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder/index.mts
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.ts
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.cts
+// cjs format file
+const x = 1;
+export {x};
+// @filename: subfolder2/index.mts
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.ts
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.mts
+// esm format file
+const x = 1;
+export {x};
+// @filename: subfolder2/another/index.cts
+// cjs format file
+const x = 1;
+export {x};
+// @filename: index.mts
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones should all fail - esm format files have no index resolution or extension resolution
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+
+// esm format file
+const x = 1;
+export {x};
+// @filename: index.cts
+// ESM-format imports below should issue errors
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones should _mostly_ work - cjs format files have index resolution and extension resolution (except for those which resolve to an esm format file)
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+// cjs format file
+const x = 1;
+export {x};
+// @filename: index.ts
+import * as m1 from "./index.js";
+import * as m2 from "./index.mjs";
+import * as m3 from "./index.cjs";
+import * as m4 from "./subfolder/index.js";
+import * as m5 from "./subfolder/index.mjs";
+import * as m6 from "./subfolder/index.cjs";
+import * as m7 from "./subfolder2/index.js";
+import * as m8 from "./subfolder2/index.mjs";
+import * as m9 from "./subfolder2/index.cjs";
+import * as m10 from "./subfolder2/another/index.js";
+import * as m11 from "./subfolder2/another/index.mjs";
+import * as m12 from "./subfolder2/another/index.cjs";
+// The next ones shouldn't all work - esm format files have no index resolution or extension resolution
+import * as m13 from "./";
+import * as m14 from "./index";
+import * as m15 from "./subfolder";
+import * as m16 from "./subfolder/";
+import * as m17 from "./subfolder/index";
+import * as m18 from "./subfolder2";
+import * as m19 from "./subfolder2/";
+import * as m20 from "./subfolder2/index";
+import * as m21 from "./subfolder2/another";
+import * as m22 from "./subfolder2/another/";
+import * as m23 from "./subfolder2/another/index";
+void m1;
+void m2;
+void m3;
+void m4;
+void m5;
+void m6;
+void m7;
+void m8;
+void m9;
+void m10;
+void m11;
+void m12;
+void m13;
+void m14;
+void m15;
+void m16;
+void m17;
+void m18;
+void m19;
+void m20;
+void m21;
+void m22;
+void m23;
+
+// These should _mostly_ work - `import = require` always desugars to require calls, which do have extension and index resolution (but can't load anything that resolves to esm!)
+import m24 = require("./");
+import m25 = require("./index");
+import m26 = require("./subfolder");
+import m27 = require("./subfolder/");
+import m28 = require("./subfolder/index");
+import m29 = require("./subfolder2");
+import m30 = require("./subfolder2/");
+import m31 = require("./subfolder2/index");
+import m32 = require("./subfolder2/another");
+import m33 = require("./subfolder2/another/");
+import m34 = require("./subfolder2/another/index");
+void m24;
+void m25;
+void m26;
+void m27;
+void m28;
+void m29;
+void m30;
+void m31;
+void m32;
+void m33;
+void m34;
+
+// These shouldn't work - dynamic `import()` always uses the esm resolver, which does not have extension resolution
+const _m35 = import("./");
+const _m36 = import("./index");
+const _m37 = import("./subfolder");
+const _m38 = import("./subfolder/");
+const _m39 = import("./subfolder/index");
+const _m40 = import("./subfolder2");
+const _m41 = import("./subfolder2/");
+const _m42 = import("./subfolder2/index");
+const _m43 = import("./subfolder2/another");
+const _m44 = import("./subfolder2/another/");
+const _m45 = import("./subfolder2/another/index");
+// esm format file
+const x = 1;
+export {x};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: subfolder2/package.json
+{
+}
+// @filename: subfolder2/another/package.json
+{
+    "type": "module"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts b/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts
new file mode 100644
index 0000000000..06c6320d77
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesCjsFormatFileAlwaysHasDefault.ts
@@ -0,0 +1,19 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+export const a = 1;
+// @filename: index.ts
+// esm format file
+import mod from "./subfolder/index.js";
+mod;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts b/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts
new file mode 100644
index 0000000000..07bf9d9724
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesConditionalPackageExports.ts
@@ -0,0 +1,124 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.mjsSource;
+mjsi.mjsSource;
+typei.mjsSource;
+ts.mjsSource;
+// @filename: index.mts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.mjsSource;
+mjsi.mjsSource;
+typei.mjsSource;
+ts.mjsSource;
+// @filename: index.cts
+// cjs format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/a";
+import * as mjsi from "inner/b";
+import * as typei from "inner";
+import * as ts from "inner/types";
+cjsi.cjsSource;
+mjsi.cjsSource;
+typei.implicitCjsSource;
+ts.cjsSource;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const implicitCjsSource = true;
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const mjsSource = true;
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/a";
+import * as mjs from "inner/b";
+import * as type from "inner";
+import * as ts from "inner/types";
+export { cjs };
+export { mjs };
+export { type };
+export { ts };
+export const cjsSource = true;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./a": {
+            "require": "./index.cjs",
+            "node": "./index.mjs"
+        },
+        "./b": {
+            "import": "./index.mjs",
+            "node": "./index.cjs"
+        },
+        ".": {
+            "import": "./index.mjs",
+            "node": "./index.js"
+        },
+        "./types": {
+            "types": {
+                "import": "./index.d.mts",
+                "require": "./index.d.cts",
+            },
+            "node": {
+                "import": "./index.mjs",
+                "require": "./index.cjs"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts b/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts
new file mode 100644
index 0000000000..3f8bae7ffc
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesDeclarationEmitDynamicImportWithPackageExports.ts
@@ -0,0 +1,71 @@
+// @module: nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+export {};
+// @filename: index.mts
+// esm format file
+export {};
+// @filename: index.cts
+// cjs format file
+export {};
+// @filename: other.ts
+// esm format file
+export const a = await import("package/cjs");
+export const b = await import("package/mjs");
+export const c = await import("package");
+export const f = await import("inner");
+// @filename: other2.ts
+// esm format file
+export const d = await import("inner/cjs");
+export const e = await import("inner/mjs");
+// @filename: other.mts
+// esm format file
+export const a = await import("package/cjs");
+export const b = await import("package/mjs");
+export const c = await import("package");
+export const f = await import("inner");
+// @filename: other2.mts
+// esm format file
+export const d = await import("inner/cjs");
+export const e = await import("inner/mjs");
+// @filename: other.cts
+// cjs format file, no TLA
+export const a = import("package/cjs");
+export const b = import("package/mjs");
+export const c = import("package");
+export const f = import("inner");
+// @filename: other2.cts
+// cjs format file, no TLA
+export const d = import("inner/cjs");
+export const e = import("inner/mjs");
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+export const cjsMain = true;
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+export const esm = true;
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+export const cjsNonmain = true;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts b/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts
new file mode 100644
index 0000000000..2599ff429f
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesDeclarationEmitWithPackageExports.ts
@@ -0,0 +1,93 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+export const a = cjs;
+export const b = mjs;
+export const c = type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+export const d = cjsi;
+export const e = mjsi;
+export const f = typei;
+// @filename: index.mts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+export const a = cjs;
+export const b = mjs;
+export const c = type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+export const d = cjsi;
+export const e = mjsi;
+export const f = typei;
+// @filename: index.cts
+// cjs format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+export const a = cjs;
+export const b = mjs;
+export const c = type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+export const d = cjsi;
+export const e = mjsi;
+export const f = typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+cjs;
+mjs;
+type;
+export const cjsMain = true;
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+cjs;
+mjs;
+type;
+export const esm = true;
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+cjs;
+mjs;
+type;
+export const cjsNonmain = true;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesDynamicImport.ts b/tests/cases/conformance/node/nodeModulesDynamicImport.ts
new file mode 100644
index 0000000000..46b317ca52
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesDynamicImport.ts
@@ -0,0 +1,24 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+export async function main() {
+    const { readFile } = await import("fs");
+}
+// @filename: index.ts
+// esm format file
+export async function main() {
+    const { readFile } = await import("fs");
+}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesExportAssignments.ts b/tests/cases/conformance/node/nodeModulesExportAssignments.ts
new file mode 100644
index 0000000000..7cbcd200d9
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesExportAssignments.ts
@@ -0,0 +1,20 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+const a = {};
+export = a;
+// @filename: index.ts
+// esm format file
+const a = {};
+export = a;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts b/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts
new file mode 100644
index 0000000000..ffc5adf8e0
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesExportsBlocksSpecifierResolution.ts
@@ -0,0 +1,27 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import { Thing } from "inner/other";
+export const a = (await import("inner")).x();
+// @filename: node_modules/inner/index.d.ts
+// esm format file
+export { x } from "./other.js";
+// @filename: node_modules/inner/other.d.ts
+// esm format file
+export interface Thing {}
+export const x: () => Thing;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts
new file mode 100644
index 0000000000..2562c7a4a1
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationConditions.ts
@@ -0,0 +1,34 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import { Thing } from "inner/other.js"; // should fail
+export const a = (await import("inner")).x();
+// @filename: node_modules/inner/index.d.ts
+// esm format file
+export { x } from "./other.js";
+// @filename: node_modules/inner/other.d.ts
+// esm format file
+export interface Thing {}
+export const x: () => Thing;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "type": "module",
+    "exports": {
+        ".": {
+            "default": "./index.js"
+        },
+        "./other": {
+            "default": "./other.js"
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts
new file mode 100644
index 0000000000..2eb8ac58e6
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationDirectory.ts
@@ -0,0 +1,29 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import { Thing } from "inner/other";
+export const a = (await import("inner/index.js")).x();
+// @filename: node_modules/inner/index.d.ts
+// esm format file
+export { x } from "./other.js";
+// @filename: node_modules/inner/other.d.ts
+// esm format file
+export interface Thing {}
+export const x: () => Thing;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./": "./"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts
new file mode 100644
index 0000000000..97812da5b5
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesExportsSpecifierGenerationPattern.ts
@@ -0,0 +1,29 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import { Thing } from "inner/other";
+export const a = (await import("inner/index.js")).x();
+// @filename: node_modules/inner/index.d.ts
+// esm format file
+export { x } from "./other.js";
+// @filename: node_modules/inner/other.d.ts
+// esm format file
+export interface Thing {}
+export const x: () => Thing;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./*.js": "./*.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts b/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts
new file mode 100644
index 0000000000..d441627d7d
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesForbidenSyntax.ts
@@ -0,0 +1,67 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder/index.cts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder/index.mts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/index.ts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/index.cts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/index.mts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/another/index.ts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/another/index.mts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: subfolder2/another/index.cts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: index.mts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: index.cts
+// cjs format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: index.ts
+// esm format file
+const x = <T>() => <T><any>(void 0);
+export {x};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: subfolder2/package.json
+{
+}
+// @filename: subfolder2/another/package.json
+{
+    "type": "module"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts b/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts
new file mode 100644
index 0000000000..e9a9b9d9ed
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesGeneratedNameCollisions.ts
@@ -0,0 +1,26 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+function require() {}
+const exports = {};
+class Object {}
+export const __esModule = false;
+export {require, exports, Object};
+// @filename: index.ts
+// esm format file
+function require() {}
+const exports = {};
+class Object {}
+export const __esModule = false;
+export {require, exports, Object};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportAssertions.ts b/tests/cases/conformance/node/nodeModulesImportAssertions.ts
new file mode 100644
index 0000000000..0fe1ccdf82
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportAssertions.ts
@@ -0,0 +1,13 @@
+// @module: node12,nodenext
+// @resolveJsonModule: true
+// @filename: index.ts
+import json from "./package.json" assert { type: "json" };
+// @filename: otherc.cts
+import json from "./package.json" assert { type: "json" }; // should error, cjs mode imports don't support assertions
+const json2 = import("./package.json", { assert: { type: "json" } }); // should be fine
+// @filename: package.json
+{
+    "name": "pkg",
+    "private": true,
+    "type": "module"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportAssignments.ts b/tests/cases/conformance/node/nodeModulesImportAssignments.ts
new file mode 100644
index 0000000000..6c22fe83e0
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportAssignments.ts
@@ -0,0 +1,31 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: index.ts
+// esm format file
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: file.ts
+// esm format file
+const __require = null;
+const _createRequire = null;
+import fs = require("fs");
+fs.readFile;
+export import fs2 = require("fs");
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts
new file mode 100644
index 0000000000..103b583712
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions.ts
@@ -0,0 +1,31 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @filename: subfolder/index.ts
+// cjs format file
+import {default as _fs} from "fs";
+_fs.readFile;
+import * as fs from "fs";
+fs.readFile;
+// @filename: index.ts
+// esm format file
+import {default as _fs} from "fs";
+_fs.readFile;
+import * as fs from "fs";
+fs.readFile;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts
new file mode 100644
index 0000000000..7f90947a5f
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions2.ts
@@ -0,0 +1,27 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @filename: subfolder/index.ts
+// cjs format file
+export * from "fs";
+export * as fs from "fs";
+// @filename: index.ts
+// esm format file
+export * from "fs";
+export * as fs from "fs";
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts
new file mode 100644
index 0000000000..5f6984ad1f
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportHelpersCollisions3.ts
@@ -0,0 +1,25 @@
+// @module: node12,nodenext
+// @declaration: true
+// @importHelpers: true
+// @filename: subfolder/index.ts
+// cjs format file
+export {default} from "fs";
+// @filename: index.ts
+// esm format file
+export {default} from "fs";
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
+// @filename: types.d.ts
+declare module "fs";
+declare module "tslib" {
+    export {};
+    // intentionally missing all helpers
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportMeta.ts b/tests/cases/conformance/node/nodeModulesImportMeta.ts
new file mode 100644
index 0000000000..d684c7b5cb
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportMeta.ts
@@ -0,0 +1,20 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+const x = import.meta.url;
+export {x};
+// @filename: index.ts
+// esm format file
+const x = import.meta.url;
+export {x};
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts b/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts
new file mode 100644
index 0000000000..2a407b2bc6
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportResolutionIntoExport.ts
@@ -0,0 +1,24 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: index.mts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: index.cts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.cjs",
+    "imports": {
+        "#type": "package"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts b/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts
new file mode 100644
index 0000000000..c0482c86ec
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesImportResolutionNoCycle.ts
@@ -0,0 +1,24 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: index.mts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: index.cts
+// esm format file
+import * as type from "#type";
+type;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "package",
+    "imports": {
+        "#type": "package"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesPackageExports.ts b/tests/cases/conformance/node/nodeModulesPackageExports.ts
new file mode 100644
index 0000000000..897d01b07d
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesPackageExports.ts
@@ -0,0 +1,90 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mts
+// esm format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cts
+// cjs format file
+import * as cjs from "package/cjs";
+import * as mjs from "package/mjs";
+import * as type from "package";
+cjs;
+mjs;
+type;
+import * as cjsi from "inner/cjs";
+import * as mjsi from "inner/mjs";
+import * as typei from "inner";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs";
+import * as mjs from "inner/mjs";
+import * as type from "inner";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs": "./index.cjs",
+        "./mjs": "./index.mjs",
+        ".": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesPackageImports.ts b/tests/cases/conformance/node/nodeModulesPackageImports.ts
new file mode 100644
index 0000000000..cccf930098
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesPackageImports.ts
@@ -0,0 +1,38 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: index.mts
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: index.cts
+// esm format file
+import * as cjs from "#cjs";
+import * as mjs from "#mjs";
+import * as type from "#type";
+cjs;
+mjs;
+type;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js",
+    "imports": {
+        "#cjs": "./index.cjs",
+        "#mjs": "./index.mjs",
+        "#type": "./index.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts b/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts
new file mode 100644
index 0000000000..e22e497a94
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesPackagePatternExports.ts
@@ -0,0 +1,67 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mts
+// esm format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cts
+// cjs format file
+import * as cjsi from "inner/cjs/index";
+import * as mjsi from "inner/mjs/index";
+import * as typei from "inner/js/index";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs/index";
+import * as mjs from "inner/mjs/index";
+import * as type from "inner/js/index";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs/*": "./*.cjs",
+        "./mjs/*": "./*.mjs",
+        "./js/*": "./*.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts b/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts
new file mode 100644
index 0000000000..3abe36e0d6
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesPackagePatternExportsTrailers.ts
@@ -0,0 +1,67 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: index.mts
+// esm format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: index.cts
+// cjs format file
+import * as cjsi from "inner/cjs/index.cjs";
+import * as mjsi from "inner/mjs/index.mjs";
+import * as typei from "inner/js/index.js";
+cjsi;
+mjsi;
+typei;
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+import * as cjs from "inner/cjs/index.cjs";
+import * as mjs from "inner/mjs/index.mjs";
+import * as type from "inner/js/index.js";
+export { cjs };
+export { mjs };
+export { type };
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        "./cjs/*.cjs": "./*.cjs",
+        "./mjs/*.mjs": "./*.mjs",
+        "./js/*.js": "./*.js"
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts b/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts
new file mode 100644
index 0000000000..c298685c22
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesResolveJsonModule.ts
@@ -0,0 +1,29 @@
+// @module: node12,nodenext
+// @resolveJsonModule: true
+// @outDir: ./out
+// @declaration: true
+// @filename: index.ts
+import pkg from "./package.json"
+export const name = pkg.name;
+import * as ns from "./package.json";
+export const thing = ns;
+export const name2 = ns.default.name;
+// @filename: index.cts
+import pkg from "./package.json"
+export const name = pkg.name;
+import * as ns from "./package.json";
+export const thing = ns;
+export const name2 = ns.default.name;
+// @filename: index.mts
+import pkg from "./package.json"
+export const name = pkg.name;
+import * as ns from "./package.json";
+export const thing = ns;
+export const name2 = ns.default.name;
+// @filename: package.json
+{
+    "name": "pkg",
+    "version": "0.0.1",
+    "type": "module",
+    "default": "misedirection"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts b/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts
new file mode 100644
index 0000000000..78aa93ee17
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesSynchronousCallErrors.ts
@@ -0,0 +1,34 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+import {h} from "../index.js";
+import mod = require("../index.js");
+import {f as _f} from "./index.js";
+import mod2 = require("./index.js");
+export async function f() {
+    const mod3 = await import ("../index.js");
+    const mod4 = await import ("./index.js");
+    h();
+}
+// @filename: index.ts
+// esm format file
+import {h as _h} from "./index.js";
+import mod = require("./index.js");
+import {f} from "./subfolder/index.js";
+import mod2 = require("./subfolder/index.js");
+export async function h() {
+    const mod3 = await import ("./index.js");
+    const mod4 = await import ("./subfolder/index.js");
+    f();
+}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts b/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts
new file mode 100644
index 0000000000..2fbd5d3b0c
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesTopLevelAwait.ts
@@ -0,0 +1,22 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: subfolder/index.ts
+// cjs format file
+const x = await 1;
+export {x};
+for await (const y of []) {}
+// @filename: index.ts
+// esm format file
+const x = await 1;
+export {x};
+for await (const y of []) {}
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module"
+}
+// @filename: subfolder/package.json
+{
+    "type": "commonjs"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts b/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts
new file mode 100644
index 0000000000..52cda091b3
--- /dev/null
+++ b/tests/cases/conformance/node/nodeModulesTypesVersionPackageExports.ts
@@ -0,0 +1,53 @@
+// @module: node12,nodenext
+// @declaration: true
+// @outDir: out
+// @filename: index.ts
+// esm format file
+import * as mod from "inner";
+mod.correctVersionApplied;
+
+// @filename: index.mts
+// esm format file
+import * as mod from "inner";
+mod.correctVersionApplied;
+
+// @filename: index.cts
+// cjs format file
+import * as mod from "inner";
+mod.correctVersionApplied;
+
+// @filename: node_modules/inner/index.d.ts
+// cjs format file
+export const noConditionsApplied = true;
+// @filename: node_modules/inner/index.d.mts
+// esm format file
+export const importConditionApplied = true;
+// @filename: node_modules/inner/index.d.cts
+// cjs format file
+export const wrongConditionApplied = true;
+// @filename: node_modules/inner/old-types.d.ts
+export const noVersionApplied = true;
+// @filename: node_modules/inner/new-types.d.ts
+export const correctVersionApplied = true;
+// @filename: node_modules/inner/future-types.d.ts
+export const futureVersionApplied = true;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+}
+// @filename: node_modules/inner/package.json
+{
+    "name": "inner",
+    "private": true,
+    "exports": {
+        ".": {
+            "types@>=10000": "./future-types.d.ts",
+            "types@>=1": "./new-types.d.ts",
+            "types": "./old-types.d.ts",
+            "import": "./index.mjs",
+            "node": "./index.js"
+        },
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodePackageSelfName.ts b/tests/cases/conformance/node/nodePackageSelfName.ts
new file mode 100644
index 0000000000..099d9c424e
--- /dev/null
+++ b/tests/cases/conformance/node/nodePackageSelfName.ts
@@ -0,0 +1,21 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import * as self from "package";
+self;
+// @filename: index.mts
+// esm format file
+import * as self from "package";
+self;
+// @filename: index.cts
+// esm format file
+import * as self from "package";
+self;
+// @filename: package.json
+{
+    "name": "package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/node/nodePackageSelfNameScoped.ts b/tests/cases/conformance/node/nodePackageSelfNameScoped.ts
new file mode 100644
index 0000000000..f4ef1e3798
--- /dev/null
+++ b/tests/cases/conformance/node/nodePackageSelfNameScoped.ts
@@ -0,0 +1,21 @@
+// @module: node12,nodenext
+// @declaration: true
+// @filename: index.ts
+// esm format file
+import * as self from "@scope/package";
+self;
+// @filename: index.mts
+// esm format file
+import * as self from "@scope/package";
+self;
+// @filename: index.cts
+// cjs format file
+import * as self from "@scope/package";
+self;
+// @filename: package.json
+{
+    "name": "@scope/package",
+    "private": true,
+    "type": "module",
+    "exports": "./index.js"
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override10.ts b/tests/cases/conformance/override/override10.ts
index 3a8eca1632..31b904811c 100644
--- a/tests/cases/conformance/override/override10.ts
+++ b/tests/cases/conformance/override/override10.ts
@@ -9,4 +9,5 @@ abstract class Base {
 abstract class Sub extends Base {
     abstract override foo(): number;
     bar() { }
-}
\ No newline at end of file
+}
+let aa =new Sub();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override12.ts b/tests/cases/conformance/override/override12.ts
index 304caf1627..084c248b37 100644
--- a/tests/cases/conformance/override/override12.ts
+++ b/tests/cases/conformance/override/override12.ts
@@ -24,3 +24,4 @@ class B extends A {
 
     override m3(): void {}
 }
+let qq13 = new B();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override15.ts b/tests/cases/conformance/override/override15.ts
new file mode 100644
index 0000000000..882cc7eb97
--- /dev/null
+++ b/tests/cases/conformance/override/override15.ts
@@ -0,0 +1,9 @@
+// @noImplicitOverride: true
+
+class A {
+    doSomething() {}
+}
+
+class B extends A {
+    override doSomethang() {}
+}
diff --git a/tests/cases/conformance/override/override16.ts b/tests/cases/conformance/override/override16.ts
index 4468edfdc4..b869c89311 100644
--- a/tests/cases/conformance/override/override16.ts
+++ b/tests/cases/conformance/override/override16.ts
@@ -8,3 +8,4 @@ class A {
 class B extends A {
     override foo = "string";
 }
+let qq12 = new B();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override17.ts b/tests/cases/conformance/override/override17.ts
index edabe9816d..a5f92ef955 100644
--- a/tests/cases/conformance/override/override17.ts
+++ b/tests/cases/conformance/override/override17.ts
@@ -25,3 +25,4 @@ class B extends A {
 
     override m3(): void {}
 }
+let qq11 = new B();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override18.ts b/tests/cases/conformance/override/override18.ts
index 2527449e74..6d4d132193 100644
--- a/tests/cases/conformance/override/override18.ts
+++ b/tests/cases/conformance/override/override18.ts
@@ -9,3 +9,4 @@ class A {
 class B extends A {
     override foo = "string";
 }
+let qq7 = new B();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override19.ts b/tests/cases/conformance/override/override19.ts
new file mode 100644
index 0000000000..63e5cd9994
--- /dev/null
+++ b/tests/cases/conformance/override/override19.ts
@@ -0,0 +1,20 @@
+// @target: esnext
+// @noImplicitOverride: true
+
+type Foo = abstract new(...args: any) => any;
+declare function CreateMixin<C extends Foo, T extends Foo>(Context: C, Base: T): T & {
+   new (...args: any[]): { context: InstanceType<C> }
+}
+class Context {}
+
+class A {
+    doSomething() {}
+}
+
+class B extends CreateMixin(Context, A) {
+   override foo() {} // Remove override
+}
+
+class C extends CreateMixin(Context, A) {
+    override doSomethang() {} // Suggestion 'doSomething'
+}
diff --git a/tests/cases/conformance/override/override20.ts b/tests/cases/conformance/override/override20.ts
new file mode 100644
index 0000000000..9835cd9135
--- /dev/null
+++ b/tests/cases/conformance/override/override20.ts
@@ -0,0 +1,34 @@
+// @target: esnext
+// @noImplicitOverride: true
+
+const Foo: C1 & C2 =
+    class {
+        m1() { }
+        m2() { }
+    }
+
+interface I1 {
+    m1(): void;
+}
+
+interface I2 {
+    m1(): void;
+    m2(): void;
+}
+
+interface C1 {
+    new(...args: any[]): I1;
+}
+
+interface C2 {
+    new(...args: any[]): I2;
+}
+
+export class Bar extends Foo {
+    m1() {
+        super.m1();
+    }
+    m2() {
+        super.m2();
+    }
+}
diff --git a/tests/cases/conformance/override/override_js1.ts b/tests/cases/conformance/override/override_js1.ts
index 75df72695e..d327d1dbcf 100644
--- a/tests/cases/conformance/override/override_js1.ts
+++ b/tests/cases/conformance/override/override_js1.ts
@@ -22,4 +22,6 @@ class C {
     fooo (v) {}
     /** @override */
     bar(v) {}
-}
\ No newline at end of file
+}
+let qq8 = new D();
+let qq9 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/override/override_js4.ts b/tests/cases/conformance/override/override_js4.ts
new file mode 100644
index 0000000000..f5a7f1b6c4
--- /dev/null
+++ b/tests/cases/conformance/override/override_js4.ts
@@ -0,0 +1,14 @@
+// @noImplicitOverride: true
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+
+// @Filename: a.js
+class A {
+    doSomething() {}
+}
+
+class B extends A {
+    /** @override  */
+    doSomethang() {}
+}
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts
index b345892ec2..39a09037ca 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration16.ts
@@ -1,4 +1,5 @@
 class C {
    foo();
    foo() { }
-}
\ No newline at end of file
+}
+let q19 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts
index a709f7d7bc..08f7560759 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration17.ts
@@ -5,3 +5,4 @@ declare class Enumerator {
     public item(): any;
     constructor (o: any);
 }
+let q22 = new Enumerator();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts
index 65d9bd0a57..5ed5520812 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration19.ts
@@ -1,4 +1,5 @@
 class C {
     foo();
     "foo"() { }
-}
\ No newline at end of file
+}
+let q18 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts
index 6c8540e833..a2025ab46f 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration20.ts
@@ -1,4 +1,5 @@
 class C {
     0();
     "0"() { }
-}
\ No newline at end of file
+}
+let q23 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts
index 5720f935a6..7ff1604575 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration23.ts
@@ -1,2 +1,3 @@
 class C\u0032 {
-}
\ No newline at end of file
+}
+let q17 = new C\u0032();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts
index 4d5395733a..fbefb55710 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclaration26.ts
@@ -1,4 +1,5 @@
 class C {
    var
    public
-}
\ No newline at end of file
+}
+let q20 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts
index b99c0c6f48..bae31847e0 100644
--- a/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ClassDeclarations/parserClassDeclarationIndexSignature1.ts
@@ -1,3 +1,4 @@
 class C {
     [index:number]:number
-}
\ No newline at end of file
+}
+let q21 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts
index b845118647..024f143cad 100644
--- a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration1.ts
@@ -1,3 +1,4 @@
 class C {
  public constructor() { }
-}
\ No newline at end of file
+}
+let q24 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts
index f445d70c88..7305a4098d 100644
--- a/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ConstructorDeclarations/parserConstructorDeclaration5.ts
@@ -1,3 +1,4 @@
 class C {
   private constructor() { }
-}
\ No newline at end of file
+}
+let q25 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts
index 5ebd8f13ae..bd99e7cfb1 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic11.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public() {}
 }
+let q12 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts
index 23fb870f86..474e281b08 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic14.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public<T>() {}
 }
+let q14 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts
index 30045cf9f0..dfc01652e7 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic2.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public;
 }
+let q11 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts
index c2f462b71a..f38fc7ee97 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic3.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public = 1;
 }
+let q9 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts
index fe0ed44cf0..41f075c30c 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic4.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public: number;
 }
+let q13 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts
index 49db39132c..ea9593bb53 100644
--- a/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts
+++ b/tests/cases/conformance/parser/ecmascript5/ErrorRecovery/AccessibilityAfterStatic/parserAccessibilityAfterStatic5.ts
@@ -2,3 +2,4 @@ class Outer
 {
 static public
 }
+let q0 = new Outer();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts
index 237910839d..a814947c9e 100644
--- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass1.ts
@@ -1,2 +1,3 @@
 class C<T> {
-}
\ No newline at end of file
+}
+let q38 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts
index 949f220fbd..f4f517c52c 100644
--- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericClass2.ts
@@ -1,2 +1,3 @@
 class C<K,V> {
-}
\ No newline at end of file
+}
+let q40 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts
index 585fa7dbe1..78a9ffb4db 100644
--- a/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Generics/parserGenericConstraint1.ts
@@ -1,2 +1,3 @@
 class C<T extends number> {
-}
\ No newline at end of file
+}
+let q39 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts
index 56ba0579b0..7de740ebab 100644
--- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration1.ts
@@ -1,3 +1,4 @@
 class C {
    [a: string]: number
-}
\ No newline at end of file
+}
+let q27 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts
index 34108a6e71..f0224e9379 100644
--- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts
+++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration2.ts
@@ -1,4 +1,5 @@
 class C {
    [a: string]: number
    public v: number
-}
\ No newline at end of file
+}
+let q29 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts
index f2180413ca..25ea575259 100644
--- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts
+++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration3.ts
@@ -1,4 +1,5 @@
 class C {
    [a: string]: number;
    public v: number
-}
\ No newline at end of file
+}
+let q30 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts
index 498ad89d82..42622da3af 100644
--- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts
+++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration4.ts
@@ -1,3 +1,4 @@
 class C {
    [a: string]: number; public v: number
-}
\ No newline at end of file
+}
+let q28 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts
index af180f585f..b89c199246 100644
--- a/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts
+++ b/tests/cases/conformance/parser/ecmascript5/IndexMemberDeclarations/parserIndexMemberDeclaration6.ts
@@ -1,3 +1,4 @@
 class C {
    static [x: string]: string;
-}
\ No newline at end of file
+}
+let q26 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts b/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts
index 98c4f9a75b..62e5062755 100644
--- a/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts
+++ b/tests/cases/conformance/parser/ecmascript5/MemberVariableDeclarations/parserMemberVariableDeclaration5.ts
@@ -1,3 +1,4 @@
 class C {
   declare Foo;
-}
\ No newline at end of file
+}
+let q8 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts
index 2b07e1ca9a..765e7b650a 100644
--- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected3.ts
@@ -1,3 +1,4 @@
 class C {
   protected constructor() { }
-}
\ No newline at end of file
+}
+let q37 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts
index f0bf235a03..c1d4944d1e 100644
--- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected5.ts
@@ -1,3 +1,4 @@
 class C {
   protected static m() { }
-}
\ No newline at end of file
+}
+let q34 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts b/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts
index 4e24e28ec1..5ce2aa474a 100644
--- a/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts
+++ b/tests/cases/conformance/parser/ecmascript5/Protected/Protected9.ts
@@ -1,3 +1,4 @@
 class C {
    constructor(protected p) { }
-}
\ No newline at end of file
+}
+let q35 = new C(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts
index bfb48ee0e3..29d488ffbc 100644
--- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts
+++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546.ts
@@ -1,3 +1,4 @@
 export class Logger { 
      public
 }
+let q32 = new Logger();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts
index bfb48ee0e3..18eeed1a6d 100644
--- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts
+++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_1.ts
@@ -1,3 +1,4 @@
 export class Logger { 
      public
 }
+let q31 = new Logger();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts
index ca1a460120..a4609ba88c 100644
--- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts
+++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509546_2.ts
@@ -3,3 +3,4 @@
 export class Logger { 
      public
 }
+let q23 = new Logger();
\ No newline at end of file
diff --git a/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts b/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts
index bb5f00ea71..99802e72b5 100644
--- a/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts
+++ b/tests/cases/conformance/parser/ecmascript5/parserUnicode3.ts
@@ -1,2 +1,3 @@
 class 剩下 {
-}
\ No newline at end of file
+}
+let q5 = new 剩下();
diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts
new file mode 100644
index 0000000000..87f569dbfb
--- /dev/null
+++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement22.ts
@@ -0,0 +1,4 @@
+// @target: esnext
+
+var async;
+for (async of [1, 2]) {}
diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts
new file mode 100644
index 0000000000..5a3601380b
--- /dev/null
+++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement23.ts
@@ -0,0 +1,6 @@
+// @target: esnext
+
+async function foo(x: any) {
+    var async;
+    for await (async of x) {}
+}
diff --git a/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts
new file mode 100644
index 0000000000..3846bd0a91
--- /dev/null
+++ b/tests/cases/conformance/parser/ecmascript6/Iterators/parserForOfStatement24.ts
@@ -0,0 +1,4 @@
+// @target: esnext
+
+var async;
+for ((async) of [1, 2]);
diff --git a/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts b/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts
index 800bd368db..f713920ad5 100644
--- a/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts
+++ b/tests/cases/conformance/salsa/inferringClassMembersFromAssignments3.ts
@@ -14,3 +14,4 @@ class Derived extends Base {
         this.p = 1
     }
 }
+let w1 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/salsa/plainJSBinderErrors.ts b/tests/cases/conformance/salsa/plainJSBinderErrors.ts
new file mode 100644
index 0000000000..d2019e3f78
--- /dev/null
+++ b/tests/cases/conformance/salsa/plainJSBinderErrors.ts
@@ -0,0 +1,44 @@
+// @outdir: out/
+// @target: esnext
+// @allowJS: true
+// @filename: plainJSBinderErrors.js
+export default 12
+export default 13
+const await = 1
+const yield = 2
+async function f() {
+    const await = 3
+}
+function* g() {
+    const yield = 4
+}
+class C {
+    #constructor = 5
+    deleted() {
+        function container(f) {
+            delete f
+        }
+        var g = 6
+        delete g
+        delete container
+    }
+    evalArguments() {
+        const eval = 7
+        const arguments = 8
+    }
+    withOctal() {
+        const redundant = 010
+        with (redundant) {
+            return toFixed()
+        }
+    }
+    label() {
+        for(;;) {
+            label: var x = 1
+            break label
+        }
+        return x
+    }
+}
+const eval = 9
+const arguments = 10
diff --git a/tests/cases/conformance/salsa/plainJSRedeclare.ts b/tests/cases/conformance/salsa/plainJSRedeclare.ts
new file mode 100644
index 0000000000..be6831d0cd
--- /dev/null
+++ b/tests/cases/conformance/salsa/plainJSRedeclare.ts
@@ -0,0 +1,6 @@
+// @outdir: out/
+// @allowJS: true
+// @filename: plainJSRedeclare.js
+const orbitol = 1
+var orbitol = 1 + false
+orbitol.toExponential()
diff --git a/tests/cases/conformance/salsa/plainJSRedeclare2.ts b/tests/cases/conformance/salsa/plainJSRedeclare2.ts
new file mode 100644
index 0000000000..7409b6c8fe
--- /dev/null
+++ b/tests/cases/conformance/salsa/plainJSRedeclare2.ts
@@ -0,0 +1,7 @@
+// @outdir: out/
+// @allowJS: true
+// @checkJS: true
+// @filename: plainJSRedeclare.js
+const orbitol = 1
+var orbitol = 1 + false
+orbitol.toExponential()
diff --git a/tests/cases/conformance/salsa/plainJSRedeclare3.ts b/tests/cases/conformance/salsa/plainJSRedeclare3.ts
new file mode 100644
index 0000000000..1327fcfc17
--- /dev/null
+++ b/tests/cases/conformance/salsa/plainJSRedeclare3.ts
@@ -0,0 +1,7 @@
+// @outdir: out/
+// @allowJS: true
+// @checkJS: false
+// @filename: plainJSRedeclare.js
+const orbitol = 1
+var orbitol = 1 + false
+orbitol.toExponential()
diff --git a/tests/cases/conformance/salsa/plainJSReservedStrict.ts b/tests/cases/conformance/salsa/plainJSReservedStrict.ts
new file mode 100644
index 0000000000..fbd654927d
--- /dev/null
+++ b/tests/cases/conformance/salsa/plainJSReservedStrict.ts
@@ -0,0 +1,7 @@
+// @outdir: out/
+// @target: esnext
+// @allowJS: true
+// @filename: plainJSReservedStrict.js
+"use strict"
+const eval = 1
+const arguments = 2
diff --git a/tests/cases/conformance/salsa/spellingUncheckedJS.ts b/tests/cases/conformance/salsa/spellingUncheckedJS.ts
new file mode 100644
index 0000000000..d5a1e8ac56
--- /dev/null
+++ b/tests/cases/conformance/salsa/spellingUncheckedJS.ts
@@ -0,0 +1,51 @@
+// @noEmit: true
+// @allowJs: true
+// @filename: spellingUncheckedJS.js
+export var inModule = 1
+inmodule.toFixed()
+
+function f() {
+    var locals = 2 + true
+    locale.toFixed()
+    // @ts-expect-error
+    localf.toExponential()
+    // @ts-expect-error
+    "this is fine"
+}
+class Classe {
+    non = 'oui'
+    methode() {
+        // no error on 'this' references
+        return this.none
+    }
+}
+class Derivee extends Classe {
+    methode() {
+        // no error on 'super' references
+        return super.none
+    }
+}
+
+
+var object = {
+    spaaace: 3
+}
+object.spaaaace // error on read
+object.spaace = 12 // error on write
+object.fresh = 12 // OK
+other.puuuce // OK, from another file
+new Date().getGMTDate() // OK, from another file
+
+// No suggestions for globals from other files
+const atoc = setIntegral(() => console.log('ok'), 500)
+AudioBuffin // etc
+Jimmy
+Jon
+
+// @filename: other.js
+var Jimmy = 1
+var John = 2
+Jon // error, it's from the same file
+var other = {
+    puuce: 4
+}
diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer2.ts b/tests/cases/conformance/salsa/typeFromJSInitializer2.ts
new file mode 100644
index 0000000000..c1d5857624
--- /dev/null
+++ b/tests/cases/conformance/salsa/typeFromJSInitializer2.ts
@@ -0,0 +1,18 @@
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+// @strictNullChecks: true
+// @noImplicitAny: true
+// @Filename: a.js
+
+/** @type {() => undefined} */
+function f1() {
+    return undefined;
+}
+const a = f1()
+
+/** @type {() => null} */
+function f2() {
+    return null;
+}
+const b = f2()
diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer3.ts b/tests/cases/conformance/salsa/typeFromJSInitializer3.ts
new file mode 100644
index 0000000000..c5100df43d
--- /dev/null
+++ b/tests/cases/conformance/salsa/typeFromJSInitializer3.ts
@@ -0,0 +1,18 @@
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+// @strictNullChecks: false
+// @noImplicitAny: true
+// @Filename: a.js
+
+/** @type {() => undefined} */
+function f1() {
+    return undefined;
+}
+const a = f1()
+
+/** @type {() => null} */
+function f2() {
+    return null;
+}
+const b = f2()
diff --git a/tests/cases/conformance/salsa/typeFromJSInitializer4.ts b/tests/cases/conformance/salsa/typeFromJSInitializer4.ts
new file mode 100644
index 0000000000..02d16c45a2
--- /dev/null
+++ b/tests/cases/conformance/salsa/typeFromJSInitializer4.ts
@@ -0,0 +1,29 @@
+// @allowJs: true
+// @checkJs: true
+// @noEmit: true
+// @strictNullChecks: false
+// @noImplicitAny: true
+// @Filename: a.js
+
+/** @type {number | undefined} */
+var n;
+
+// should get any on parameter initialisers
+function f(a = null, b = n, l = []) {
+    // a should be any
+    a = undefined
+    a = null
+    a = 1
+    a = true
+    a = {}
+    a = 'ok'
+
+    // b should be number | undefined, not any
+    b = 1
+    b = undefined
+    b = 'error'
+
+    // l should be any[]
+    l.push(1)
+    l.push('ok')
+}
diff --git a/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts b/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts
index 18923e0a5a..1dafa91c28 100644
--- a/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts
+++ b/tests/cases/conformance/salsa/typeFromPropertyAssignment23.ts
@@ -35,3 +35,6 @@ class NormalModule extends Module {
         return 0
     }
 }
+let cc = new C();
+let dd = new D();
+let mo = new NormalModule();
\ No newline at end of file
diff --git a/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts b/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts
new file mode 100644
index 0000000000..ae63dd3136
--- /dev/null
+++ b/tests/cases/conformance/statements/for-inStatements/for-inStatementsAsyncIdentifier.ts
@@ -0,0 +1,4 @@
+// @target: esnext
+
+var async;
+for (async in { a: 1, b: 2 }) {}
diff --git a/tests/cases/conformance/statements/returnStatements/returnStatements.ts b/tests/cases/conformance/statements/returnStatements/returnStatements.ts
index ce764c1f11..945b98944c 100644
--- a/tests/cases/conformance/statements/returnStatements/returnStatements.ts
+++ b/tests/cases/conformance/statements/returnStatements/returnStatements.ts
@@ -21,3 +21,4 @@ function fn10(): I { return { id: 12 }; }
 function fn11(): I { return new C(); }
 function fn12(): C { return new D(); }
 function fn13(): C { return null; }
+let q41 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts b/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts
index c5875327b5..313b2b7169 100644
--- a/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts
+++ b/tests/cases/conformance/statements/throwStatements/throwInEnclosingStatements.ts
@@ -45,3 +45,4 @@ var aa = {
         throw this;
     }
 }
+let q42 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts b/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts
index 9529b5b9a3..7996e18343 100644
--- a/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts
+++ b/tests/cases/conformance/types/any/anyAsGenericFunctionCall.ts
@@ -7,4 +7,6 @@ var b = x<string>('hello');
 
 class C { foo: string; }
 var c = x<C>(x);
-var d = x<any>(x);
\ No newline at end of file
+var d = x<any>(x);
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/any/assignAnyToEveryType.ts b/tests/cases/conformance/types/any/assignAnyToEveryType.ts
index 0af7d94d7b..aba7eb4753 100644
--- a/tests/cases/conformance/types/any/assignAnyToEveryType.ts
+++ b/tests/cases/conformance/types/any/assignAnyToEveryType.ts
@@ -42,4 +42,6 @@ M = x;
 
 function k<T>(a: T) {
     a = x;
-}
\ No newline at end of file
+}
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/any/assignEveryTypeToAny.ts b/tests/cases/conformance/types/any/assignEveryTypeToAny.ts
index 8613550fc5..0f7f258e87 100644
--- a/tests/cases/conformance/types/any/assignEveryTypeToAny.ts
+++ b/tests/cases/conformance/types/any/assignEveryTypeToAny.ts
@@ -52,4 +52,6 @@ x = { f<T>(x: T) { return x; } }
 
 function j<T>(a: T) {
     x = a;
-}
\ No newline at end of file
+}
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/conditional/variance.ts b/tests/cases/conformance/types/conditional/variance.ts
index 1dd5db5c67..433eab8e01 100644
--- a/tests/cases/conformance/types/conditional/variance.ts
+++ b/tests/cases/conformance/types/conditional/variance.ts
@@ -25,3 +25,5 @@ class Bar<T extends string> {
     Bar.instance.push(this);
   }
 }
+
+let ba = new Bar();
diff --git a/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts b/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts
index 530d506f64..87069a602d 100644
--- a/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts
+++ b/tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceWithTypeParameter.ts
@@ -31,3 +31,6 @@ testRest((t1: D, t2, t3) => {})
 testRest((t1, t2: D, t3) => {})
 testRest((t2: D, ...t3) => {})
 testRest((t2, ...t3: D[]) => {})
+
+
+let d = new D();
diff --git a/tests/cases/conformance/types/import/importTypeAmbient.ts b/tests/cases/conformance/types/import/importTypeAmbient.ts
index b1ba463777..3345c3ac06 100644
--- a/tests/cases/conformance/types/import/importTypeAmbient.ts
+++ b/tests/cases/conformance/types/import/importTypeAmbient.ts
@@ -28,8 +28,8 @@ declare module "foo2" {
         item: Bar.I;
         constructor(input: Baz.J);
     }
+    
 }
-
 let y: import("foo2").Bar.I = { a: "", b: 0 };
 
 class Bar2 {
@@ -40,3 +40,6 @@ class Bar2 {
 let shim: typeof import("foo2") = {
     Bar: Bar2
 };
+
+var a;
+let ba1 = new Bar2(a);
diff --git a/tests/cases/conformance/types/import/importTypeGenericTypes.ts b/tests/cases/conformance/types/import/importTypeGenericTypes.ts
index 5bc3aa7802..cf808fc6e3 100644
--- a/tests/cases/conformance/types/import/importTypeGenericTypes.ts
+++ b/tests/cases/conformance/types/import/importTypeGenericTypes.ts
@@ -29,9 +29,10 @@ class Bar<T> {
     item: Bar.I<T>;
     constructor(input: Baz.J<T>) {}
 }
+let bbb = new Bar(null);
 export { Bar }
 
-// @filename: usage.ts
+// @filename: usage.
 export const x: import("./foo")<{x: number}> = { x: 0, y: 0, data: {x: 12} };
 export let y: import("./foo2").Bar.I<{x: number}> = { a: "", b: 0, data: {x: 12} };
 
@@ -43,3 +44,5 @@ export class Bar2<T> {
 export let shim: typeof import("./foo2") = {
     Bar: Bar2
 };
+
+let ba2 = new Bar2(1);
diff --git a/tests/cases/conformance/types/import/importTypeLocal.ts b/tests/cases/conformance/types/import/importTypeLocal.ts
index 4f29a22285..6fe5ab1c18 100644
--- a/tests/cases/conformance/types/import/importTypeLocal.ts
+++ b/tests/cases/conformance/types/import/importTypeLocal.ts
@@ -26,8 +26,11 @@ class Bar {
     item: Bar.I;
     constructor(input: Baz.J) {}
 }
+let bbb = new Bar(null)
 export { Bar }
 
+
+
 // @filename: usage.ts
 export const x: import("./foo") = { x: 0, y: 0 };
 export let y: import("./foo2").Bar.I = { a: "", b: 0 };
@@ -40,3 +43,5 @@ export class Bar2 {
 export let shim: typeof import("./foo2") = {
     Bar: Bar2
 };
+
+let ba2 = new Bar2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts b/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts
new file mode 100644
index 0000000000..0f67b66bff
--- /dev/null
+++ b/tests/cases/conformance/types/intersection/intersectionOfUnionNarrowing.ts
@@ -0,0 +1,16 @@
+// @strict: true
+
+interface X {
+  a?: { aProp: string };
+  b?: { bProp: string };
+}
+type AorB = { a: object; b: undefined } | { a: undefined; b: object };
+
+declare const q: X & AorB;
+
+if (q.a !== undefined) {
+  q.a.aProp;
+} else {
+  // q.b is previously incorrectly inferred as potentially undefined
+  q.b.bProp;
+}
diff --git a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts
index 56ff157a67..7c7d0b13e0 100644
--- a/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts
+++ b/tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts
@@ -658,3 +658,23 @@ const cf2 = <T extends { [P in K | "cool"]: string; }, K extends keyof T>(t: T,
     const s: string = t[k];
     t.cool;
 };
+
+let shape = new Shape();
+let ta1 = new TaggedShape();
+let it = new Item();
+let op = new Options();
+let com1 = new Component();
+let c11 = new C();
+let c12 = new C1();
+let ba1 = new Base();
+let per = new Person(1);
+let oth = new OtherPerson(1);
+var aa;
+let com2 = new Component1(aa);
+let com3 = new Component2(aa);
+let a11 = new A();
+let b11 = new B();
+let fo = new Form();
+let sam = new SampleClass(1);
+let ano = new AnotherSampleClass(1);
+let unb = new Unbounded();
diff --git a/tests/cases/conformance/types/literal/literalTypes2.ts b/tests/cases/conformance/types/literal/literalTypes2.ts
index 57e7a0bc74..46b1479857 100644
--- a/tests/cases/conformance/types/literal/literalTypes2.ts
+++ b/tests/cases/conformance/types/literal/literalTypes2.ts
@@ -176,3 +176,6 @@ type Bit = 0 | 1;
 
 let aa = makeArray<Bit>(0);
 aa = append(aa, 1);
+
+let c1 = new C1();
+let c2 = new C2();
diff --git a/tests/cases/conformance/types/localTypes/localTypes2.ts b/tests/cases/conformance/types/localTypes/localTypes2.ts
index 79f1402c70..2b81f903ac 100644
--- a/tests/cases/conformance/types/localTypes/localTypes2.ts
+++ b/tests/cases/conformance/types/localTypes/localTypes2.ts
@@ -3,6 +3,7 @@ function f1() {
         class C {
             constructor(public x: number, public y: number) { }
         }
+        let c = new C(1,2);
         return C;
     }
     let C = f();
@@ -17,6 +18,7 @@ function f2() {
             public x = x;
             constructor(public y: number) { }
         }
+        let c = new C(1);
         return C;
     }
     let C = f(10);
@@ -31,6 +33,7 @@ function f3() {
             public x = x;
             public y = y;
         }
+        let c = new C();
         return C;
     }
     let C = f(10, 20);
diff --git a/tests/cases/conformance/types/localTypes/localTypes3.ts b/tests/cases/conformance/types/localTypes/localTypes3.ts
index 5eb3cf2850..7b1e536270 100644
--- a/tests/cases/conformance/types/localTypes/localTypes3.ts
+++ b/tests/cases/conformance/types/localTypes/localTypes3.ts
@@ -3,6 +3,7 @@ function f1() {
         class C<X, Y> {
             constructor(public x: X, public y: Y) { }
         }
+        let c = new C(1,2);
         return C;
     }
     let C = f();
@@ -17,6 +18,7 @@ function f2() {
             public x = x;
             constructor(public y: Y) { }
         }
+        let c = new C(1);
         return C;
     }
     let C = f(10);
@@ -31,6 +33,7 @@ function f3() {
             public x = x;
             public y = y;
         }
+        let c = new C();
         return C;
     }
     let C = f(10, "hello");
diff --git a/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts b/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts
new file mode 100644
index 0000000000..051192159e
--- /dev/null
+++ b/tests/cases/conformance/types/mapped/mappedTypeAsClauseRelationships.ts
@@ -0,0 +1,27 @@
+// From original issue #45212:
+type Methods<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] };
+type H<T> = T[keyof Methods<T>]; // Ok
+
+// `Filter<T>` only filters out some keys of `T`.
+type Filter<T> = { [P in keyof T as T[P] extends Function ? P : never]: T[P] };
+// `Modify<T>` might modify some keys of `T`.
+type Modify<T> = { [P in keyof T as P extends string? `bool${P}`: P]: T[P] };
+
+function fun<T>(val: T) {
+    let x: Filter<T> = val; // Ok
+    let y: Modify<T> = val; // Error
+}
+
+type FilterInclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]+?: T[P] };
+type ModifyInclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]+?: T[P] };
+type FilterExclOpt<T> = { [P in keyof T as T[P] extends Function ? P : never]-?: T[P] };
+type ModifyExclOpt<T> = { [P in keyof T as P extends string? `bool${P}`: never ]-?: T[P] };
+
+function fun2<T>(val: T) {
+    let x: FilterInclOpt<T> = val; // Ok
+    let y: ModifyInclOpt<T> = val; // Ok
+    let z: FilterExclOpt<T> = val; // Error
+    let w: ModifyExclOpt<T> = val; // Error
+}
+
+
diff --git a/tests/cases/conformance/types/mapped/mappedTypeProperties.ts b/tests/cases/conformance/types/mapped/mappedTypeProperties.ts
new file mode 100644
index 0000000000..407e0eaf56
--- /dev/null
+++ b/tests/cases/conformance/types/mapped/mappedTypeProperties.ts
@@ -0,0 +1,42 @@
+// @declaration: true
+export type PlaceType = 'openSky' | 'roofed' | 'garage'
+type Before = {
+    model: 'hour' | 'day';
+    [placeType in PlaceType]: void;
+}
+
+type After = {
+    [placeType in PlaceType]: void;
+    model: 'hour' | 'day'
+}
+
+type AfterQuestion = {
+    [placeType in PlaceType]?: void;
+    model: 'hour' | 'day';
+}
+type AfterMethod = {
+    [placeType in PlaceType]?: void;
+    model(duration: number): 'hour' | 'day';
+}
+
+type AfterImplicit = {
+    [placeType in PlaceType]
+    model: 'hour' | 'day';
+}
+type AfterImplicitQ = {
+    [placeType in PlaceType]?
+    model: 'hour' | 'day'
+}
+
+interface I {
+    [P in PlaceType]: any
+}
+class C {
+    [P in PlaceType]: any
+}
+const D = class {
+    [P in PlaceType]: any
+}
+const E = class {
+    [P in 'a' | 'b']: any
+}
diff --git a/tests/cases/conformance/types/mapped/mappedTypes3.ts b/tests/cases/conformance/types/mapped/mappedTypes3.ts
index bf5a4399b0..6ef1918898 100644
--- a/tests/cases/conformance/types/mapped/mappedTypes3.ts
+++ b/tests/cases/conformance/types/mapped/mappedTypes3.ts
@@ -37,4 +37,6 @@ function f3(bb: BoxifiedBacon) {
     let b = unboxify<Bacon>(bb);  // Explicit type parameter required
     let bool = b.isPerfect;
     let weight = bb.weight;
-}
\ No newline at end of file
+}
+
+let box = new Box();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts b/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts
index b3530b4696..66e25c6091 100644
--- a/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts
+++ b/tests/cases/conformance/types/mapped/mappedTypesAndObjects.ts
@@ -43,3 +43,5 @@ interface E3<T> extends Base {
 class Form<T> {
     private values: {[P in keyof T]?: T[P]} = {}
 }
+
+let f = new Form();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/classWithProtectedProperty.ts b/tests/cases/conformance/types/members/classWithProtectedProperty.ts
index 96bc615c02..a37828eef1 100644
--- a/tests/cases/conformance/types/members/classWithProtectedProperty.ts
+++ b/tests/cases/conformance/types/members/classWithProtectedProperty.ts
@@ -24,4 +24,6 @@ class D extends C {
         var r7: string = C.f();
         var r8: string = C.g();
     }
-}
\ No newline at end of file
+}
+
+let d = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/indexSignatures1.ts b/tests/cases/conformance/types/members/indexSignatures1.ts
new file mode 100644
index 0000000000..f888275683
--- /dev/null
+++ b/tests/cases/conformance/types/members/indexSignatures1.ts
@@ -0,0 +1,325 @@
+// @strict: true
+// @declaration: true
+// @target: esnext
+
+// Symbol index signature checking
+
+const sym = Symbol();
+
+function gg3(x: { [key: string]: string }, y: { [key: symbol]: string }, z: { [sym]: number }) {
+    x = z;
+    y = z;  // Error
+}
+
+// Overlapping index signatures
+
+function gg1(x: { [key: `a${string}`]: string, [key: `${string}a`]: string }, y: { [key: `a${string}a`]: string }) {
+    x = y;
+    y = x;
+}
+
+interface IX { [key: `a${string}`]: string, [key: `${string}a`]: string }
+interface IY { [key: `a${string}a`]: string }
+
+function gg2(x: IX, y: IY) {
+    x = y;  // Error
+    y = x;
+}
+
+// Intersection of multiple applicable index signatures
+
+declare let combo: { [x: `foo-${string}`]: 'a' | 'b' } & { [x: `${string}-bar`]: 'b' | 'c' };
+const x1 = combo['foo-test'];  // 'a' | 'b'
+const x2 = combo['test-bar'];  // 'b' | 'c'
+const x3 = combo['foo-test-bar'];  // 'b' (('a' | 'b') & ('b' | 'c'))
+
+declare var str: string;
+
+const x4 = combo[`foo-${str}`];
+const x5 = combo[`${str}-bar`];
+const x6 = combo[`foo-${str}-bar`];
+
+declare let combo2: { [x: `${string}xxx${string}` & `${string}yyy${string}`]: string };
+
+const x7 = combo2['axxxbyyyc'];
+const x8 = combo2['ayyyxxxbc'];
+const x9 = combo2['axxxbbbyc'];  // Error
+
+// Property access on template pattern index signature
+
+declare let dom: { [x: `data${string}`]: string };
+const y1 = dom['data123'];
+const y2 = dom.data123;
+
+// Excess property checking for template pattern index signature
+
+dom = { data123: 'hello' };
+dom = { date123: 'hello' };  // Error
+
+// Contextual typing by index signature with template literal pattern
+
+type Funcs = {
+    [key: `s${string}`]: (x: string) => void,
+    [key: `n${string}`]: (x: number) => void,
+}
+
+const funcs: Funcs = {
+    sfoo: x => x.length,  // x: string
+    nfoo: x => x * 2,     // n: number
+}
+
+// Duplicate index signature checking
+
+type Duplicates = {
+    [key: string | number]: any;  // Error
+    [key: number | symbol]: any;  // Error
+    [key: symbol | `foo${string}`]: any;  // Error
+    [key: `foo${string}`]: any;  // Error
+}
+
+// Conflicting index signature checking
+
+type Conflicting = {
+    [key: `a${string}`]: 'a';
+    [key: `${string}a`]: 'b';
+    [key: `a${string}a`]: 'c';  // Error
+}
+
+// Invalid index signatures
+
+type Invalid<T extends string> = {
+    [key: 'a' | 'b' | 'c']: string;  // Error
+    [key: T | number]: string;  // Error
+    [key: Error]: string;  // Error
+    [key: T & string]: string;  // Error
+}
+
+// Intersections in index signatures
+
+type Tag1 = { __tag1__: void };
+type Tag2 = { __tag2__: void };
+
+type TaggedString1 = string & Tag1;
+type TaggedString2 = string & Tag2;
+
+declare let s0: string;
+declare let s1: TaggedString1;
+declare let s2: TaggedString2;
+declare let s3: TaggedString1 | TaggedString2;
+declare let s4: TaggedString1 & TaggedString2;
+
+interface I1 { [key: TaggedString1]: string }
+interface I2 { [key: TaggedString2]: string }
+interface I3 { [key: TaggedString1 | TaggedString2]: string }
+interface I4 { [key: TaggedString1 & TaggedString2]: string }
+
+declare let i1: I1;
+declare let i2: I2;
+declare let i3: I3;
+declare let i4: I4;
+
+i1[s0];  // Error
+i1[s1];
+i1[s2];  // Error
+i1[s3];  // Error
+i1[s4];
+
+i2[s0];  // Error
+i2[s1];  // Error
+i2[s2];
+i2[s3];  // Error
+i2[s4];
+
+i3[s0];  // Error
+i3[s1];
+i3[s2];
+i3[s3];
+i3[s4];
+
+i4[s0];  // Error
+i4[s1];  // Error
+i4[s2];  // Error
+i4[s3];  // Error
+i4[s4];
+
+i1 = i2;  // Error
+i1 = i3;
+i1 = i4;  // Error
+
+i2 = i1;  // Error
+i2 = i3;
+i2 = i4;  // Error
+
+i3 = i1;  // Error
+i3 = i2;  // Error
+i3 = i4;  // Error
+
+i4 = i1;
+i4 = i2;
+i4 = i3;
+
+declare let o1: { [key: TaggedString1]: string };
+declare let o2: { [key: TaggedString2]: string };
+declare let o3: { [key: TaggedString1 | TaggedString2]: string };
+declare let o4: { [key: TaggedString1 & TaggedString2]: string };
+
+o1[s0];  // Error
+o1[s1];
+o1[s2];  // Error
+o1[s3];  // Error
+o1[s4];
+
+o2[s0];  // Error
+o2[s1];  // Error
+o2[s2];
+o2[s3];  // Error
+o2[s4];
+
+o3[s0];  // Error
+o3[s1];
+o3[s2];
+o3[s3];
+o3[s4];
+
+o4[s0];  // Error
+o4[s1];  // Error
+o4[s2];  // Error
+o4[s3];  // Error
+o4[s4];
+
+o1 = o2;
+o1 = o3;
+o1 = o4;
+
+o2 = o1;
+o2 = o3;
+o2 = o4;
+
+o3 = o1;
+o3 = o2;
+o3 = o4;
+
+o4 = o1;
+o4 = o2;
+o4 = o3;
+
+// Index signatures inferred from computed property names
+
+const obj10 = {
+    ['x']: 0 as const,
+    ['a' + 'b']: 1 as const,
+};
+
+const obj11 = {
+    [1]: 2 as const,
+    [1 + 2]: 3 as const,
+};
+
+const obj12 = {
+    [sym]: 4 as const,
+    [Symbol()]: 5 as const,
+};
+
+const obj13 = {
+    ['x']: 0 as const,
+    ['a' + 'b']: 1 as const,
+    [1]: 2 as const,
+    [1 + 2]: 3 as const,
+    [sym]: 4 as const,
+    [Symbol()]: 5 as const,
+};
+
+// Repros from #1863
+
+const system = Symbol('system');
+const SomeSytePlugin = Symbol('SomeSytePlugin');
+
+interface Plugs {
+    [key: symbol]: (...args: any) => unknown;
+}
+
+const plugins = {
+    "user": {} as Plugs,
+    [system]: {} as Plugs
+};
+
+plugins[system][SomeSytePlugin] = () => console.log('awsome');
+plugins[system][SomeSytePlugin]();
+
+var theAnswer: symbol = Symbol('secret');
+var obj = {} as Record<symbol, number>;
+obj[theAnswer] = 42;
+
+// Repro from #26470
+
+const directive = Symbol('directive');
+declare function foo<TArg, TRet, TDir>(options: { [x in string]: (arg: TArg) => TRet } & { [directive]?: TDir }): void;
+
+let case1 = foo({
+    [directive]: (x: string) => 'str',
+    addOne: (x: number) => x + 1,
+    double: (x: number) => x + x,
+});
+
+let case2 = foo({
+    addOne: (x: number) => x + 1,
+    double: (x: number) => x + x,
+    [directive]: (x: string) => 'str',
+});
+
+let case3 = foo({
+    [directive]: 'str',
+    addOne: (x: number) => x + 1,
+    double: (x: number) => x + x,
+});
+
+// Repros from #42192
+
+type Pseudo = `&:${string}`;
+
+const AmIPseudo1: Pseudo = '&:test';
+const AmIPseudo: Pseudo = '&';  // Error
+
+type PseudoDeclaration = { [key in Pseudo]: string };
+
+const test: PseudoDeclaration = { 'someKey' : 'someValue' };  // Error
+
+type FieldPattern = `/${string}`;
+
+const path1: FieldPattern = '/one';
+const path2: FieldPattern = 'two';  // Error
+
+type PathsObject = { [P in FieldPattern]: object; };
+const pathObject: PathsObject = 123;  // Error
+
+type IdType = `${number}-${number}-${number}-${number}`
+const id: IdType = '0000-0000-0000-0001';
+
+type A = Record<IdType, string>;
+
+const a: A = { [id]: 'test' }
+
+let aid = a[id];
+
+// Repro from #44793
+
+interface AA {
+    a?: string;
+    b?: number;
+    [key: symbol]: string;
+}
+
+const aa: AA = { [sym]: '123' };
+
+const obj1: { [key: symbol]: string } = { [sym]: 'hello '};
+const obj2: { [key: string]: string } = { [sym]: 'hello '};  // Permitted for backwards compatibility
+const obj3: { [key: number]: string } = { [sym]: 'hello '};  // Error
+
+// Repro from #45772
+
+type Id = string & { __tag: 'id '};
+type Rec1 = { [key: Id]: number };
+type Rec2 = Record<Id, number>;
+
+type K1 = keyof Rec1;  // Id
+type K2 = keyof Rec2;  // Id
diff --git a/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts b/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts
index 1a7d6f2be4..bc489541ae 100644
--- a/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts
+++ b/tests/cases/conformance/types/members/objectTypeHidingMembersOfObject.ts
@@ -24,4 +24,6 @@ var b: {
     valueOf(): void;
 }
 
-var r4: void = b.valueOf();
\ No newline at end of file
+var r4: void = b.valueOf();
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/objectTypePropertyAccess.ts b/tests/cases/conformance/types/members/objectTypePropertyAccess.ts
index a54890fce9..e3c2cca547 100644
--- a/tests/cases/conformance/types/members/objectTypePropertyAccess.ts
+++ b/tests/cases/conformance/types/members/objectTypePropertyAccess.ts
@@ -26,3 +26,5 @@ var r8 = a.toString();
 var r9 = a['toString']();
 var r10 = a.foo;
 var r11 = a['foo'];
+
+let c1 = new C(); 
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts b/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts
index 730ab43ec9..2c1b46b5d1 100644
--- a/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts
+++ b/tests/cases/conformance/types/members/objectTypeWithNumericProperty.ts
@@ -40,4 +40,6 @@ var b = {
 var r1 = b[1];
 var r2 = b[1.1];
 var r3 = b['1'];
-var r4 = b['1.1'];
\ No newline at end of file
+var r4 = b['1.1'];
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts b/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts
index 766f56bdd2..d67c011129 100644
--- a/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts
+++ b/tests/cases/conformance/types/members/objectTypeWithStringNamedPropertyOfIllegalCharacters.ts
@@ -50,3 +50,5 @@ var r2 = b["    "];
 var r3 = b["a   b"];
 // BUG 817263
 var r4 = b["~!@#$%^&*()_+{}|:'<>?\/.,`"];
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts b/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts
index 9eef3476f2..9aea8f6a18 100644
--- a/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts
+++ b/tests/cases/conformance/types/members/typesWithSpecializedCallSignatures.ts
@@ -38,4 +38,7 @@ a = i;
 
 var r1: Derived1 = c.foo('hi');
 var r2: Derived2 = c.foo('bye');
-var r3: Base = c.foo('hm');
\ No newline at end of file
+var r3: Base = c.foo('hm');
+
+// let dev1 = new Derived1();
+// let dev2 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts b/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts
index 7c84e76f14..522fad55bf 100644
--- a/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts
+++ b/tests/cases/conformance/types/members/typesWithSpecializedConstructSignatures.ts
@@ -36,4 +36,7 @@ a = i;
 
 var r1 = new C('hi');
 var r2: Derived2 = new i('bye');
-var r3: Base = new a('hm');
\ No newline at end of file
+var r3: Base = new a('hm');
+
+let dev1 = new Derived1();
+let dev2 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts b/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts
index 82e7de4584..97001142ae 100644
--- a/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts
+++ b/tests/cases/conformance/types/namedTypes/classWithOptionalParameter.ts
@@ -8,4 +8,7 @@ class C {
 class C2<T> {
     x?: T;
     f?(x: T) {}
-}
\ No newline at end of file
+}
+
+let c = new C();
+let c2 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/namedTypes/optionalMethods.ts b/tests/cases/conformance/types/namedTypes/optionalMethods.ts
index 932521425f..dc7fe5cf4c 100644
--- a/tests/cases/conformance/types/namedTypes/optionalMethods.ts
+++ b/tests/cases/conformance/types/namedTypes/optionalMethods.ts
@@ -56,3 +56,6 @@ class Derived extends Base {
     a = 1;
     f(): number { return 1; }
 }
+
+let ba1 = new Bar();
+let dev = new Derived();
diff --git a/tests/cases/conformance/types/never/neverType.ts b/tests/cases/conformance/types/never/neverType.ts
index d58471d62a..e548194630 100644
--- a/tests/cases/conformance/types/never/neverType.ts
+++ b/tests/cases/conformance/types/never/neverType.ts
@@ -91,3 +91,5 @@ test(() => "hello");
 test(() => fail());
 test(() => { throw new Error(); })
 test(errorCallback);
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts
index 1cc499c7d6..16fe9f1bc5 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignatureWithoutReturnTypeAnnotationInference.ts
@@ -77,6 +77,7 @@ module M {
     export var x = 1;
     export class C { foo: string }
 }
+let c2 = new M.C();
 function foo11() {
     return M;
 }
@@ -119,4 +120,7 @@ module e1 { export var y = 1; }
 function foo15() {
     return e1;
 }
-var r15 = foo15();
\ No newline at end of file
+var r15 = foo15();
+
+let c = new C();
+let c11 = new c1(1);
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts
index d5ff0c1f56..191117eb92 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithDuplicateParameters.ts
@@ -35,4 +35,6 @@ var b = {
     foo(x, x) { },
     a: function foo(x: number, x: string) { },
     b: <T>(x: T, x: T) => { }
-}
\ No newline at end of file
+}
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts
index 34edfba671..d285c45d78 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters.ts
@@ -52,3 +52,5 @@ b.a(1);
 b.a(1, 2);
 b.b();
 b.b(1);
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts
index 4f31726f82..bdd01987b0 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts
@@ -56,4 +56,6 @@ a(1);
 a(1, 2);
 a.foo(1);
 a.foo(1, 2);
-a.foo(1, 2, 3);
\ No newline at end of file
+a.foo(1, 2, 3);
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts
index 432c905765..4c09ab1066 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/parametersWithNoAnnotationAreAny.ts
@@ -26,4 +26,6 @@ var b = {
         return x;
     },
     b: (x) => x
-}
\ No newline at end of file
+}
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts
index 01f33fbd7b..0aeddb657c 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsNotSubtypeOfNonSpecializedSignature.ts
@@ -62,3 +62,6 @@ var a3: {
     foo(x: 'a');
     foo<T extends String>(x: T);
 }
+let c1 = new C();
+let c2 = new C2();
+let c3 = new C3();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts
index 70735b8edd..06ca07fbe8 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/specializedSignatureIsSubtypeOfNonSpecializedSignature.ts
@@ -78,3 +78,6 @@ var a3: {
     foo(x: 'a');
     foo<T extends String>(x: T);
 }
+let c1 = new C();
+let c2 = new C2();
+let c3 = new C3();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts
index a8bf323850..6ea1c88cfb 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/stringLiteralTypesInImplementationSignatures.ts
@@ -23,3 +23,5 @@ var b = {
     a: function foo(x: 'hi', y: 'hi') { },
     b: (x: 'hi') => { }
 }
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts
index ef33eef5d5..5e87397a9e 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/callSignatures/typeParameterAsTypeArgument.ts
@@ -24,4 +24,6 @@ interface I<T, U> {
 
 //interface I<T, U extends T> {
 //    x: C<U, T>;
-//}
+//}
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts b/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts
index 4ac60bd7f7..9a462477de 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/constructSignatures/constructSignaturesWithOverloadsThatDifferOnlyByReturnType.ts
@@ -29,4 +29,7 @@ var a: {
 var b: {
     new <T>(x: T, y: string): C2<T>;
     new <T>(x: T, y: string): C; // error
-}
\ No newline at end of file
+}
+
+let c1 = new C(1);
+let c2 = new C2(1);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts
index 3d7b7eba45..4af4aba5a9 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/numericIndexingResults.ts
@@ -53,4 +53,6 @@ var r2b = b2['2'];
 var r3 = b2['3'];
 var r4 = b2[1];
 var r5 = b2[2];
-var r6 = b2[3];
\ No newline at end of file
+var r6 = b2[3];
+
+let  c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts
index f51b8e461e..48ccea819f 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/indexSignatures/stringIndexingResults.ts
@@ -32,3 +32,5 @@ var b: { [x: string]: string } = { y: '' }
 var r10 = b['y'];
 var r11 = b['a'];
 var r12 = b[1];
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts
index 42f42eb312..ce53505fda 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNameWithoutTypeAnnotation.ts
@@ -18,4 +18,6 @@ var b = {
 var r1 = (new C()).foo;
 var r2 = (<I>null).foo;
 var r3 = a.foo;
-var r4 = b.foo;
\ No newline at end of file
+var r4 = b.foo;
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts
index 6673465381..e8589921f5 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/propertyNamesOfReservedWords.ts
@@ -273,4 +273,6 @@ enum E {
 }
 
 var r7 = E.abstract;
-var r8 = E.as;
\ No newline at end of file
+var r8 = E.as;
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts
index dbea999036..9c6eea5968 100644
--- a/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts
+++ b/tests/cases/conformance/types/objectTypeLiteral/propertySignatures/stringNamedPropertyAccess.ts
@@ -20,4 +20,6 @@ var r3 = a["a b"];
 var b = {
     "a b": 1
 }
-var r4 = b["a b"];
\ No newline at end of file
+var r4 = b["a b"];
+
+let c1 = new C();
diff --git a/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts b/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts
index 6aa6325ee3..68641deedd 100644
--- a/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts
+++ b/tests/cases/conformance/types/primitives/number/extendNumberInterface.ts
@@ -7,4 +7,4 @@ var x = 1;
 var a: string = x.doStuff();
 var b: string = x.doOtherStuff('hm');
 var c: string = x['doStuff']();
-var d: string = x['doOtherStuff']('hm');
\ No newline at end of file
+var d: string = x['doOtherStuff']('hm');  
diff --git a/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts b/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts
index 58a5a54386..572d96843f 100644
--- a/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts
+++ b/tests/cases/conformance/types/primitives/undefined/invalidUndefinedValues.ts
@@ -28,4 +28,6 @@ x = f;
 
 enum E { A }
 x = E;
-x = E.A;
\ No newline at end of file
+x = E.A;
+
+let c1 = new C(); 
\ No newline at end of file
diff --git a/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts b/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts
index 71ae9f89a1..a1cad7a4a4 100644
--- a/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts
+++ b/tests/cases/conformance/types/primitives/undefined/validUndefinedAssignments.ts
@@ -20,4 +20,6 @@ var h: { f(): void } = x;
 
 function i<T>(a: T) {
     a = x;
-}
\ No newline at end of file
+}
+
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/rest/objectRestParameter.ts b/tests/cases/conformance/types/rest/objectRestParameter.ts
index 5b6faeb797..a18f4afc49 100644
--- a/tests/cases/conformance/types/rest/objectRestParameter.ts
+++ b/tests/cases/conformance/types/rest/objectRestParameter.ts
@@ -19,3 +19,4 @@ function foobar({ bar={}, ...opts }: any = {}) {
 foobar();
 foobar({ baz: 'hello' });
 foobar({ bar: { greeting: 'hello' } });
+let t1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts b/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts
index 9746dd287b..a518d15d97 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts
@@ -23,4 +23,6 @@ var c2: { (x: number): number; <T>(x: T): any; };
 
 var z2 = [a2, b2, c2];
 var r6 = z2[0];
-var r7 = r6(''); // any not string
\ No newline at end of file
+var r7 = r6(''); // any not string
+
+let c11 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts b/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts
index 4ba6a76000..1d686dcc89 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeLiterals/functionLiteralForOverloads2.ts
@@ -25,4 +25,7 @@ var f2: {
 var f3: {
     new<T>(x: string): D<T>;
     new<T>(x: number): D<T>;
-} = D;
\ No newline at end of file
+} = D;
+
+let c = new C('');
+let d = new D('');
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts
index 3e8ee82c74..4dd74a8b9b 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryOnClass.ts
@@ -53,4 +53,7 @@ class D<T> {
 
 var d: D<string>;
 var r3: typeof D;
-var r4: typeof d;
\ No newline at end of file
+var r4: typeof d;
+
+let c1 = new C(1);
+let d1 = new D(1);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts
index 5fb9d2233f..ce1748f526 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeQueryWithReservedWords.ts
@@ -12,3 +12,4 @@ interface IScope {
     delete: typeof Controller.prototype.delete;  // Should not error
     var: typeof Controller.prototype.var;        // Should not error
 }
+let c2 = new Controller();
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts
index df1898a543..4dcf244525 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofClass2.ts
@@ -18,4 +18,7 @@ class D extends C {
 var d: D;
 
 var r1: typeof D;
-var r2: typeof d;
\ No newline at end of file
+var r2: typeof d;
+
+let c = new C(1);
+let d1 = new D(1);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts
index 878885a8a9..53d74c3b71 100644
--- a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofModuleWithoutExports.ts
@@ -3,6 +3,7 @@ module M {
     class C {
         foo: number;
     }
+    var c = new C();
 }
 
-var r: typeof M;
\ No newline at end of file
+var r: typeof M;
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts
new file mode 100644
index 0000000000..420604c550
--- /dev/null
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThis.ts
@@ -0,0 +1,146 @@
+// @noImplicitThis: true
+// @strict: true
+
+class Test {
+    data = {};
+    constructor() {
+        var copy: typeof this.data = {};
+    }
+}
+
+class Test1 {
+    data = { foo: '' };
+    ['this'] = '';
+    constructor() {
+        var copy: typeof this.data = { foo: '' };
+        var foo: typeof this.data.foo = '';
+
+        var self: typeof this = this;
+        self.data;
+
+        var str: typeof this.this = '';
+    }
+}
+
+
+function Test2() {
+    let x: typeof this.no = 1;
+}
+
+function Test3(this: { no: number }) {
+    let x: typeof this.no = 1;
+}
+
+function Test4(this: { no: number } | undefined) {
+    let x: typeof this.no = 1;
+}
+
+class Test5 {
+    no = 1;
+
+    f = () => {
+        // should not capture this.
+        let x: typeof this.no = 1;
+    }
+}
+
+namespace Test6 {
+    export let f = () => {
+        let x: typeof this.no = 1;
+    }
+}
+
+module Test7 {
+    export let f = () => {
+        let x: typeof this.no = 1;
+    }
+}
+
+const Test8 = () => {
+    let x: typeof this.no = 1;
+}
+
+class Test9 {
+    no = 0;
+    this = 0;
+
+    f() {
+        if (this instanceof Test9D1) {
+            const d1: typeof this = this;
+            d1.f1();
+        }
+
+        if (this instanceof Test9D2) {
+            const d2: typeof this = this;
+            d2.f2();
+        }
+    }
+
+    g() {
+        if (this.no === 1) {
+            const no: typeof this.no = this.no;
+        }
+
+        if (this.this === 1) {
+            const no: typeof this.this = this.this;
+        }
+    }
+}
+
+class Test9D1 {
+    f1() {}
+}
+
+class Test9D2 {
+    f2() {}
+}
+
+class Test10 {
+    a?: { b?: string }
+
+    foo() {
+        let a: typeof this.a = undefined as any;
+        if (this.a) {
+            let a: typeof this.a = undefined as any;    // should narrow to { b?: string }
+            let b: typeof this.a.b = undefined as any;
+
+            if (this.a.b) {
+                let b: typeof this.a.b = undefined as any;   // should narrow to string
+            }
+        }
+    }
+}
+
+class Test11 {
+    this?: { x?: string };
+    
+    foo() {
+        const o = this;
+        let bar: typeof o.this = {};
+
+        if (o.this && o.this.x) {
+            let y: string = o.this.x;   // should narrow to string
+        }
+    }
+}
+
+class Tests12 {
+    test1() { // OK
+        type Test = typeof this;
+    }
+
+    test2() { // OK
+        for (;;) {}
+        type Test = typeof this;
+    }
+
+    test3() { // expected no compile errors
+        for (const dummy in []) {}
+        type Test = typeof this;
+    }
+
+    test4() { // expected no compile errors
+        for (const dummy of []) {}
+        type Test = typeof this;
+    }
+}
\ No newline at end of file
diff --git a/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts
new file mode 100644
index 0000000000..d99cceaa58
--- /dev/null
+++ b/tests/cases/conformance/types/specifyingTypes/typeQueries/typeofThisWithImplicitThis.ts
@@ -0,0 +1,5 @@
+// @noImplicitThis: false
+
+function Test1() {
+    let x: typeof this.no = 1
+}
diff --git a/tests/cases/conformance/types/spread/spreadDuplicate.ts b/tests/cases/conformance/types/spread/spreadDuplicate.ts
new file mode 100644
index 0000000000..f27a2529f0
--- /dev/null
+++ b/tests/cases/conformance/types/spread/spreadDuplicate.ts
@@ -0,0 +1,21 @@
+// @strict: true
+// @declaration: true
+
+// Repro from #44438
+
+declare let a: { a: string };
+declare let b: { a?: string };
+declare let c: { a: string | undefined };
+declare let d: { a?: string | undefined };
+
+declare let t: boolean;
+
+let a1 = { a: 123, ...a };  // string (Error)
+let b1 = { a: 123, ...b };  // string | number
+let c1 = { a: 123, ...c };  // string | undefined (Error)
+let d1 = { a: 123, ...d };  // string | number
+
+let a2 = { a: 123, ...(t ? a : {}) };  // string | number
+let b2 = { a: 123, ...(t ? b : {}) };  // string | number
+let c2 = { a: 123, ...(t ? c : {}) };  // string | number
+let d2 = { a: 123, ...(t ? d : {}) };  // string | number
diff --git a/tests/cases/conformance/types/spread/spreadDuplicateExact.ts b/tests/cases/conformance/types/spread/spreadDuplicateExact.ts
new file mode 100644
index 0000000000..e395af4ce5
--- /dev/null
+++ b/tests/cases/conformance/types/spread/spreadDuplicateExact.ts
@@ -0,0 +1,22 @@
+// @strict: true
+// @exactOptionalPropertyTypes: true
+// @declaration: true
+
+// Repro from #44438
+
+declare let a: { a: string };
+declare let b: { a?: string };
+declare let c: { a: string | undefined };
+declare let d: { a?: string | undefined };
+
+declare let t: boolean;
+
+let a1 = { a: 123, ...a };  // string (Error)
+let b1 = { a: 123, ...b };  // string | number
+let c1 = { a: 123, ...c };  // string | undefined (Error)
+let d1 = { a: 123, ...d };  // string | number | undefined
+
+let a2 = { a: 123, ...(t ? a : {}) };  // string | number
+let b2 = { a: 123, ...(t ? b : {}) };  // string | number
+let c2 = { a: 123, ...(t ? c : {}) };  // string | number | undefined
+let d2 = { a: 123, ...(t ? d : {}) };  // string | number | undefined
diff --git a/tests/cases/conformance/types/spread/spreadUnion4.ts b/tests/cases/conformance/types/spread/spreadUnion4.ts
new file mode 100644
index 0000000000..6a39ac3a3c
--- /dev/null
+++ b/tests/cases/conformance/types/spread/spreadUnion4.ts
@@ -0,0 +1,4 @@
+declare const a: { x: () => void }
+declare const b: { x?: () => void }
+
+const c = { ...a, ...b };
diff --git a/tests/cases/conformance/types/thisType/fluentClasses.ts b/tests/cases/conformance/types/thisType/fluentClasses.ts
index c9e791cb6f..0aad4efe17 100644
--- a/tests/cases/conformance/types/thisType/fluentClasses.ts
+++ b/tests/cases/conformance/types/thisType/fluentClasses.ts
@@ -15,3 +15,5 @@ class C extends B {
 }
 var c: C;
 var z = c.foo().bar().baz();  // Fluent pattern
+let b1 = new B();
+let c1 = new C();
diff --git a/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts b/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts
index f46b251c3b..c6091fd7a2 100644
--- a/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts
+++ b/tests/cases/conformance/types/thisType/thisTypeAndConstraints.ts
@@ -19,3 +19,6 @@ class B<T extends A> {
         x = x.self();
     }
 }
+
+let a = new A();
+let b = new B();
diff --git a/tests/cases/conformance/types/thisType/thisTypeInClasses.ts b/tests/cases/conformance/types/thisType/thisTypeInClasses.ts
index 6c650341fb..0d3913de7e 100644
--- a/tests/cases/conformance/types/thisType/thisTypeInClasses.ts
+++ b/tests/cases/conformance/types/thisType/thisTypeInClasses.ts
@@ -47,3 +47,9 @@ class C5 {
         let x2 = undefined as this;
     }
 }
+
+let c1 = new C1();
+let c2 = new C2();
+let c3 = new C3();
+let c4 = new C4();
+let c5 = new C5();
diff --git a/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts b/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts
index 01d7fd0430..8fe03ac945 100644
--- a/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts
+++ b/tests/cases/conformance/types/thisType/thisTypeInFunctions3.ts
@@ -7,3 +7,6 @@ class Test extends Base {
         this.check(this);
     }
 }
+
+let te = new Test();
+
diff --git a/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts b/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts
new file mode 100644
index 0000000000..c46933329b
--- /dev/null
+++ b/tests/cases/conformance/types/thisType/thisTypeInTaggedTemplateCall.ts
@@ -0,0 +1,10 @@
+// @target: esnext
+
+class Foo {
+    static m<T>(this: new () => T, strings: TemplateStringsArray | string) {
+        return new this()
+    }
+}
+
+Foo.m`test`;
+(Foo.m)`test`;
diff --git a/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts b/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts
index 0f58f1971d..e03bc2a0c6 100644
--- a/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts
+++ b/tests/cases/conformance/types/tuple/readonlyArraysAndTuples2.ts
@@ -21,3 +21,5 @@ class A {
   @someDec
   k: readonly [string, number] = ['foo', 42];
 }
+
+let a = new A();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts b/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts
index e7cca719f4..05fd3be85e 100644
--- a/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts
+++ b/tests/cases/conformance/types/typeAliases/circularTypeAliasForUnionWithClass.ts
@@ -15,3 +15,7 @@ type T4 = string | I4;
 class I4 {
     [x: string]: T4;
 }
+
+let i0 = new I0();
+let i3 = new I3();
+let i4 = new I4();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts b/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts
index 4cc3a72395..96d1b74b83 100644
--- a/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts
+++ b/tests/cases/conformance/types/typeAliases/classDoesNotDependOnBaseTypes.ts
@@ -9,4 +9,6 @@ var x: StringTree;
 if (typeof x !== "string") {
     x[0] = "";
     x[0] = new StringTreeCollection;
-}
\ No newline at end of file
+}
+
+let s1 = new StringTreeCollection();
diff --git a/tests/cases/conformance/types/typeAliases/typeAliases.ts b/tests/cases/conformance/types/typeAliases/typeAliases.ts
index b9d28f4cc3..32eb8473bf 100644
--- a/tests/cases/conformance/types/typeAliases/typeAliases.ts
+++ b/tests/cases/conformance/types/typeAliases/typeAliases.ts
@@ -77,4 +77,6 @@ var x: [string, boolean];
 f16(x);
 
 var y: StringAndBoolean = ["1", false];
-y[0].toLowerCase();
\ No newline at end of file
+y[0].toLowerCase();
+
+let c7 = new C7();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts
index 9a21c48ee1..b4a8dc7ba5 100644
--- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts
+++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/callGenericFunctionWithZeroTypeArguments.ts
@@ -33,4 +33,7 @@ interface I2<T> {
     f(x: T): T;
 }
 var i2: I2<number>;
-var r7 = i2.f(1);
\ No newline at end of file
+var r7 = i2.f(1);
+
+let c1 = new C();
+let c2 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts
index ba1c5b003f..7490e2bd94 100644
--- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts
+++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction.ts
@@ -58,4 +58,7 @@ function foo2<T extends { (): void }, U extends { (): void }>(x: T, y: U) {
 //function foo2<T extends { (): void }, U extends T>(x: T, y: U) {
 //    foo(x);
 //    foo(y);
-//}
\ No newline at end of file
+//}
+
+let c11 = new C();
+let c12 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts
index 6c32014789..dec6cdd0bd 100644
--- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts
+++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction3.ts
@@ -38,4 +38,7 @@ var c2: { <T>(x: T): T; <T>(x: T, y: T): T };
 var r9 = foo(function <U>(x: U) { return x; });
 var r10 = foo(<U extends string>(x: U) => x);
 var r12 = foo(i2);
-var r15 = foo(c2);
\ No newline at end of file
+var r15 = foo(c2);
+
+let c11 = new C();
+let c12 = new C2()
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts
index 60766c7e5e..4bd0b6c27f 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/innerTypeParameterShadowingOuterOne2.ts
@@ -34,4 +34,6 @@ class C2<T extends Date, U extends Date> {
 //        var x: U;
 //        x.getDate();
 //    }
-//}
\ No newline at end of file
+//}
+let c1 = new C();
+let c2 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts
index b89016ecff..c10bef3300 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints.ts
@@ -31,4 +31,5 @@ var b = {
     }
 }
 
-var r4 = b.foo(new Date());
\ No newline at end of file
+var r4 = b.foo(new Date());
+let c = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts
index 10f3a49884..a9992c5aa1 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints2.ts
@@ -61,7 +61,7 @@ var a: {
 var r3 = a<A, A>().foo(); 
 var r3b = a()['foo']();
 // parameter supplied for type argument inference to succeed
-var aB = new B();
+// var aB = new B();
 var r3c = a(aB, aB).foo(); 
 var r3d = a(aB, aB)['foo']();
 
@@ -78,4 +78,7 @@ var b = {
 //    }
 //}
 
-var r4 = b.foo(aB, aB); // no inferences for T so constraint isn't satisfied, error
\ No newline at end of file
+var r4 = b.foo(aB, aB); // no inferences for T so constraint isn't satisfied, error
+
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts
index 6167485f1b..73a10ae071 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithConstraints3.ts
@@ -53,4 +53,6 @@ var b = {
     }
 }
 
-var r4 = b.foo(new B()); // valid call to an invalid function
\ No newline at end of file
+var r4 = b.foo(new B()); // valid call to an invalid function
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts
index 1660d67a4e..b46569e9a4 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/propertyAccessOnTypeParameterWithoutConstraints.ts
@@ -28,4 +28,6 @@ var b = {
     }
 }
 
-var r4 = b.foo(1);
\ No newline at end of file
+var r4 = b.foo(1);
+
+let c = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts
index bade67badd..b9f3e54bb7 100644
--- a/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts
+++ b/tests/cases/conformance/types/typeParameters/typeParameterLists/typeParameterUsedAsConstraint.ts
@@ -32,3 +32,10 @@ var a3: { <T extends Date, U extends T>(): void }
 var a4: { <T extends U, U extends Date>(): void }
 var a5: { <T extends U, U extends V, V>(): void }
 var a6: { <T, U extends T, V extends U>(): void }
+
+let c1 = new C();
+let c2 = new C2();
+let c3 = new C3();
+let c4 = new C4();
+let c5 = new C5();
+let c6 = new C6();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts
index cc154308a1..5dfa8f94d3 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignabilityInInheritance.ts
@@ -85,4 +85,8 @@ var r3 = foo3(a); // any
 
 declare function foo18(x: {}): {};
 declare function foo18(x: any): any;
-var r3 = foo3(a); // any
\ No newline at end of file
+var r3 = foo3(a); // any
+
+let aa1 = new A();
+let aa2 = new A2();
+let ccc = new CC();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts
index 1c3bcc71ce..03e0089697 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType.ts
@@ -38,6 +38,7 @@ function foo<T, U /*extends T*/, V extends Date>(x: T, y: U, z: V) {
     z = a;
 }
 
+let cc = new C();
 //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) {
 //    x = a;
 //    y = a;
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts
index 26f3eee594..74a517176d 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/anyAssignableToEveryType2.ts
@@ -127,3 +127,6 @@ interface I20 {
     [x: string]: {};
     foo: any;
 }
+let aa = new A();
+let aa2 = new A2()
+let ccc = new c();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts
index d7a94cc862..464edb67d3 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers.ts
@@ -40,6 +40,8 @@ module SimpleTypes {
     a2 = b;
     a2 = t2;
     a2 = t;
+    let ss = new S();
+    let tt = new T();
 }
 
 module ObjectTypes {
@@ -81,5 +83,6 @@ module ObjectTypes {
     a2 = b;
     a2 = t2;
     a2 = t;
-
+    let ss = new S();
+    let tt = new T();
 }
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts
index a45da06482..a9e3bc6141 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers2.ts
@@ -39,3 +39,5 @@ b2 = a2;
 a2 = b;
 a2 = t2;
 a2 = t;
+let qu1 = new S();
+let qu2 = new T();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts
index 6e9a210db4..b96693de94 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembers3.ts
@@ -39,3 +39,5 @@ b2 = a2;
 a2 = b;
 a2 = t2;
 a2 = t;
+let qi3 = new S();
+let qi4 = new T();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts
index b25c949f42..7372988241 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatWithObjectMembersNumericNames.ts
@@ -39,3 +39,5 @@ b2 = a2;
 a2 = b;
 a2 = t2;
 a2 = t;
+let qi1 = new S();
+let qi2 = new T();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts
index 9e6cd52ac2..c511bfa71a 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance2.ts
@@ -66,4 +66,8 @@ interface I extends A {
     a16: <T extends Base>(x: T) => number[]; // ok
     a17: <T>(x: (a: T) => T) => T[]; // ok
     a18: <T>(x: (a: T) => T) => T[]; // ok, no inferences for T but assignable to any
-}
\ No newline at end of file
+}
+
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts
index dd10ee7646..bb1f737657 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance4.ts
@@ -46,4 +46,8 @@ interface I extends A {
     a16: <T>(x: { a: T; b: T }) => T[]; // ok, more general parameter type
     a17: <T>(x: (a: T) => T) => T[]; // ok
     a18: (x: <T>(a: T) => T) => any[]; // ok
-}
\ No newline at end of file
+}
+
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts
index bf60d6518c..ef4e179af9 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/callSignatureAssignabilityInInheritance5.ts
@@ -45,4 +45,7 @@ interface I extends B {
     a12: <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type
     a13: <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds
     a14: <T, U>(x: { a: T; b: U }) => T; // ok
-}
\ No newline at end of file
+}
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts
index 65e4f4c962..8d842b7d7e 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance2.ts
@@ -66,4 +66,8 @@ interface I extends A {
     a16: new <T extends Base>(x: T) => number[]; // ok
     a17: new <T>(x: new (a: T) => T) => T[]; // ok
     a18: new <T>(x: new (a: T) => T) => T[]; // ok, no inferences for T but assignable to any
-}
\ No newline at end of file
+}
+
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts
index 9dfcf5548a..8b57d6a8c7 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance4.ts
@@ -56,4 +56,7 @@ interface I extends A {
     a18: new <T extends Base>(x: T) => number[]; // ok, more general parameter type
     a19: new <T extends Base>(x: new (a: T) => T) => T[]; // ok
     a20: new (x: new <T extends Base>(a: T) => T) => any[]; // ok
-}
\ No newline at end of file
+}
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts
index f33820218e..6ba5e454f6 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance5.ts
@@ -45,4 +45,7 @@ interface I extends B {
     a12: new <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type
     a13: new <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds
     a14: new <T, U>(x: { a: T; b: U }) => T; // ok
-}
\ No newline at end of file
+}
+let qi14 = new Derived();
+let qi15 = new Derived2();
+let qi16 = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts
index 6c8670abaa..407e128678 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/everyTypeAssignableToAny.ts
@@ -53,6 +53,8 @@ function foo<T, U /*extends T*/, V extends Date>(x: T, y: U, z: V) {
     a = y;
     a = z;
 }
+
+let ccc = new C();
 //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) {
 //    a = x;
 //    a = y;
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts
index b0f55331d7..cc755558ff 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/nullAssignableToEveryType.ts
@@ -35,7 +35,7 @@ function foo<T, U, V extends Date>(x: T, y: U, z: V) {
     y = null;
     z = null;
 }
-
+let cc = new C();
 //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) {
 //    x = null;
 //    y = null;
diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts
index 5fc14274a1..f296781ef1 100644
--- a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts
+++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/undefinedAssignableToEveryType.ts
@@ -35,6 +35,7 @@ function foo<T, U, V extends Date>(x: T, y: U, z: V) {
     y = undefined;
     z = undefined;
 }
+let cc = new C();
 //function foo<T, U extends T, V extends Date>(x: T, y: U, z: V) {
 //    x = undefined;
 //    y = undefined;
diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts
index 5f02210478..1e1889cc10 100644
--- a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts
+++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions.ts
@@ -23,4 +23,7 @@ var r11 = true ? base : derived2;
 
 function foo5<T, U>(t: T, u: U): Object {
     return true ? t : u; // BCT is Object
-}
\ No newline at end of file
+}
+
+let qy10 = new Derived();
+let qy11 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts
index 8e6f345ea4..f1512e3536 100644
--- a/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts
+++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/bestCommonTypeOfConditionalExpressions2.ts
@@ -21,4 +21,6 @@ function foo2<T extends U, U>(t: T, u: U) { // Error for referencing own type pa
 
 function foo3<T extends U, U extends V, V>(t: T, u: U) {
     return true ? t : u;
-}
\ No newline at end of file
+}
+let qy8 = new Derived();
+let qy9 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts b/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts
index 0f498c570a..13ecea225a 100644
--- a/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts
+++ b/tests/cases/conformance/types/typeRelationships/bestCommonType/heterogeneousArrayLiterals.ts
@@ -99,6 +99,8 @@ function foo4<T extends Base, U extends Base>(t: T, u: U) {
 
     var k: Base[] = [t, u];
 }
+let qy8 = new Derived();
+let qy9 = new Derived2();
 
 //function foo3<T extends U, U extends Derived>(t: T, u: U) {
 //    var a = [t, t]; // T[]
diff --git a/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts b/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts
index 04623503f9..491876d8ff 100644
--- a/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts
+++ b/tests/cases/conformance/types/typeRelationships/instanceOf/narrowingConstrainedTypeVariable.ts
@@ -34,3 +34,6 @@ function f3<T extends E>(v: T | { x: string }) {
         const y: { x: string } = v;
     }
 }
+let qy5 = new C();
+let qy6 = new D();
+let qy7 = new E();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts
index e7260831a4..35de332a33 100644
--- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts
+++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/arrayLiteralsWithRecursiveGenerics.ts
@@ -22,4 +22,8 @@ var ys = [list, list2]; // {}[]
 var zs = [list, null]; // List<number>[]
 
 var myDerivedList: DerivedList<number>;
-var as = [list, myDerivedList]; // List<number>[]
\ No newline at end of file
+var as = [list, myDerivedList]; // List<number>[]
+
+let li = new List();
+let der = new DerivedList();
+let my = new MyList();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts
index ac6286bd81..e4d37f2abe 100644
--- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts
+++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypeInGenericConstraint.ts
@@ -10,4 +10,7 @@ class D<T> {
     x: G<G<T>>; 
 }
 
-var c1 = new Foo<D<string>>(); // ok, circularity in assignment compat check causes success
\ No newline at end of file
+var c1 = new Foo<D<string>>(); // ok, circularity in assignment compat check causes success
+let g = new G();
+let foo = new Foo();
+let d = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts
index 6eba1f2836..6cdf1db8be 100644
--- a/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts
+++ b/tests/cases/conformance/types/typeRelationships/recursiveTypes/recursiveTypesUsedAsFunctionParameters.ts
@@ -40,4 +40,7 @@ function other<T extends List<U>, U>() {
 
     var r = foo5(list);
     var r2 = foo5(myList);
-}
\ No newline at end of file
+}
+
+let li = new List();
+let my = new MyList();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts
index 24f2ab71d4..ced02bcefe 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts
@@ -88,3 +88,7 @@ var r19 = true ? null : new Object();
 
 var r20 = true ? {} : null;
 var r20 = true ? null : {};
+
+let c11 = new C1();
+let c12 = new C2();
+let c13 = new c();
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts
index c7e9c0fc8e..0f00bc8c02 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/stringLiteralTypeIsSubtypeOfString.ts
@@ -97,4 +97,6 @@ function f15<T, U extends T>(x: any) { }
 
 function f16<T extends String, U extends T>(x: 'a');
 function f16<T extends String, U extends T>(x: U);
-function f16<T extends String, U extends T>(x: any) { }
\ No newline at end of file
+function f16<T extends String, U extends T>(x: any) { }
+
+let ccc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts
index 0e5df54319..d785a27b7b 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfAny.ts
@@ -130,4 +130,7 @@ interface I19 {
 interface I20 {
     [x: string]: any;
     foo: {};
-}
\ No newline at end of file
+}
+let a1 = new A();
+let a2 = new A2();
+let c1 = new c(); 
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts
index 9edf4f5f41..990e4b8cc5 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypesOfTypeParameterWithConstraints2.ts
@@ -154,4 +154,7 @@ function f20<T extends Number>(x: T) {
 function f21<T extends Number>(x: T) {
     var r20 = true ? {} : x; // ok
     var r20 = true ? x : {}; // ok
-}
\ No newline at end of file
+}
+
+let c1 = new C1();
+let c2 = new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts
index e8ae73c5fb..4a29484b12 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures2.ts
@@ -5,6 +5,7 @@ class Derived extends Base { bar: string; }
 class Derived2 extends Derived { baz: string; }
 class OtherDerived extends Base { bing: string; }
 
+
 declare function foo1(a: (x: number) => number[]): typeof a;
 declare function foo1(a: any): any;
 
@@ -169,3 +170,8 @@ var r17arg1 = <T>(x: (a: T) => T) => <T[]>null;
 var r17 = foo17(r17arg1); // any
 var r18arg1 = <T>(x: (a: T) => T) => <T[]>null;
 var r18 = foo18(r18arg1); 
+
+ 
+let der1 = new Derived();
+let der2 = new Derived2();
+let oth = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts
index 505919547f..51c890854f 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures3.ts
@@ -103,6 +103,10 @@ module Errors {
 
     var r9arg = <T>(x: (a: T) => T) => <any[]>null;
     var r9 = foo17(r9arg); // (x: { <T extends Derived >(a: T): T; <T extends Base >(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[];
+    let ba = new Base();
+    let der1 = new Derived();
+    let der2 = new Derived2();
+    let oth = new OtherDerived();
 }
 
 module WithGenericSignaturesInBaseType {
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts
index e86fc51d44..e043cec402 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignatures4.ts
@@ -108,4 +108,8 @@ var r17arg = <T>(x: (a: T) => T) => <T[]>null;
 var r17 = foo17(r17arg);
 
 var r18arg = (x: <T>(a: T) => T) => <any[]>null;
-var r18 = foo18(r18arg);
\ No newline at end of file
+var r18 = foo18(r18arg);
+
+let der  =new Derived();
+let der2 = new Derived2();
+let oth = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts
index 46d1c9e91d..683db9f182 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures2.ts
@@ -169,3 +169,8 @@ var r17arg1: new <T>(x: (a: T) => T) => T[];
 var r17 = foo17(r17arg1); // any
 var r18arg1: new <T>(x: (a: T) => T) => T[];
 var r18 = foo18(r18arg1); 
+
+
+let der  =new Derived();
+let der2 = new Derived2();
+let oth = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts
index 215a5d1d4d..bbaddcabfc 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures3.ts
@@ -105,6 +105,10 @@ module Errors {
 
     var r9arg: new <T>(x: new (a: T) => T) => any[];
     var r9 = foo17(r9arg); // // (x: { <T extends Derived >(a: T): T; <T extends Base >(a: T): T; }): any[]; (x: { <T extends Derived2>(a: T): T; <T extends Base>(a: T): T; }): any[];
+    let ba = new Base();
+    let der1 = new Derived();
+    let der2 = new Derived2();
+    let oth = new OtherDerived();
 }
 
 module WithGenericSignaturesInBaseType {
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts
index 830139d3fa..5d5145d29d 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures4.ts
@@ -108,4 +108,8 @@ var r17arg: new <T>(x: new (a: T) => T) => T[];
 var r17 = foo17(r17arg);
 
 var r18arg: new (x: new <T>(a: T) => T) => any[];
-var r18 = foo18(r18arg);
\ No newline at end of file
+var r18 = foo18(r18arg);
+
+let der  =new Derived();
+let der2 = new Derived2();
+let oth = new OtherDerived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts
index f33820218e..f3c1c5d20d 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithConstructSignatures5.ts
@@ -6,6 +6,7 @@ class Derived extends Base { bar: string; }
 class Derived2 extends Derived { baz: string; }
 class OtherDerived extends Base { bing: string; }
 
+
 interface A { // T
     // M's
     a: new (x: number) => number[];
@@ -45,4 +46,7 @@ interface I extends B {
     a12: new <T extends Array<Base>>(x: Array<Base>, y: T) => Array<Derived>; // ok, less specific parameter type
     a13: new <T extends Array<Derived>>(x: Array<Base>, y: T) => T; // ok, T = Array<Derived>, satisfies constraint, contextual signature instantiation succeeds
     a14: new <T, U>(x: { a: T; b: U }) => T; // ok
-}
\ No newline at end of file
+}
+let der  =new Derived();
+let der2 = new Derived2();
+let oth = new OtherDerived();
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts
index b50e1f7106..2c99af9515 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithObjectMembers4.ts
@@ -30,4 +30,8 @@ class A3 {
 
 class B3 extends A3 {
     '1.1': Derived; // ok, inherits '1'
-}
\ No newline at end of file
+}
+let der = new Derived();
+let b1 = new B();
+let b2 = new B2();
+let b3 = new B3();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts
index 7ee0906ee2..08c7e7d192 100644
--- a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts
+++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/undefinedIsSubtypeOfEverything.ts
@@ -118,3 +118,28 @@ class D16 extends Base {
 class D17 extends Base {
     foo: {};
 }
+
+
+let d0 = new D0();
+let da = new DA();
+let d1 = new D1()
+let d1a = new D1A()
+let d2 = new D2()
+let d2a = new D2A()
+let d3 = new D3()
+let d3a = new D1A()
+let d4 = new D4()
+let d5 = new D5()
+let d6 = new D6()
+let d7 = new D7()
+let d8 = new D8()
+let d9 = new D9()
+let d10 = new D10()
+let d11 = new D11()
+let d12 = new D12()
+let c1 = new c()
+let d13 = new D13()
+let d14 = new D14()
+let d15 = new D15()
+let d16 = new D16()
+let d17 = new D17()
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts
index 225a974181..acf6300dba 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity.ts
@@ -85,4 +85,8 @@ function foo13(x: any) { }
 
 function foo14(x: I);
 function foo14(x: typeof b); // error
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts
index fefde23a69..2427d26180 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentity2.ts
@@ -62,4 +62,7 @@ function foo13(x: any) { }
 
 function foo14(x: I);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+let aa = new A();
+let bb = new B();
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts
index 94038f6df9..bb5d06c3fc 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures.ts
@@ -97,4 +97,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qy17 = new A();
+let qy18 = new B();
+let qy19 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts
index 699f0f73f7..99aafb4b8a 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignatures2.ts
@@ -97,4 +97,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let aa = new A();
+let bb = new B();
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts
index b62b558d06..8a23c2c1bd 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesDifferingParamCounts.ts
@@ -97,4 +97,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let aa = new A();
+let bb = new B();
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts
index 0aaf7c30f2..cc561aa934 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithCallSignaturesWithOverloads.ts
@@ -113,4 +113,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let aa = new A();
+let bb = new B();
+let cc = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts
index efec6a715b..964c2a9d43 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures.ts
@@ -84,4 +84,8 @@ function foo13(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A('1');
+let b1 = new B('1');
+let c1 = new C(1);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts
index 63e5167a4c..09f632da93 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignatures2.ts
@@ -73,4 +73,6 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qy38 = new B(null);
+let qy39 =new C(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts
index b8fc424b21..b6af7ec955 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithConstructSignaturesDifferingParamCounts.ts
@@ -73,4 +73,6 @@ function foo14(x: any) { }
 
 function foo15(x: I2<string>);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qo23 =new B(null,null);
+let qo24 =new C(null,null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts
index d95bc486df..72019e6b9a 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures.ts
@@ -97,4 +97,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts
index 5c009926a0..099927c132 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignatures2.ts
@@ -97,4 +97,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<string, number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts
index ede6da4040..21f9ed1933 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints.ts
@@ -99,4 +99,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<String>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts
index 5fb315c4da..c0ce245917 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints2.ts
@@ -111,4 +111,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<String, String>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
+let d1 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts
index aaae2cbf33..b341b1f6c2 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByConstraints3.ts
@@ -120,4 +120,11 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<Three, Three>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let one = new One();
+let two = new Two();
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
+let d1 = new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts
index 97a657606e..ab7da883ec 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType.ts
@@ -99,4 +99,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qy12 = new A();
+let qy13 = new B();
+let qy14 = new C();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts
index df7533d906..5e419a9b14 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingByReturnType2.ts
@@ -99,4 +99,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<Date>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let qo27 = new A();
+let qo28 =new B();
+let qo29 =new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts
index e3bd868941..1bda87ea35 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterCounts.ts
@@ -97,4 +97,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number, B<string, string>, B<number, string>>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts
index 9e01aaec49..9b74d14cfc 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesDifferingTypeParameterNames.ts
@@ -97,4 +97,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qo17 = new A();
+let qo18 =new B();
+let qo19 =new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts
index c5454cc41e..781a351188 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams.ts
@@ -99,4 +99,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qo9 = new A();
+let qo10 = new B();
+let qo11 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts
index b8620f04d1..ca2a5abb87 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams2.ts
@@ -99,4 +99,7 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<string, number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts
index f39d23637a..828b26331c 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericCallSignaturesOptionalParams3.ts
@@ -99,4 +99,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<string, number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts
index 974f53cb9c..8d1aa46bde 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints.ts
@@ -72,3 +72,5 @@ function foo13(x: any) { }
 function foo14(x: I<Number>);
 function foo14(x: typeof b); // ok
 function foo14(x: any) { }
+let qo15 = new B(null);
+let qo16 = new C(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts
index 47bab5dab8..963aabc746 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints2.ts
@@ -83,4 +83,9 @@ function foo13(x: any) { }
 
 function foo14(x: I<Number, Number>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+var aa = []
+let b1 = new B(aa,aa);
+let c1 = new C('','');
+let d1 = new D(1,1);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts
index 14f4933a15..b593e623e5 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByConstraints3.ts
@@ -92,4 +92,9 @@ function foo13(x: any) { }
 
 function foo14(x: I<Five<string>, Five<string>>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+let qo1 = new One();
+let qo2 = new Two();
+let qo3 = new B(null,null);
+let qo4 = new C(null,null);
+let qo5 = new D(null,null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts
index 9c072e8936..185dab627d 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType.ts
@@ -79,4 +79,6 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<number>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+let qy49 =new B(null);
+let qy50 =new C(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts
index 2e0a98d557..9e63b81350 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingByReturnType2.ts
@@ -75,4 +75,8 @@ function foo14(x: any) { }
 
 function foo15(x: I2);
 function foo15(x: C<Date>); // ok
-function foo15(x: any) { }
\ No newline at end of file
+function foo15(x: any) { }
+
+var aa;
+let b1 = new B(aa);
+let c1 = new C(aa);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts
index fe01df2564..8caa853954 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterCounts.ts
@@ -69,4 +69,6 @@ function foo13(x: any) { }
 
 function foo14(x: I<string, Date, RegExp, boolean>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+let qo6 = new B(null);
+let qo7 = new C(null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts
index 20d7dbab13..7573f3e8b4 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesDifferingTypeParameterNames.ts
@@ -69,4 +69,8 @@ function foo13(x: any) { }
 
 function foo14(x: I<string>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+
+let b1 = new B(a);
+let c1 = new C(a);
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts
index 56dc5a051c..2caea04bc0 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams.ts
@@ -71,4 +71,7 @@ function foo13(x: any) { }
 
 function foo14(x: I<string>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+let b1 = new B(a);
+let c1 = new C(a);
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts
index 6c4a282228..d9e2b8c184 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams2.ts
@@ -71,4 +71,7 @@ function foo13(x: any) { }
 
 function foo14(x: I<string, number>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+let b1 = new B(a);
+let c1 = new C(a);
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts
index 8c9a08137f..0683e8d40b 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithGenericConstructSignaturesOptionalParams3.ts
@@ -71,4 +71,6 @@ function foo13(x: any) { }
 
 function foo14(x: I<string, number>);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+let qy15 = new B(null,null);
+let qy16 = new C(null,null);
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts
index 867199d905..0c6b2ca24b 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers1.ts
@@ -119,3 +119,6 @@ function foo16(x: I);
 function foo16(x: PB); // error
 function foo16(x: any) { }
 
+let c1 = new C();
+let pa = new PA();
+let pb = new PB();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts
index ea9d7d04ee..bf735eb8a5 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers2.ts
@@ -122,3 +122,8 @@ function foo16(x: I);
 function foo16(x: PB); // error
 function foo16(x: any) { }
 
+
+let der = new Derived()
+let c1 = new C();
+let pa = new PA();
+let pb = new PB();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts
index d3f22604c4..337ac0b542 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithNumericIndexers3.ts
@@ -119,3 +119,6 @@ function foo16(x: I);
 function foo16(x: PB); // error
 function foo16(x: any) { }
 
+let qo32 =new C();
+let qo30 = new PA();
+let qo31 =new PB();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts
index 7c24195105..21be3c5930 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithOptionality.ts
@@ -53,4 +53,8 @@ function foo13(x: any) { }
 
 function foo14(x: I);
 function foo14(x: typeof b); // ok
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+
+let a1 = new A();
+let b1 = new B();
+let c1 = new C();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts
index b9e390158c..fe547befb2 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates.ts
@@ -116,4 +116,6 @@ function foo15(x: any) { }
 function foo16(x: I);
 function foo16(x: PB); // no error
 function foo16(x: any) { }
-
+let qo26 =new C();
+let qo24 = new PA();
+let qo25 =new PB();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts
index 769e59f06d..403c1692d7 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPrivates2.ts
@@ -35,3 +35,4 @@ function foo6(x: D<number>): string; // error
 function foo6(x: any): any { }
 
 
+let d1 = new D();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts
index 813a8333e5..6f12d3d4e0 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithPublics.ts
@@ -85,4 +85,7 @@ function foo13(x: any) { }
 
 function foo14(x: I);
 function foo14(x: typeof b); // error
-function foo14(x: any) { }
\ No newline at end of file
+function foo14(x: any) { }
+let qy41 = new A();
+let qy42 =new B();
+let qy43 =new C();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts
index f511e56bc3..e6d583aa06 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers.ts
@@ -119,3 +119,6 @@ function foo16(x: I);
 function foo16(x: PB); // error
 function foo16(x: any) { }
 
+let qo35 =new C();
+let qo33 = new PA();
+let qo34 =new PB();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts
index d8af511910..7c37adc723 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/objectTypesIdentityWithStringIndexers2.ts
@@ -122,3 +122,8 @@ function foo16(x: I);
 function foo16(x: PB); // error
 function foo16(x: any) { }
 
+
+let der = new Derived();
+let c1 = new C();
+let pa = new PA();
+let pb = new PB();
diff --git a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts
index 0495789326..383623ee14 100644
--- a/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts
@@ -73,4 +73,6 @@ interface I2<T extends Date> {
 
     foo3<T>(x: T);
     foo3<T>(x: T); // no error, different declaration for each T
-}
\ No newline at end of file
+}
+let qy36 = new C();
+let qy37 =new C2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts
index 601f790667..b8526977ef 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference.ts
@@ -104,3 +104,6 @@ var r8b = i.foo5(d2, d2); // Derived2
 var r9 = i.foo6(); // Derived
 var r10 = i.foo7(d1); // Base
 var r11 = i.foo8(); // Base
+
+let qu12 = new Derived();
+let qu13 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts
index 3d68ff7a0d..74c3573627 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithFunctionTypedArguments4.ts
@@ -19,4 +19,6 @@ var b: {
     new<T>(x: T): any;
 }
 
-var r2 = foo4(b); // T is {} (candidates boolean and {}), U is any (candidates any and {})
\ No newline at end of file
+var r2 = foo4(b); // T is {} (candidates boolean and {}), U is any (candidates any and {})
+let qy3 = new C();
+let qy4 =new D();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts
index 514df351cc..52f1c5e20f 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs2.ts
@@ -29,4 +29,6 @@ interface I<T, U> {
 }
 
 var i: I<Base, Derived>;
-var r4 = f2(i); // Base => Derived
\ No newline at end of file
+var r4 = f2(i); // Base => Derived
+let qy0 = new Derived();
+let qy1 = new Derived2();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts
index e1c91529d7..475dfe3dcb 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints.ts
@@ -19,8 +19,8 @@ function foo<T extends { x: string }>(t: X<T>, t2: X<T>) {
     return x;
 }
 
-var c1 = new X<C>();
-var d1 = new X<D>();
+// var c1 = new X<C>();
+// var d1 = new X<D>();
 var r = foo(c1, d1); 
 var r2 = foo(c1, c1);
 
@@ -30,4 +30,8 @@ function foo2<T extends C>(t: X<T>, t2: X<T>) {
 }
 
 var r = foo2(c1, d1); 
-var r2 = foo2(c1, c1);
\ No newline at end of file
+var r2 = foo2(c1, c1);
+
+let qu4 = new C();
+let qu5 = new D();
+let qu6 = new X();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts
index c97915eaf1..5f7fee7daf 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints2.ts
@@ -35,3 +35,4 @@ var r5 = f3(new Derived(), x => x);
 
 var r6 = f3(null, null); // any
 var r7 = f3(null, x => x); // any
+let qu8 = new Derived();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts b/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts
index 1c29b3822b..a52b2b835e 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/genericClassWithObjectTypeArgsAndConstraints.ts
@@ -37,6 +37,8 @@ module Class {
     var g2: G2<D>;
     var r = g2.foo2(c1, d1);
     var r2 = g2.foo2(c1, c1);
+    var gg1 = new G();
+    var gg2 = new G2();
 }
 
 module Interface {
@@ -57,4 +59,7 @@ module Interface {
     var g2: G2<D>;
     var r = g2.foo2(c1, d1);
     var r2 = g2.foo2(c1, c1);
-}
\ No newline at end of file
+}
+let c = new C();
+let d = new D();
+let x = new X();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts b/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts
index 9de110bd1e..7a24403769 100644
--- a/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts
+++ b/tests/cases/conformance/types/typeRelationships/typeInference/keyofInferenceLowerPriorityThanReturn.ts
@@ -44,3 +44,7 @@ function insertOnConflictDoNothing<Req extends object, Def extends object>(_tabl
 function f() {
     insertOnConflictDoNothing(bookTable, ConflictTarget.tableColumns(["serial"]));  // <-- No error here; should use the type inferred for the return type of `tableColumns`
 }
+let qu9 = new Write();
+let qu10 = new Col();
+let qu11 =new Table();
+let qu12 =new ConflictTarget();
\ No newline at end of file
diff --git a/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts
new file mode 100644
index 0000000000..a5e51271bc
--- /dev/null
+++ b/tests/cases/conformance/types/union/discriminatedUnionTypes3.ts
@@ -0,0 +1,19 @@
+// @strict: true
+
+// Repro from #44435
+
+type Correct = {
+	code: string
+	property: true
+	err: undefined
+}
+type Err = {
+	err: `${string} is wrong!`
+}
+type SomeReturnType = Correct | Err;
+
+const example: SomeReturnType = {} as SomeReturnType;
+
+if (example.err === undefined) {
+	example.property;  // true
+}
\ No newline at end of file
-- 
2.17.1