{"record":{"id":"90899f91d773d6fc","repo":"swc-project/swc","slug":"parser-internal-bug","errorCode":null,"errorMessage":"parser internal bug","messagePattern":"parser internal bug","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/swc_common/src/errors/mod.rs","lineNumber":662,"sourceCode":"        result.set_span(sp);\n        result\n    }\n\n    pub fn span_err_with_code<S: Into<MultiSpan>>(&self, sp: S, msg: &str, code: DiagnosticId) {\n        self.emit_with_code(&sp.into(), msg, code, Error);\n    }\n\n    pub fn span_warn<S: Into<MultiSpan>>(&self, sp: S, msg: &str) {\n        self.emit(&sp.into(), msg, Warning);\n    }\n\n    pub fn span_warn_with_code<S: Into<MultiSpan>>(&self, sp: S, msg: &str, code: DiagnosticId) {\n        self.emit_with_code(&sp.into(), msg, code, Warning);\n    }\n\n    pub fn span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> ! {\n        self.emit(&sp.into(), msg, Bug);\n        panic!(\"{}\", ExplicitBug);\n    }\n\n    pub fn delay_span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) {\n        if self.flags.treat_err_as_bug {\n            // FIXME: don't abort here if report_delayed_bugs is off\n            self.span_bug(sp, msg);\n        }\n        let mut diagnostic = Diagnostic::new(Level::Bug, msg);\n        diagnostic.set_span(sp.into());\n        self.delay_as_bug(diagnostic);\n    }\n\n    fn delay_as_bug(&self, diagnostic: Diagnostic) {\n        if self.flags.report_delayed_bugs {\n            DiagnosticBuilder::new_diagnostic(self, diagnostic.clone()).emit();\n        }\n        self.delayed_span_bugs.borrow_mut().push(diagnostic);\n    }","sourceCodeStart":644,"sourceCodeEnd":680,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_common/src/errors/mod.rs#L644-L680","documentation":"Handler::span_bug emits a diagnostic with Level::Bug at a given span and then panics with ExplicitBug, whose Display text is 'parser internal bug'. It marks an invariant violation: the parser or a transform reached a state its authors considered impossible. It is also reached indirectly via delay_span_bug when HandlerFlags::treat_err_as_bug is enabled.","triggerScenarios":"Parser/transform code calls span_bug on an impossible AST state; user code enables treat_err_as_bug so delayed bugs (delay_span_bug) escalate into immediate panics; fuzzing or adversarial input trips an unhandled grammar corner.","commonSituations":"Fuzzing SWC inputs, copying debug/test Handler flags (treat_err_as_bug) into production builds, upgrading to an swc_core version with a parser regression on exotic syntax, plugin code calling handler.span_bug directly.","solutions":["Disable the treat_err_as_bug Handler flag if it is set; it is intended for compiler development, not production","Upgrade swc_core/swc_ecma_parser to the latest patch release where the internal bug is likely fixed","Minimize the failing input and file an SWC issue with the bug-level diagnostic and span","Embedders: isolate compilation in std::panic::catch_unwind so one bad input cannot kill the service"],"exampleFix":"// before (debug flag leaked into production)\nlet handler = Handler::with_emitter_and_flags(\n    Box::new(emitter),\n    HandlerFlags { treat_err_as_bug: true, ..Default::default() },\n);\n\n// after\nlet handler = Handler::with_emitter_and_flags(\n    Box::new(emitter),\n    HandlerFlags::default(), // treat_err_as_bug = false\n);","handlingStrategy":"try-catch","validationCode":"// Rust: never enable compiler-dev flags in shipped builds\nassert!(!handler.flags.treat_err_as_bug,\n    \"treat_err_as_bug must stay off in production\");","typeGuard":null,"tryCatchPattern":"use std::panic::{catch_unwind, AssertUnwindSafe};\nuse swc_common::errors::ExplicitBug;\nlet result = catch_unwind(AssertUnwindSafe(|| transform(input)));\nif let Err(payload) = result {\n    if payload.downcast_ref::<ExplicitBug>().is_some() {\n        // internal bug: skip input, keep service alive, report upstream\n    }\n}","preventionTips":["Keep treat_err_as_bug disabled outside compiler development","Pin a known-good swc_core version and upgrade deliberately","Fuzz-test inputs before feeding them to production compiles"],"tags":["parser","internal-bug","panic","compiler-flags","fuzzing"],"backgroundTag":"compiler-internal-panic","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}