From: Austin Clements Date: Wed, 14 Apr 2021 17:25:31 +0000 (-0400) Subject: cmd/internal/objabi,test: use correct GOEXPERIMENT build tags in test/run.go X-Git-Tag: go1.17beta1~614 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d26fc68aa1;p=gostls13.git cmd/internal/objabi,test: use correct GOEXPERIMENT build tags in test/run.go Currently, run.go sets GOEXPERIMENT build tags based on the *difference* from the baseline experiment configuration, rather than the absolute experiment configuration. This differs from cmd/go. As a result, if we set a baseline configuration and don't override it with a GOEXPERIMENT setting, run.go won't set any GOEXPERIMENT build tags, instead of setting the tags corresponding to the baseline configuration. Fix this by making compile -V=goexperiment produce the full GOEXPERIMENT configuration, which run.go can then use to set exactly the right set of build tags. For #40724. Change-Id: Ieda6ea62f1a1fabbe8d749d6d09c198fd5ca8377 Reviewed-on: https://go-review.googlesource.com/c/go/+/310171 Trust: Austin Clements Run-TryBot: Austin Clements TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/internal/objabi/exp.go b/src/cmd/internal/objabi/exp.go index 9eb3e431b3..3371c6c8f8 100644 --- a/src/cmd/internal/objabi/exp.go +++ b/src/cmd/internal/objabi/exp.go @@ -108,8 +108,9 @@ func parseExperiments() goexperiment.Flags { // expList returns the list of lower-cased experiment names for // experiments that differ from base. base may be nil to indicate no -// experiments. -func expList(exp, base *goexperiment.Flags) []string { +// experiments. If all is true, then include all experiment flags, +// regardless of base. +func expList(exp, base *goexperiment.Flags, all bool) []string { var list []string rv := reflect.ValueOf(exp).Elem() var rBase reflect.Value @@ -124,7 +125,7 @@ func expList(exp, base *goexperiment.Flags) []string { if base != nil { baseVal = rBase.Field(i).Bool() } - if val != baseVal { + if all || val != baseVal { if val { list = append(list, name) } else { @@ -140,11 +141,11 @@ func expList(exp, base *goexperiment.Flags) []string { // GOEXPERIMENT is exactly what a user would set on the command line // to get the set of enabled experiments. func GOEXPERIMENT() string { - return strings.Join(expList(&Experiment, &experimentBaseline), ",") + return strings.Join(expList(&Experiment, &experimentBaseline, false), ",") } // EnabledExperiments returns a list of enabled experiments, as // lower-cased experiment names. func EnabledExperiments() []string { - return expList(&Experiment, nil) + return expList(&Experiment, nil, false) } diff --git a/src/cmd/internal/objabi/flag.go b/src/cmd/internal/objabi/flag.go index 6a8a69116d..9fcab4cc85 100644 --- a/src/cmd/internal/objabi/flag.go +++ b/src/cmd/internal/objabi/flag.go @@ -93,10 +93,16 @@ func (versionFlag) Set(s string) error { p := "" - // If the enabled experiments differ from the defaults, - // include that difference. - if goexperiment := GOEXPERIMENT(); goexperiment != "" { - p = " X:" + goexperiment + if s == "goexperiment" { + // test/run.go uses this to discover the full set of + // experiment tags. Report everything. + p = " X:" + strings.Join(expList(&Experiment, nil, true), ",") + } else { + // If the enabled experiments differ from the defaults, + // include that difference. + if goexperiment := GOEXPERIMENT(); goexperiment != "" { + p = " X:" + goexperiment + } } // The go command invokes -V=full to get a unique identifier diff --git a/test/run.go b/test/run.go index feab88338c..feec2b50be 100644 --- a/test/run.go +++ b/test/run.go @@ -376,6 +376,7 @@ type context struct { GOARCH string cgoEnabled bool noOptEnv bool + expTags map[string]bool // Set lazily } // shouldTest looks for build tags in a source file and returns @@ -445,26 +446,28 @@ func (ctxt *context) match(name string) bool { } } - exp := os.Getenv("GOEXPERIMENT") - if exp == "" { - // If GOEXPERIMENT environment variable is unset, get the default value - // that is baked into the toolchain. - cmd := exec.Command(goTool(), "tool", "compile", "-V") - out, err := cmd.CombinedOutput() - if err == nil { + if strings.HasPrefix(name, "goexperiment.") { + // Query goexperiment tags from the toolchain. + if ctxt.expTags == nil { + ctxt.expTags = make(map[string]bool) + cmd := exec.Command(goTool(), "tool", "compile", "-V=goexperiment") + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("failed to get GOEXPERIMENT configuration:\n%s", out) + } i := bytes.Index(out, []byte("X:")) if i != -1 { - exp = string(out[i+2:]) - } - } - } - if exp != "" { - experiments := strings.Split(exp, ",") - for _, e := range experiments { - if name == "goexperiment."+e { - return true + for _, exp := range strings.Split(string(out[i+2:]), ",") { + v := true + if strings.HasPrefix(exp, "no") { + v, exp = false, exp[2:] + } + ctxt.expTags["goexperiment."+exp] = v + } } } + + return ctxt.expTags[name] } if name == "cgo" && ctxt.cgoEnabled {