{"record":{"id":"b339fce400de03ca","repo":"karatelabs/karate","slug":"break-references-an-undefined-label-target","errorCode":null,"errorMessage":"break references an undefined label: ${target}","messagePattern":"break references an undefined label: (.+?)","errorType":"exception","errorClass":"ParserException","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/parser/JsParser.java","lineNumber":415,"sourceCode":"     */\n    private Label labelNodeChecks(Node node, Label labels) {\n        switch (node.type) {\n            case LABELLED_STMT -> {\n                String name = node.getFirst().getText();\n                if (Label.contains(labels, name, false)) {\n                    throw new ParserException(\"label already in scope: \" + name);\n                }\n                return new Label(name, labelsIterationStatement(node), labels);\n            }\n            // §15.7.1 makes a static initialization block a boundary of the same kind\n            // as a function body: nothing inside it may name a label outside it.\n            case FN_EXPR, FN_ARROW_EXPR, CLASS_STATIC_BLOCK -> {\n                return null;\n            }\n            case BREAK_STMT -> {\n                String target = labelReference(node);\n                if (target != null && !Label.contains(labels, target, false)) {\n                    throw new ParserException(\"break references an undefined label: \" + target);\n                }\n            }\n            case CONTINUE_STMT -> {\n                String target = labelReference(node);\n                if (target != null) {\n                    if (!Label.contains(labels, target, false)) {\n                        throw new ParserException(\"continue references an undefined label: \" + target);\n                    }\n                    if (!Label.contains(labels, target, true)) {\n                        throw new ParserException(\"continue label does not name a loop: \" + target);\n                    }\n                }\n            }\n            default -> {\n            }\n        }\n        return labels;\n    }","sourceCodeStart":397,"sourceCodeEnd":433,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/parser/JsParser.java#L397-L433","documentation":"`break someLabel;` must reference a label that is actually in scope at the break site. Karate resolves label references at parse time in labelNodeChecks; if a BREAK_STMT names a target not present in the current Label chain (function bodies and static blocks truncate the chain), this early error is thrown.","triggerScenarios":"`break outer;` where no label named `outer` exists, or where `outer` is defined outside the enclosing function/arrow/static block (chain is reset to null there). Also plain `break outer` in non-loop labeled blocks where the label was never declared.","commonSituations":"Typos in label names; moving a `break label` into an extracted function or callback so the label is no longer visible; deleting the labeled loop but keeping the break.","solutions":["Fix the label name to match an in-scope labeled statement","Remove the label from the break (`break;`) if only the innermost loop/block should be exited","Restructure so the labeled statement and the break live in the same function body (labels do not cross function boundaries)"],"exampleFix":"// before\nfunction f() { outer: for (;;) { g(); } }\nfunction g() { break outer; } // invalid\n// after\nfunction f() { outer: for (;;) { break outer; } }","handlingStrategy":"validation","validationCode":"// Check every `break X` has a visible label X in the same function:\nconst targets = [...src.matchAll(/break\\s+([A-Za-z_$][\\w$]*)/g)].map(m=>m[1]);\nconst declared = new Set([...src.matchAll(/([A-Za-z_$][\\w$]*):/g)].map(m=>m[1]));\nconst missing = targets.filter(t => !declared.has(t));","typeGuard":null,"tryCatchPattern":"try { eval(js); } catch (e) { if (String(e).includes('break references an undefined label')) { /* fix or remove the label target */ } throw e; }","preventionTips":["Grep `break <ident>` against declared labels before running","Keep `break label` and its label in the same function body","Prefer plain `break` unless multi-level exit is required"],"tags":["javascript","parser","labels","break"],"backgroundTag":"undefined-label-reference","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}