{"record":{"id":"5debd6a0a1da55b6","repo":"golang/go","slug":"empty-condition","errorCode":null,"errorMessage":"empty condition","messagePattern":"empty condition","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/internal/script/engine.go","lineNumber":385,"sourceCode":"\t\t\tswitch want := expectedStatus(arg); want {\n\t\t\tcase failure, successOrFailure:\n\t\t\t\tif cmd.want != \"\" {\n\t\t\t\t\treturn errors.New(\"duplicated '!' or '?' token\")\n\t\t\t\t}\n\t\t\t\tcmd.want = want\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\t// Command prefix [cond] means only run this command if cond is satisfied.\n\t\t\tif strings.HasPrefix(arg, \"[\") && strings.HasSuffix(arg, \"]\") {\n\t\t\t\twant := true\n\t\t\t\targ = strings.TrimSpace(arg[1 : len(arg)-1])\n\t\t\t\tif strings.HasPrefix(arg, \"!\") {\n\t\t\t\t\twant = false\n\t\t\t\t\targ = strings.TrimSpace(arg[1:])\n\t\t\t\t}\n\t\t\t\tif arg == \"\" {\n\t\t\t\t\treturn errors.New(\"empty condition\")\n\t\t\t\t}\n\t\t\t\tcmd.conds = append(cmd.conds, condition{want: want, tag: arg})\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif arg == \"\" {\n\t\t\t\treturn errors.New(\"empty command\")\n\t\t\t}\n\t\t\tcmd.name = arg\n\t\t\treturn nil\n\t\t}\n\n\t\tcmd.rawArgs = append(cmd.rawArgs, rawArg)\n\t\treturn nil\n\t}\n\n\tfor i := 0; ; i++ {\n\t\tif !quoted && (i >= len(line) || strings.ContainsRune(argSepChars, rune(line[i]))) {","sourceCodeStart":367,"sourceCodeEnd":403,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/internal/script/engine.go#L367-L403","documentation":"Thrown by the script parser when a condition bracket token contains nothing after stripping brackets and an optional '!' negation. Conditions take the form [name] or [!name]; an empty interior ([], [!], [ ]) has no condition to evaluate and is rejected at parse time as a syntax error.","triggerScenarios":"A script line containing `[]`, `[ ]`, `[!]`, or `[ ! ]` as a command-prefix token. After trimming, arg == \"\" trips the guard in flushArg.","commonSituations":"Script-test author writes a condition placeholder and forgets to fill in the condition name, or accidentally empties a condition during editing, or leaves a stray `[!]` negation with no condition.","solutions":["Provide a real registered condition name inside the brackets, e.g. `[go1.21]` or `[exec:go]`.","If negating, keep the name: `[!symlink]` not `[!]`.","Remove the empty bracket token entirely if no condition is intended."],"exampleFix":"// before\n[ ] go test ./...\n# -> empty condition\n\n// after\n[go1.22] go test ./...","handlingStrategy":"validation","validationCode":"// Reject empty condition brackets in a script line.\nfunc checkCondition(token string) error {\n    if strings.HasPrefix(token, \"[\") && strings.HasSuffix(token, \"]\") {\n        inner := strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(token, \"[\"), \"]\"))\n        inner = strings.TrimPrefix(inner, \"!\")\n        if strings.TrimSpace(inner) == \"\" { return errors.New(\"empty condition\") }\n    }\n    return nil\n}","typeGuard":"func isEmptyCondition(err error) bool {\n    return err != nil && err.Error() == \"empty condition\"\n}","tryCatchPattern":"// Static-lint script lines for [], [ ], [!], [ ! ].","preventionTips":["Always put a registered condition name inside brackets.","Keep the '!' directly attached to the name when negating.","Lint for empty brackets in script tests."],"tags":["script","parser","test-framework","syntax-error","conditions"],"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}