{"record":{"id":"d2ff8dd80d63f770","repo":"golang/go","slug":"condition-q-cannot-be-used-with-a-suffix","errorCode":null,"errorMessage":"condition %q cannot be used with a suffix","messagePattern":"condition %q cannot be used with a suffix","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/internal/script/engine.go","lineNumber":524,"sourceCode":"\t\t\tb.WriteString(\"'\")\n\t\t} else {\n\t\t\tb.WriteString(arg)\n\t\t}\n\t}\n\treturn b.String()\n}\n\nfunc (e *Engine) conditionsActive(s *State, conds []condition) (bool, error) {\n\tfor _, cond := range conds {\n\t\tvar impl Cond\n\t\tprefix, suffix, ok := strings.Cut(cond.tag, \":\")\n\t\tif ok {\n\t\t\timpl = e.Conds[prefix]\n\t\t\tif impl == nil {\n\t\t\t\treturn false, fmt.Errorf(\"unknown condition prefix %q; known: %v\", prefix, slices.Collect(maps.Keys(e.Conds)))\n\t\t\t}\n\t\t\tif !impl.Usage().Prefix {\n\t\t\t\treturn false, fmt.Errorf(\"condition %q cannot be used with a suffix\", prefix)\n\t\t\t}\n\t\t} else {\n\t\t\timpl = e.Conds[cond.tag]\n\t\t\tif impl == nil {\n\t\t\t\treturn false, fmt.Errorf(\"unknown condition %q\", cond.tag)\n\t\t\t}\n\t\t\tif impl.Usage().Prefix {\n\t\t\t\treturn false, fmt.Errorf(\"condition %q requires a suffix\", cond.tag)\n\t\t\t}\n\t\t}\n\t\tactive, err := impl.Eval(s, suffix)\n\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"evaluating condition %q: %w\", cond.tag, err)\n\t\t}\n\t\tif active != cond.want {\n\t\t\treturn false, nil\n\t\t}","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/internal/script/engine.go#L506-L542","documentation":"Thrown by Engine.conditionsActive when a condition registered as a non-prefix Cond (Condition, BoolCondition, OnceCondition) is used with a ':suffix' in a bracket. These condition types have Prefix==false and explicitly reject suffixes (they return ErrUsage for non-empty suffix). The check at engine.go:523-525 fires before Eval.","triggerScenarios":"Writing [root:foo], [cgo:enabled], [symlink:yes] — root/cgo/symlink are bool or simple conditions that take no suffix.","commonSituations":"Assuming every condition takes a suffix; confusing a prefix condition (GOOS, GOARCH, GODEBUG) with a boolean one (root, cgo, go-builder); typo appending ':value' to a bool condition.","solutions":["Remove the suffix from the bracket — use [cgo] not [cgo:enabled].","Consult the condition's summary via 'help' to confirm whether it is a prefix condition.","If you need a parameterized variant, register a custom PrefixCondition with a distinct name."],"exampleFix":"// before\n[cgo:enabled] exec go build\n// after\n[cgo] exec go build","handlingStrategy":"validation","validationCode":"// Verify a condition accepts a suffix before writing [prefix:value].\nfunc acceptsSuffix(conds map[string]script.Cond, prefix string) bool {\n    c, ok := conds[prefix]\n    return ok && c.Usage().Prefix\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Bool/simple conditions (root, cgo, go-builder) never take a suffix.","Check the condition's summary via 'help' — prefix conditions show [name:*]."],"tags":["go-script-test","conditions","go-toolchain"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}