{"record":{"id":"7e5caf16292f7b0f","repo":"golang/go","slug":"missing-pattern-in-pattern-value","errorCode":null,"errorMessage":"missing <pattern> in <pattern>=<value>","messagePattern":"missing <pattern> in <pattern>=<value>","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/go/internal/load/flag.go","lineNumber":61,"sourceCode":"func (f *PerPackageFlag) set(v, cwd string) error {\n\tf.raw = v\n\tf.present = true\n\tmatch := func(_ *modload.Loader, p *Package) bool { return p.Internal.CmdlinePkg || p.Internal.CmdlineFiles } // default predicate with no pattern\n\t// For backwards compatibility with earlier flag splitting, ignore spaces around flags.\n\tv = strings.TrimSpace(v)\n\tif v == \"\" {\n\t\t// Special case: -gcflags=\"\" means no flags for command-line arguments\n\t\t// (overrides previous -gcflags=\"-whatever\").\n\t\tf.values = append(f.values, ppfValue{match, []string{}})\n\t\treturn nil\n\t}\n\tif !strings.HasPrefix(v, \"-\") {\n\t\ti := strings.Index(v, \"=\")\n\t\tif i < 0 {\n\t\t\treturn fmt.Errorf(\"missing =<value> in <pattern>=<value>\")\n\t\t}\n\t\tif i == 0 {\n\t\t\treturn fmt.Errorf(\"missing <pattern> in <pattern>=<value>\")\n\t\t}\n\t\tif v[0] == '\\'' || v[0] == '\"' {\n\t\t\treturn fmt.Errorf(\"parameter may not start with quote character %c\", v[0])\n\t\t}\n\t\tpattern := strings.TrimSpace(v[:i])\n\t\tmatch = MatchPackage(pattern, cwd)\n\t\tv = v[i+1:]\n\t}\n\tflags, err := quoted.Split(v)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif flags == nil {\n\t\tflags = []string{}\n\t}\n\tf.values = append(f.values, ppfValue{match, flags})\n\treturn nil\n}","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/load/flag.go#L43-L79","documentation":"The per-package flag parser found '=' at position 0 of the trimmed value, meaning the pattern (left side of '=') is empty. A non-empty pattern is required to know which packages the flags should apply to. This is a distinct error from a missing '=' entirely — here the '=' exists but nothing precedes it.","triggerScenarios":"Passing -gcflags==\"-N -l\" (double =, so the value starts with =) or -ldflags==-s -w. The strings.Index returns 0, indicating the pattern portion before '=' is empty.","commonSituations":"Typos in shell commands producing a leading '='. Accidental double '=' from copy-pasting. Misunderstanding that an empty pattern is invalid — use a leading '-' on the flags instead for command-line packages.","solutions":["Provide a non-empty pattern before the '=': use '.' for the current directory or './...' for all packages.","Alternatively, if you want flags for all command-line packages, use the leading '-' form: -gcflags=\"-N -l\".","Check for accidental double '=' in shell commands."],"exampleFix":"// before — empty pattern (value starts with =)\ngo build -gcflags==\"-N -l\"\n// after — valid non-empty pattern\ngo build -gcflags=\".=-N -l\"","handlingStrategy":"validation","validationCode":"// Check that pattern is non-empty when using pattern=value form.\nfunc validatePerPackageFlag(v string) error {\n    v = strings.TrimSpace(v)\n    if v == \"\" || strings.HasPrefix(v, \"-\") {\n        return nil\n    }\n    i := strings.Index(v, \"=\")\n    if i < 0 {\n        return fmt.Errorf(\"missing =<value>: %q\", v)\n    }\n    if i == 0 {\n        return fmt.Errorf(\"missing <pattern> before =: %q\", v)\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never start the flag value with '=' — always provide a pattern.","Use '.' or './...' as a pattern if you want all packages.","Double-check shell commands for accidental double '=' characters."],"tags":["go","go-build","flags","gcflags","ldflags","configuration"],"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}