Skip to content

fix(parser): break extends clause loop on fatal error#22517

Merged
graphite-app[bot] merged 1 commit into
mainfrom
fix-parser-extends-fatal-loop
May 18, 2026
Merged

fix(parser): break extends clause loop on fatal error#22517
graphite-app[bot] merged 1 commit into
mainfrom
fix-parser-extends-fatal-loop

Conversation

@Boshen

@Boshen Boshen commented May 18, 2026

Copy link
Copy Markdown
Member

Summary

parse_extends_clause kept iterating after parse_lhs_expression_or_higher set a fatal error, producing a TSInterfaceHeritage with an inverted span (start > end). parse_class then passed that span to classes_can_only_extend_single_class, which panicked in miette when converting the span to a label (debug_assert!(self.start <= self.end) in Span::size). Release builds silently produced garbage diagnostics.

Repro from the issue:

class extends,{

Closes #22515

🤖 Generated with Claude Code

@github-actions github-actions Bot added the A-parser Area - Parser label May 18, 2026
@codspeed-hq

codspeed-hq Bot commented May 18, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 48 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing fix-parser-extends-fatal-loop (55912f5) with main (e9ec7c6)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@Boshen Boshen added the 0-merge Merge with Graphite Merge Queue label May 18, 2026

Boshen commented May 18, 2026

Copy link
Copy Markdown
Member Author

Merge activity

## Summary

`parse_extends_clause` kept iterating after `parse_lhs_expression_or_higher` set a fatal error, producing a `TSInterfaceHeritage` with an inverted span (`start > end`). `parse_class` then passed that span to `classes_can_only_extend_single_class`, which panicked in `miette` when converting the span to a label (`debug_assert!(self.start <= self.end)` in `Span::size`). Release builds silently produced garbage diagnostics.

Repro from the issue:

```js
class extends,{
```

Closes #22515

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app graphite-app Bot force-pushed the fix-parser-extends-fatal-loop branch from 55912f5 to e431a0e Compare May 18, 2026 05:50
@graphite-app graphite-app Bot merged commit e431a0e into main May 18, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label May 18, 2026
@graphite-app graphite-app Bot deleted the fix-parser-extends-fatal-loop branch May 18, 2026 05:54
camc314 pushed a commit that referenced this pull request May 18, 2026
### 🐛 Bug Fixes

- 0f26de6 ecmascript: Resolve identifier value type via tracked
constants (#22234) (Alexander Lichter)
- c27a8cf minifier: Normalize `{ x: x }` shorthand so adjacent-if merge
is idempotent (#22401) (Dunqing)
- e431a0e parser: Break extends clause loop on fatal error (#22517)
(Boshen)
- e9ec7c6 minifier: Fold optional chains by base nullishness (#22236)
(Alexander Lichter)
- e6090e7 transformer: Keep enum IIFE when a non-inlinable value
reference remains (#22501) (Dunqing)
- 931b7d6 transformer: Inline const enum members through type-cast
wrappers (#22500) (Dunqing)
- b9615b2 codegen: Preserve string quotes in require() calls during
minification (#22475) (zennnnnnn11)
- c73c159 transformer/async-to-generator: Reparent parameter initializer
scopes (#22507) (camc314)
- ecfd3ca transformer/async-to-generator: Move only parameter bindings
(#22503) (camc314)
- 3ce3431 transformer/explicit-resource-managment: Preserve shadowed
for-head block (#22451) (camc314)

### ⚡ Performance

- ce92c6c semantic: `#[inline]` `Scoping::get_binding` (#22414)
(Dunqing)
- 98be95c regular_expression: Track regex flags via bitflags (#22427)
(Boshen)
- dbbc059 jsdoc: Skip should_attach_jsdoc when no remaining comments
(#22409) (Boshen)
- 217d7d8 minifier: Index `SymbolValues` by `SymbolId` (#22441)
(Dunqing)
- d782b78 minifier: Use BitSet for LiveUsageCollector live references
(#22425) (Boshen)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-parser Area - Parser

Projects

None yet

Development

Successfully merging this pull request may close these issues.

parsing certain invalid code in debug profile leads to "assertion failed: self.start <= self.end"

1 participant