cmd/vendor: update to golang.org/x/tools@3ef68632

Mainly to pull in the bug fix in the structtag pass, where filenames
could sometimes be wrong. The bug wasn't present in 1.11, so it was a
regression and needs fixing before 1.12 is out.

Fixes #29130.

Change-Id: Ie9d9bff84873f34d748ebd8f056b6bc2ac822a55
Reviewed-on: https://go-review.googlesource.com/c/156378
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
index 5dee615..f925849 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go
@@ -3,10 +3,6 @@
 The analysis package defines the interface between a modular static
 analysis and an analysis driver program.
 
-
-THIS INTERFACE IS EXPERIMENTAL AND SUBJECT TO CHANGE.
-We aim to finalize it by November 2018.
-
 Background
 
 A static analysis is a function that inspects a package of Go code and
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
index 0f8abb5..dce1ef7 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go
@@ -490,7 +490,7 @@
 		offsets := arch.sizes.Offsetsof(fields)
 		elemoff := int(offsets[1])
 		for i := 0; i < int(tu.Len()); i++ {
-			cc = appendComponentsRecursive(arch, elem, cc, suffix+"_"+strconv.Itoa(i), i*elemoff)
+			cc = appendComponentsRecursive(arch, elem, cc, suffix+"_"+strconv.Itoa(i), off+i*elemoff)
 		}
 	}
 
@@ -514,7 +514,7 @@
 		for _, fld := range list {
 			t := pass.TypesInfo.Types[fld.Type].Type
 
-			// Work around github.com/golang/go/issues/28277.
+			// Work around https://golang.org/issue/28277.
 			if t == nil {
 				if ell, ok := fld.Type.(*ast.Ellipsis); ok {
 					t = types.NewSlice(pass.TypesInfo.Types[ell.Elt].Type)
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
index 0e6f269..833c9d7 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/bools/bools.go
@@ -45,7 +45,7 @@
 
 		// TODO(adonovan): this reports n(n-1)/2 errors for an
 		// expression e||...||e of depth n. Fix.
-		// See https://github.com/golang/go/issues/28086.
+		// See https://golang.org/issue/28086.
 		comm := op.commutativeSets(pass.TypesInfo, e)
 		for _, exprs := range comm {
 			op.checkRedundant(pass, exprs)
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
index 78133fe..2b67c37 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag/structtag.go
@@ -136,10 +136,23 @@
 		*seen = map[[2]string]token.Pos{}
 	}
 	if pos, ok := (*seen)[[2]string{key, val}]; ok {
-		posn := pass.Fset.Position(pos)
-		posn.Filename = filepath.Base(posn.Filename)
-		posn.Column = 0
-		pass.Reportf(nearest.Pos(), "struct field %s repeats %s tag %q also at %s", field.Name(), key, val, posn)
+		alsoPos := pass.Fset.Position(pos)
+		alsoPos.Column = 0
+
+		// Make the "also at" position relative to the current position,
+		// to ensure that all warnings are unambiguous and correct. For
+		// example, via anonymous struct fields, it's possible for the
+		// two fields to be in different packages and directories.
+		thisPos := pass.Fset.Position(field.Pos())
+		rel, err := filepath.Rel(filepath.Dir(thisPos.Filename), alsoPos.Filename)
+		if err != nil {
+			// Possibly because the paths are relative; leave the
+			// filename alone.
+		} else {
+			alsoPos.Filename = rel
+		}
+
+		pass.Reportf(nearest.Pos(), "struct field %s repeats %s tag %q also at %s", field.Name(), key, val, alsoPos)
 	} else {
 		(*seen)[[2]string{key, val}] = field.Pos()
 	}
diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
index 018191a..76dabc2 100644
--- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
+++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go
@@ -182,7 +182,7 @@
 }
 
 var importerForCompiler = func(_ *token.FileSet, compiler string, lookup importer.Lookup) types.Importer {
-	// broken legacy implementation (github.com/golang/go/issues/28995)
+	// broken legacy implementation (https://golang.org/issue/28995)
 	return importer.For(compiler, lookup)
 }