diff --git a/vendor/cmd/go/internal/list/list.go b/vendor/cmd/go/internal/list/list.go
index c5f0550..15ac82c 100644
--- a/vendor/cmd/go/internal/list/list.go
+++ b/vendor/cmd/go/internal/list/list.go
@@ -195,6 +195,7 @@
     type Module struct {
         Path     string       // module path
         Version  string       // module version
+        Versions []string     // available module versions (with -versions)
         Replace  *Module      // replaced by this module
         Time     *time.Time   // time version was created
         Update   *Module      // available update, if any (with -u)
@@ -240,6 +241,12 @@
 
 (For tools, 'go list -m -u -json all' may be more convenient to parse.)
 
+The -versions flag causes list to set the Module's Versions field
+to a list of all known versions of that module, ordered according
+to semantic versioning, earliest to latest. The flag also changes
+the default output format to display the module path followed by the
+space-separated version list.
+
 The arguments to list -m are interpreted as a list of modules, not packages.
 The main module is the module containing the current directory.
 The active modules are the main module and its dependencies.
@@ -273,15 +280,16 @@
 }
 
 var (
-	listCgo    = CmdList.Flag.Bool("cgo", false, "")
-	listDeps   = CmdList.Flag.Bool("deps", false, "")
-	listE      = CmdList.Flag.Bool("e", false, "")
-	listExport = CmdList.Flag.Bool("export", false, "")
-	listFmt    = CmdList.Flag.String("f", "", "")
-	listJson   = CmdList.Flag.Bool("json", false, "")
-	listM      = CmdList.Flag.Bool("m", false, "")
-	listU      = CmdList.Flag.Bool("u", false, "")
-	listTest   = CmdList.Flag.Bool("test", false, "")
+	listCgo      = CmdList.Flag.Bool("cgo", false, "")
+	listDeps     = CmdList.Flag.Bool("deps", false, "")
+	listE        = CmdList.Flag.Bool("e", false, "")
+	listExport   = CmdList.Flag.Bool("export", false, "")
+	listFmt      = CmdList.Flag.String("f", "", "")
+	listJson     = CmdList.Flag.Bool("json", false, "")
+	listM        = CmdList.Flag.Bool("m", false, "")
+	listU        = CmdList.Flag.Bool("u", false, "")
+	listTest     = CmdList.Flag.Bool("test", false, "")
+	listVersions = CmdList.Flag.Bool("versions", false, "")
 )
 
 var nl = []byte{'\n'}
@@ -294,6 +302,9 @@
 	if *listFmt == "" {
 		if *listM {
 			*listFmt = "{{.String}}"
+			if *listVersions {
+				*listFmt = `{{.Path}}{{range .Versions}} {{.}}{{end}}`
+			}
 		} else {
 			*listFmt = "{{.ImportPath}}"
 		}
@@ -363,12 +374,7 @@
 		}
 		vgo.LoadBuildList()
 
-		mods := vgo.ListModules(args)
-		if *listU {
-			for _, m := range mods {
-				vgo.AddUpdate(m)
-			}
-		}
+		mods := vgo.ListModules(args, *listU, *listVersions)
 		for _, m := range mods {
 			do(m)
 		}
@@ -379,6 +385,9 @@
 	if *listU {
 		base.Fatalf("go list -u can only be used with -m")
 	}
+	if *listVersions {
+		base.Fatalf("go list -versions can only be used with -m")
+	}
 
 	var pkgs []*load.Package
 	if *listE {
diff --git a/vendor/cmd/go/internal/modfetch/proxy.go b/vendor/cmd/go/internal/modfetch/proxy.go
index 419323b..25cad78 100644
--- a/vendor/cmd/go/internal/modfetch/proxy.go
+++ b/vendor/cmd/go/internal/modfetch/proxy.go
@@ -55,6 +55,7 @@
 			list = append(list, f[0])
 		}
 	}
+	SortVersions(list)
 	return list, nil
 }
 
diff --git a/vendor/cmd/go/internal/modinfo/info.go b/vendor/cmd/go/internal/modinfo/info.go
index 5a7d6bb..3920546 100644
--- a/vendor/cmd/go/internal/modinfo/info.go
+++ b/vendor/cmd/go/internal/modinfo/info.go
@@ -12,6 +12,7 @@
 type ModulePublic struct {
 	Path     string        `json:",omitempty"` // module path
 	Version  string        `json:",omitempty"` // module version
+	Versions []string      `json:",omitempty"` // available module versions
 	Replace  *ModulePublic `json:",omitempty"` // replaced by this module
 	Time     *time.Time    `json:",omitempty"` // time version was created
 	Update   *ModulePublic `json:",omitempty"` // available update (with -u)
diff --git a/vendor/cmd/go/internal/vgo/build.go b/vendor/cmd/go/internal/vgo/build.go
index 6afe336..ce06ee2 100644
--- a/vendor/cmd/go/internal/vgo/build.go
+++ b/vendor/cmd/go/internal/vgo/build.go
@@ -67,14 +67,7 @@
 	}
 }
 
-// AddUpdate fills in m.Update if an updated version is available.
-func AddUpdate(m *modinfo.ModulePublic) {
-	addUpdate(m)
-	if m.Replace != nil {
-		addUpdate(m.Replace)
-	}
-}
-
+// addUpdate fills in m.Update if an updated version is available.
 func addUpdate(m *modinfo.ModulePublic) {
 	if m.Version != "" {
 		if info, err := modfetch.Query(m.Path, "latest", allowed); err == nil && info.Version != m.Version {
@@ -87,6 +80,11 @@
 	}
 }
 
+// addVersions fills in m.Versions with the list of known versions.
+func addVersions(m *modinfo.ModulePublic) {
+	m.Versions, _ = versions(m.Path)
+}
+
 func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic {
 	if m == Target {
 		return &modinfo.ModulePublic{
diff --git a/vendor/cmd/go/internal/vgo/list.go b/vendor/cmd/go/internal/vgo/list.go
index c31e958..7470625 100644
--- a/vendor/cmd/go/internal/vgo/list.go
+++ b/vendor/cmd/go/internal/vgo/list.go
@@ -11,10 +11,34 @@
 
 	"cmd/go/internal/base"
 	"cmd/go/internal/modinfo"
+	"cmd/go/internal/par"
 	"cmd/go/internal/search"
 )
 
-func ListModules(args []string) []*modinfo.ModulePublic {
+func ListModules(args []string, listU, listVersions bool) []*modinfo.ModulePublic {
+	mods := listModules(args)
+	if listU || listVersions {
+		var work par.Work
+		for _, m := range mods {
+			work.Add(m)
+			if m.Replace != nil {
+				work.Add(m.Replace)
+			}
+		}
+		work.Do(10, func(item interface{}) {
+			m := item.(*modinfo.ModulePublic)
+			if listU {
+				addUpdate(m)
+			}
+			if listVersions {
+				addVersions(m)
+			}
+		})
+	}
+	return mods
+}
+
+func listModules(args []string) []*modinfo.ModulePublic {
 	LoadBuildList()
 	if len(args) == 0 {
 		return []*modinfo.ModulePublic{moduleInfo(buildList[0], true)}
@@ -52,7 +76,7 @@
 			}
 		}
 		if !matched {
-			fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies", arg)
+			fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies\n", arg)
 		}
 	}
 
diff --git a/vendor/cmd/go/vgo_test.go b/vendor/cmd/go/vgo_test.go
index 08d4e5e..52a6135 100644
--- a/vendor/cmd/go/vgo_test.go
+++ b/vendor/cmd/go/vgo_test.go
@@ -495,6 +495,12 @@
 	tg.run("-vgo", "list")
 	tg.grepStderr(`adding rsc.io/quote v1.5.2`, "should have added quote v1.5.2")
 	tg.grepStderrNot(`v1.5.3-pre1`, "should not mention v1.5.3-pre1")
+
+	tg.run("-vgo", "list", "-m", "-versions", "rsc.io/quote")
+	want := "rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1\n"
+	if tg.getStdout() != want {
+		t.Errorf("vgo list versions:\nhave:\n%s\nwant:\n%s", tg.getStdout(), want)
+	}
 }
 
 func TestVgoBadDomain(t *testing.T) {
