Skip to content

SemanticBuilder::build() panics with index out of bounds when called twice on the same AST #20915

@abhirag

Description

@abhirag

Minimal reproducible example:

use oxc::{allocator::Allocator, parser::Parser, semantic::SemanticBuilder, span::SourceType};

fn main() {
    let source = "export const X = class Base {};";
    let allocator = Allocator::default();

    let parse = Parser::new(&allocator, source, SourceType::ts()).parse();
    println!("parse errors: {}", parse.errors.len());

    let semantic = SemanticBuilder::new()
        .with_check_syntax_error(true)
        .build(&parse.program);
    println!("first semantic pass errors: {}", semantic.errors.len());

    let semantic = SemanticBuilder::new()
        .with_check_syntax_error(true)
        .build(&parse.program);
    println!("second semantic pass errors: {}", semantic.errors.len());

    println!("semantic build completed");
}

Reproduced on 0.123.0:

[dependencies]
oxc = { version = "0.123.0", features = ["semantic"] }

Observed stack-trace for 0.123.0:

parse errors: 0
first semantic pass errors: 0

thread 'main' (10275305) panicked at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/scoping.rs:56:1:
index out of bounds
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/e408947bfd200af42db322daf0fadfe7e26d3bd1/library/std/src/panicking.rs:689:5
   1: core::panicking::panic_fmt
             at /rustc/e408947bfd200af42db322daf0fadfe7e26d3bd1/library/core/src/panicking.rs:80:14
   2: oxc_semantic::scoping::SymbolTable::checked_idx
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/multi_index_vec.rs:232:17
   3: oxc_semantic::scoping::SymbolTable::symbol_flags
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/multi_index_vec.rs:240:36
   4: oxc_semantic::scoping::Scoping::symbol_flags
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/scoping.rs:352:28
   5: oxc_semantic::checker::javascript::is_current_node_ambient_binding
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/checker/javascript.rs:193:24
   6: oxc_semantic::checker::javascript::check_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/checker/javascript.rs:158:54
   7: oxc_semantic::checker::check
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/checker/mod.rs:27:13
   8: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::leave_node
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:678:13
   9: oxc_ast_visit::generated::visit::walk::walk_binding_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:1458:17
  10: oxc_ast_visit::generated::visit::Visit::visit_binding_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:65:9
  11: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_class
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:778:18
  12: oxc_ast_visit::generated::visit::walk::walk_expression
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:1398:56
  13: oxc_ast_visit::generated::visit::Visit::visit_expression
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:50:9
  14: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_variable_declarator
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:2253:18
  15: oxc_ast_visit::generated::visit::walk::walk_variable_declarators
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:4324:21
  16: oxc_ast_visit::generated::visit::Visit::visit_variable_declarators
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:1249:9
  17: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_variable_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:2536:14
  18: oxc_ast_visit::generated::visit::walk::walk_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:2061:61
  19: oxc_ast_visit::generated::visit::Visit::visit_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:321:9
  20: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_export_named_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:2100:18
  21: oxc_ast_visit::generated::visit::walk::walk_module_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:2673:25
  22: oxc_ast_visit::generated::visit::Visit::visit_module_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:546:9
  23: oxc_ast_visit::generated::visit::walk::walk_statement
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:2025:25
  24: oxc_ast_visit::generated::visit::Visit::visit_statement
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:301:9
  25: oxc_ast_visit::generated::visit::walk::walk_statements
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:4253:21
  26: oxc_ast_visit::generated::visit::Visit::visit_statements
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.123.0/src/generated/visit.rs:1214:9
  27: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_program
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:727:14
  28: oxc_semantic::builder::SemanticBuilder::build
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.123.0/src/builder.rs:275:14
  29: oxc_repro::main
             at ./lib/oxc-repro/src/main.rs:17:10
  30: core::ops::function::FnOnce::call_once
             at /Users/abhirag/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Initially reproduced on 0.112.0 with stack-trace:

parse errors: 0
first semantic pass errors: 0

thread 'main' (10309725) panicked at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_index-4.1.0/src/indexing.rs:38:10:
index out of bounds: the len is 1 but the index is 1
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/e408947bfd200af42db322daf0fadfe7e26d3bd1/library/std/src/panicking.rs:689:5
   1: core::panicking::panic_fmt
             at /rustc/e408947bfd200af42db322daf0fadfe7e26d3bd1/library/core/src/panicking.rs:80:14
   2: core::panicking::panic_bounds_check
             at /rustc/e408947bfd200af42db322daf0fadfe7e26d3bd1/library/core/src/panicking.rs:271:5
   3: <I as oxc_index::indexing::IdxSliceIndex<I,T>>::index
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_index-4.1.0/src/indexing.rs:38:10
   4: oxc_index::indexing::<impl core::ops::index::Index<R> for oxc_index::idxslice::IndexSlice<I,[T]>>::index
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_index-4.1.0/src/indexing.rs:201:15
   5: oxc_semantic::scoping::Scoping::symbol_flags
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/scoping.rs:331:26
   6: oxc_semantic::checker::javascript::is_current_node_ambient_binding
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/checker/javascript.rs:149:24
   7: oxc_semantic::checker::javascript::check_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/checker/javascript.rs:114:54
   8: oxc_semantic::checker::check
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/checker/mod.rs:26:13
   9: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::leave_node
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:643:13
  10: oxc_ast_visit::generated::visit::walk::walk_binding_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:1458:17
  11: oxc_ast_visit::generated::visit::Visit::visit_binding_identifier
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:65:9
  12: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_class
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:745:18
  13: oxc_ast_visit::generated::visit::walk::walk_expression
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:1398:56
  14: oxc_ast_visit::generated::visit::Visit::visit_expression
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:50:9
  15: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_variable_declarator
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:2205:18
  16: oxc_ast_visit::generated::visit::walk::walk_variable_declarators
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:4323:21
  17: oxc_ast_visit::generated::visit::Visit::visit_variable_declarators
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:1249:9
  18: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_variable_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:2487:14
  19: oxc_ast_visit::generated::visit::walk::walk_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:2061:61
  20: oxc_ast_visit::generated::visit::Visit::visit_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:321:9
  21: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_export_named_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:2057:18
  22: oxc_ast_visit::generated::visit::walk::walk_module_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:2672:25
  23: oxc_ast_visit::generated::visit::Visit::visit_module_declaration
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:546:9
  24: oxc_ast_visit::generated::visit::walk::walk_statement
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:2025:25
  25: oxc_ast_visit::generated::visit::Visit::visit_statement
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:301:9
  26: oxc_ast_visit::generated::visit::walk::walk_statements
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:4252:21
  27: oxc_ast_visit::generated::visit::Visit::visit_statements
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_ast_visit-0.112.0/src/generated/visit.rs:1214:9
  28: <oxc_semantic::builder::SemanticBuilder as oxc_ast_visit::generated::visit::Visit>::visit_program
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:692:14
  29: oxc_semantic::builder::SemanticBuilder::build
             at /Users/abhirag/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/oxc_semantic-0.112.0/src/builder.rs:263:14
  30: oxc_check::main
             at ./lib/bombadil/src/bin/oxc_check.rs:17:10
  31: core::ops::function::FnOnce::call_once
             at /Users/abhirag/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Priority

None yet

Effort

None yet

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions