Skip to content

Stackoverflow when compiling a specific getter method #48248

New issue

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

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

Already on GitHub? # to your account

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.

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

No branches or pull requests

4 participants