From ef6fde26e5cac06c0dbd4ffe628a3ecd2ef7c450 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 21 Jul 2016 11:40:01 -0700 Subject: [PATCH] cmd/vet: handle multiple arches in asm build directives If a build directive contains multiple arches, try to match the build context. Updates #11041 Change-Id: I03b5d7bfb29d1ff6c7d36a9d7c7fabfcc1d871c1 Reviewed-on: https://go-review.googlesource.com/27158 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/vet/asmdecl.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/cmd/vet/asmdecl.go b/src/cmd/vet/asmdecl.go index 41faa035a6..e228495071 100644 --- a/src/cmd/vet/asmdecl.go +++ b/src/cmd/vet/asmdecl.go @@ -177,22 +177,35 @@ Files: if arch == "" { // Determine architecture from +build line if possible. if m := asmPlusBuild.FindStringSubmatch(line); m != nil { - Fields: + // There can be multiple architectures in a single +build line, + // so accumulate them all and then prefer the one that + // matches build.Default.GOARCH. + var archCandidates []*asmArch for _, fld := range strings.Fields(m[1]) { for _, a := range arches { if a.name == fld { - arch = a.name - archDef = a - break Fields + archCandidates = append(archCandidates, a) } } } + for _, a := range archCandidates { + if a.name == build.Default.GOARCH { + archCandidates = []*asmArch{a} + break + } + } + if len(archCandidates) > 0 { + arch = archCandidates[0].name + archDef = archCandidates[0] + } } } if m := asmTEXT.FindStringSubmatch(line); m != nil { flushRet() if arch == "" { + // Arch not specified by filename or build tags. + // Fall back to build.Default.GOARCH. for _, a := range arches { if a.name == build.Default.GOARCH { arch = a.name