One of them says that the array passed to the function is 16 bytes but the function requires 12, and the other one says that the array is 12 bytes but the function requires 16. The function definition is exactly the same in both cases, so they can't both be correct.
go vet uses go/types which doesn't use the same sizes as the compiler. Specifically, the go/types.Config struct allows the specification of Sizes. By default it is using amd64 sizing (which still may be slightly different from cmd/compile - e.g., by default go/types produces less internal fragmentation).
The problem here is that the playground uses the 32bit compiler. In the first example, go vet complains because it computes the size of uintptr (8) and int64 (8) as 16, which is not what the array size (12) is. But the compiler produces for the sizes 4 (uintptr) + 8 == 12 and hence the code runs.
In the 2nd example, the array size is 16 which matches what go/types computes, and hence go vet is silent but the compiler complains.
To fix this, the playground would have to use a go/vet version that assumes 32bit word sizes, or the playground could be updated to amd64.
Come to think of if, maybe go/vet needs to have a flag for this as some people might use it with 386-based compiler.
This is mostly a NeedsDecision. The fix is straight-forward.
@bradfitz Yes, amd64p32 is what I meant (hence 4 + 8). Teaching vet about this probably requires some flag (if we want to cross-platform check), or alternatively it could just look at GOARCH. Perhaps the latter. @robpike, any opinion?