Skip to content

Compiler stack overflow with circular constraint and conditional type #25740

Closed
@mattmccutchen

Description

@mattmccutchen

I triggered this while trying to use the type system to verify that I was interning objects properly. I can provide the real-world example code if it's of interest.

TypeScript Version: master (d9ed917)

Search Terms: "Maximum call stack size exceeded" and some of the function names from the stack trace below.

Code

type Foo<T> = [T] extends [number] ? {} : {};
function foo<S extends Foo<S>>() {}

Expected behavior: No compiler crash.

Actual behavior:

REDACTED/typescript/built/local/tsc.js:83260
                throw e;
                ^

RangeError: Maximum call stack size exceeded
    at getSymbol (REDACTED/typescript/built/local/tsc.js:30038:27)
    at resolveNameHelper (REDACTED/typescript/built/local/tsc.js:30201:34)
    at resolveName (REDACTED/typescript/built/local/tsc.js:30187:20)
    at resolveEntityName (REDACTED/typescript/built/local/tsc.js:31026:26)
    at resolveTypeReferenceName (REDACTED/typescript/built/local/tsc.js:36544:20)
    at getTypeFromTypeReference (REDACTED/typescript/built/local/tsc.js:36706:30)
    at getTypeFromTypeNode (REDACTED/typescript/built/local/tsc.js:38062:28)
    at getConstraintFromTypeParameter (REDACTED/typescript/built/local/tsc.js:36389:72)
    at isUnconstrainedTypeParameter (REDACTED/typescript/built/local/tsc.js:40346:63)
    at REDACTED/typescript/built/local/tsc.js:40349:121
    at Object.some (REDACTED/typescript/built/local/tsc.js:626:25)
    at isTypeReferenceWithGenericArguments (REDACTED/typescript/built/local/tsc.js:40349:74)
    at getRelationKey (REDACTED/typescript/built/local/tsc.js:40387:17)
    at recursiveTypeRelatedTo (REDACTED/typescript/built/local/tsc.js:39623:26)
    at isRelatedTo (REDACTED/typescript/built/local/tsc.js:39305:38)
    at checkTypeRelatedTo (REDACTED/typescript/built/local/tsc.js:39096:26)
    at getConditionalType (REDACTED/typescript/built/local/tsc.js:37671:21)
    at instantiateConditionalType (REDACTED/typescript/built/local/tsc.js:38415:20)
    at getConditionalTypeInstantiation (REDACTED/typescript/built/local/tsc.js:38397:30)
    at instantiateType (REDACTED/typescript/built/local/tsc.js:38456:28)
    at getTypeAliasInstantiation (REDACTED/typescript/built/local/tsc.js:36500:62)
    at getTypeFromTypeAliasReference (REDACTED/typescript/built/local/tsc.js:36521:24)
    at getTypeReferenceTypeWorker (REDACTED/typescript/built/local/tsc.js:36598:24)
    at getTypeReferenceType (REDACTED/typescript/built/local/tsc.js:36551:24)
    at getTypeFromTypeReference (REDACTED/typescript/built/local/tsc.js:36707:28)
    at getTypeFromTypeNode (REDACTED/typescript/built/local/tsc.js:38062:28)
    at getConstraintFromTypeParameter (REDACTED/typescript/built/local/tsc.js:36389:72)
    at isUnconstrainedTypeParameter (REDACTED/typescript/built/local/tsc.js:40346:63)
    at REDACTED/typescript/built/local/tsc.js:40349:121
    at Object.some (REDACTED/typescript/built/local/tsc.js:626:25)
...

Playground Link: link

Related Issues: #22950 conceivably but probably not.

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions