Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stackoverflow when compiling a specific getter method #48248

Closed
erik-krogh opened this issue Mar 14, 2022 · 5 comments
Closed

Stackoverflow when compiling a specific getter method #48248

erik-krogh opened this issue Mar 14, 2022 · 5 comments
Assignees
Labels
Bug A bug in TypeScript

Comments

@erik-krogh
Copy link

Stackoverflow when compiling a specific getter method

🔎 Search Terms

  • Maximum call stack size exceeded
  • Stackoverflow

🕗 Version & Regression Information

The crash started happening with 4.6, and it still occurs on the latest nightly.
The crash doesn't happen on 4.5.5.

⏯ Playground Link

Reproduction playground: https://www.typescriptlang.org/dev/bug-workbench/?#code/MYGwhgzhAECyCeAVAFgSwHYHNoG8BQ00mApgC7QC28ACgE4D2ADgBQCUu0tZArretKTQwAZMOgAiAGb164gNzQAvnkVA

💻 Code

class MyThing {
  get myProp() { return this && "foo"; }
}

The crash only happens when strictNullChecks is enabled.

🙁 Actual behavior

Crash.

🙂 Expected behavior

No crash.

@RyanCavanaugh RyanCavanaugh added the Bug A bug in TypeScript label Mar 14, 2022
@RyanCavanaugh
Copy link
Member

Bisected to #45350, which seems odd

@DanielRosenwasser
Copy link
Member

For context/searchability, here's the call stack:

<semantic> Response received: quickinfo (32). Request took 37 ms. Success: false . Message: Error processing request. Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
    at hasSyntacticModifier ([node_modules_path]\typescript\lib\tsserver.js:18647:34)
    at hasStaticModifier ([node_modules_path]\typescript\lib\tsserver.js:18657:16)
    at Object.isStatic ([node_modules_path]\typescript\lib\tsserver.js:18653:43)
    at tryGetThisTypeAt ([node_modules_path]\typescript\lib\tsserver.js:71106:31)
    at checkThisExpression ([node_modules_path]\typescript\lib\tsserver.js:71059:24)
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:78937:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at maybeCheckExpression ([node_modules_path]\typescript\lib\tsserver.js:78005:38)
    at BinaryExpressionStateMachine.onLeft ([node_modules_path]\typescript\lib\tsserver.js:77955:28)
    at Array.left ([node_modules_path]\typescript\lib\tsserver.js:29962:36)
    at trampoline ([node_modules_path]\typescript\lib\tsserver.js:30095:52)
    at [node_modules_path]\typescript\lib\tsserver.js:77920:30
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:79010:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)
    at getReturnTypeFromBody ([node_modules_path]\typescript\lib\tsserver.js:76902:29)
    at resolveTypeOfAccessors ([node_modules_path]\typescript\lib\tsserver.js:55884:42)
    at getTypeOfAccessorsWorker ([node_modules_path]\typescript\lib\tsserver.js:55844:24)
    at getTypeOfSetAccessor ([node_modules_path]\typescript\lib\tsserver.js:55837:58)
    at getSetAccessorTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56062:28)
    at getWriteTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56058:20)
    at createUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58447:33)
    at getUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58499:28)
    at getPropertyOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:58508:28)
    at getPropertiesOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:57930:48)
    at getReducedType ([node_modules_path]\typescript\lib\tsserver.js:58525:34)
    at getNormalizedType ([node_modules_path]\typescript\lib\tsserver.js:63777:74)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64128:30)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64791:42)
    at recursiveTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64688:30)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64200:25)
    at checkTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63815:26)
    at isTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63766:24)
    at isTypeAssignableTo ([node_modules_path]\typescript\lib\tsserver.js:62973:20)
    at isTypeAssignableToKind ([node_modules_path]\typescript\lib\tsserver.js:77605:53)
    at allTypesAssignableToKind ([node_modules_path]\typescript\lib\tsserver.js:77616:17)
    at getPromisedTypeOfPromise ([node_modules_path]\typescript\lib\tsserver.js:80261:17)
    at getAwaitedTypeOfPromise ([node_modules_path]\typescript\lib\tsserver.js:80232:32)
    at helper ([node_modules_path]\typescript\lib\tsserver.js:81671:35)
    at checkTestingKnownTruthyCallableOrAwaitableType ([node_modules_path]\typescript\lib\tsserver.js:81651:13)
    at BinaryExpressionStateMachine.onOperator ([node_modules_path]\typescript\lib\tsserver.js:77968:29)
    at Array.operator ([node_modules_path]\typescript\lib\tsserver.js:29980:21)
    at trampoline ([node_modules_path]\typescript\lib\tsserver.js:30095:52)
    at [node_modules_path]\typescript\lib\tsserver.js:77920:30
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:79010:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)
    at getReturnTypeFromBody ([node_modules_path]\typescript\lib\tsserver.js:76902:29)
    at resolveTypeOfAccessors ([node_modules_path]\typescript\lib\tsserver.js:55884:42)
    at getTypeOfAccessorsWorker ([node_modules_path]\typescript\lib\tsserver.js:55844:24)
    at getTypeOfSetAccessor ([node_modules_path]\typescript\lib\tsserver.js:55837:58)
    at getSetAccessorTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56062:28)
    at getWriteTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56058:20)
    at createUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58447:33)
    at getUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58499:28)
    at getPropertyOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:58508:28)
    at getPropertiesOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:57930:48)
    at getReducedType ([node_modules_path]\typescript\lib\tsserver.js:58525:34)
    at getNormalizedType ([node_modules_path]\typescript\lib\tsserver.js:63777:74)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64128:30)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64791:42)
    at recursiveTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64688:30)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64200:25)
    at checkTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63815:26)
    at isTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63766:24)
    at isTypeAssignableTo ([node_modules_path]\typescript\lib\tsserver.js:62973:20)
    at isTypeAssignableToKind ([node_modules_path]\typescript\lib\tsserver.js:77605:53)
    at allTypesAssignableToKind ([node_modules_path]\typescript\lib\tsserver.js:77616:17)
    at getPromisedTypeOfPromise ([node_modules_path]\typescript\lib\tsserver.js:80261:17)
    at getAwaitedTypeOfPromise ([node_modules_path]\typescript\lib\tsserver.js:80232:32)
    at helper ([node_modules_path]\typescript\lib\tsserver.js:81671:35)
    at checkTestingKnownTruthyCallableOrAwaitableType ([node_modules_path]\typescript\lib\tsserver.js:81651:13)
    at BinaryExpressionStateMachine.onOperator ([node_modules_path]\typescript\lib\tsserver.js:77968:29)
    at Array.operator ([node_modules_path]\typescript\lib\tsserver.js:29980:21)
    at trampoline ([node_modules_path]\typescript\lib\tsserver.js:30095:52)
    at [node_modules_path]\typescript\lib\tsserver.js:77920:30
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:79010:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)

@RyanCavanaugh
Copy link
Member

when there's a trampoline frame in your overflow stack... 😔

@DanielRosenwasser
Copy link
Member

Aww ):

Here's one to make you feel better (:

class MyThing {
  get myProp() {
    return Promise[this];
  }
}
<semantic> Response received: encodedSemanticClassifications-full (781). Request took 131 ms. Success: false . Message: Error processing request. Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64162:21)
    at typeRelatedToSomeType ([node_modules_path]\typescript\lib\tsserver.js:64460:35)
    at unionOrIntersectionRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64406:28)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64771:34)
    at recursiveTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64688:30)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64200:25)
    at checkTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63815:26)
    at isTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63766:24)
    at isTypeAssignableTo ([node_modules_path]\typescript\lib\tsserver.js:62973:20)
    at checkIndexedAccessIndexType ([node_modules_path]\typescript\lib\tsserver.js:79768:17)
    at checkElementAccessExpression ([node_modules_path]\typescript\lib\tsserver.js:74312:20)
    at checkIndexedAccess ([node_modules_path]\typescript\lib\tsserver.js:74289:17)
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:78971:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)
    at getReturnTypeFromBody ([node_modules_path]\typescript\lib\tsserver.js:76902:29)
    at resolveTypeOfAccessors ([node_modules_path]\typescript\lib\tsserver.js:55884:42)
    at getTypeOfAccessorsWorker ([node_modules_path]\typescript\lib\tsserver.js:55844:24)
    at getTypeOfSetAccessor ([node_modules_path]\typescript\lib\tsserver.js:55837:58)
    at getSetAccessorTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56062:28)
    at getWriteTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56058:20)
    at createUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58447:33)
    at getUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58499:28)
    at getPropertyOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:58508:28)
    at getPropertiesOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:57930:48)
    at getReducedType ([node_modules_path]\typescript\lib\tsserver.js:58525:34)
    at getNormalizedType ([node_modules_path]\typescript\lib\tsserver.js:63777:74)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64128:30)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64791:42)
    at recursiveTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64688:30)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64200:25)
    at checkTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63815:26)
    at isTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63766:24)
    at isTypeAssignableTo ([node_modules_path]\typescript\lib\tsserver.js:62973:20)
    at checkIndexedAccessIndexType ([node_modules_path]\typescript\lib\tsserver.js:79768:17)
    at checkElementAccessExpression ([node_modules_path]\typescript\lib\tsserver.js:74312:20)
    at checkIndexedAccess ([node_modules_path]\typescript\lib\tsserver.js:74289:17)
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:78971:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)
    at getReturnTypeFromBody ([node_modules_path]\typescript\lib\tsserver.js:76902:29)
    at resolveTypeOfAccessors ([node_modules_path]\typescript\lib\tsserver.js:55884:42)
    at getTypeOfAccessorsWorker ([node_modules_path]\typescript\lib\tsserver.js:55844:24)
    at getTypeOfSetAccessor ([node_modules_path]\typescript\lib\tsserver.js:55837:58)
    at getSetAccessorTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56062:28)
    at getWriteTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56058:20)
    at createUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58447:33)
    at getUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58499:28)
    at getPropertyOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:58508:28)
    at getPropertiesOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:57930:48)
    at getReducedType ([node_modules_path]\typescript\lib\tsserver.js:58525:34)
    at getNormalizedType ([node_modules_path]\typescript\lib\tsserver.js:63777:74)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64128:30)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64791:42)
    at recursiveTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64688:30)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64200:25)
    at checkTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63815:26)
    at isTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:63766:24)
    at isTypeAssignableTo ([node_modules_path]\typescript\lib\tsserver.js:62973:20)
    at checkIndexedAccessIndexType ([node_modules_path]\typescript\lib\tsserver.js:79768:17)
    at checkElementAccessExpression ([node_modules_path]\typescript\lib\tsserver.js:74312:20)
    at checkIndexedAccess ([node_modules_path]\typescript\lib\tsserver.js:74289:17)
    at checkExpressionWorker ([node_modules_path]\typescript\lib\tsserver.js:78971:28)
    at checkExpression ([node_modules_path]\typescript\lib\tsserver.js:78882:38)
    at checkExpressionCached ([node_modules_path]\typescript\lib\tsserver.js:78546:38)
    at [node_modules_path]\typescript\lib\tsserver.js:77098:32
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15409:28)
    at visitNodes ([node_modules_path]\typescript\lib\tsserver.js:30155:30)
    at Object.forEachChild ([node_modules_path]\typescript\lib\tsserver.js:30431:24)
    at traverse ([node_modules_path]\typescript\lib\tsserver.js:15425:31)
    at Object.forEachReturnStatement ([node_modules_path]\typescript\lib\tsserver.js:15405:16)
    at checkAndAggregateReturnExpressionTypes ([node_modules_path]\typescript\lib\tsserver.js:77095:16)
    at getReturnTypeFromBody ([node_modules_path]\typescript\lib\tsserver.js:76902:29)
    at resolveTypeOfAccessors ([node_modules_path]\typescript\lib\tsserver.js:55884:42)
    at getTypeOfAccessorsWorker ([node_modules_path]\typescript\lib\tsserver.js:55844:24)
    at getTypeOfSetAccessor ([node_modules_path]\typescript\lib\tsserver.js:55837:58)
    at getSetAccessorTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56062:28)
    at getWriteTypeOfSymbol ([node_modules_path]\typescript\lib\tsserver.js:56058:20)
    at createUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58447:33)
    at getUnionOrIntersectionProperty ([node_modules_path]\typescript\lib\tsserver.js:58499:28)
    at getPropertyOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:58508:28)
    at getPropertiesOfUnionOrIntersectionType ([node_modules_path]\typescript\lib\tsserver.js:57930:48)
    at getReducedType ([node_modules_path]\typescript\lib\tsserver.js:58525:34)
    at getNormalizedType ([node_modules_path]\typescript\lib\tsserver.js:63777:74)
    at isRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64128:30)
    at structuredTypeRelatedTo ([node_modules_path]\typescript\lib\tsserver.js:64791:42)

@gabritto
Copy link
Member

Good news: it appears this bug has been fixed by #48459. This means it should be fixed in the current nightly, and from TS 4.7 onwards. @erik-krogh if you find the issue is still happening in those versions, please let us know and we can re-open the issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug A bug in TypeScript
Projects
None yet
Development

No branches or pull requests

4 participants