| // Copyright 2012 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // This file contains the test for untagged struct literals. |
| |
| package a |
| |
| import ( |
| "flag" |
| "go/scanner" |
| "go/token" |
| "image" |
| "unicode" |
| ) |
| |
| var Okay1 = []string{ |
| "Name", |
| "Usage", |
| "DefValue", |
| } |
| |
| var Okay2 = map[string]bool{ |
| "Name": true, |
| "Usage": true, |
| "DefValue": true, |
| } |
| |
| var Okay3 = struct { |
| X string |
| Y string |
| Z string |
| }{ |
| "Name", |
| "Usage", |
| "DefValue", |
| } |
| |
| var Okay4 = []struct { |
| A int |
| B int |
| }{ |
| {1, 2}, |
| {3, 4}, |
| } |
| |
| type MyStruct struct { |
| X string |
| Y string |
| Z string |
| } |
| |
| var Okay5 = &MyStruct{ |
| "Name", |
| "Usage", |
| "DefValue", |
| } |
| |
| var Okay6 = []MyStruct{ |
| {"foo", "bar", "baz"}, |
| {"aa", "bb", "cc"}, |
| } |
| |
| var Okay7 = []*MyStruct{ |
| {"foo", "bar", "baz"}, |
| {"aa", "bb", "cc"}, |
| } |
| |
| // Testing is awkward because we need to reference things from a separate package |
| // to trigger the warnings. |
| |
| var goodStructLiteral = flag.Flag{ |
| Name: "Name", |
| Usage: "Usage", |
| } |
| var badStructLiteral = flag.Flag{ // want "unkeyed fields" |
| "Name", |
| "Usage", |
| nil, // Value |
| "DefValue", |
| } |
| |
| var delta [3]rune |
| |
| // SpecialCase is a named slice of CaseRange to test issue 9171. |
| var goodNamedSliceLiteral = unicode.SpecialCase{ |
| {Lo: 1, Hi: 2, Delta: delta}, |
| unicode.CaseRange{Lo: 1, Hi: 2, Delta: delta}, |
| } |
| var badNamedSliceLiteral = unicode.SpecialCase{ |
| {1, 2, delta}, // want "unkeyed fields" |
| unicode.CaseRange{1, 2, delta}, // want "unkeyed fields" |
| } |
| |
| // ErrorList is a named slice, so no warnings should be emitted. |
| var goodScannerErrorList = scanner.ErrorList{ |
| &scanner.Error{Msg: "foobar"}, |
| } |
| var badScannerErrorList = scanner.ErrorList{ |
| &scanner.Error{token.Position{}, "foobar"}, // want "unkeyed fields" |
| } |
| |
| // Check whitelisted structs: if vet is run with --compositewhitelist=false, |
| // this line triggers an error. |
| var whitelistedPoint = image.Point{1, 2} |
| |
| // Do not check type from unknown package. |
| // See issue 15408. |
| var unknownPkgVar = unicode.NoSuchType{"foo", "bar"} |
| |
| // A named pointer slice of CaseRange to test issue 23539. In |
| // particular, we're interested in how some slice elements omit their |
| // type. |
| var goodNamedPointerSliceLiteral = []*unicode.CaseRange{ |
| {Lo: 1, Hi: 2}, |
| &unicode.CaseRange{Lo: 1, Hi: 2}, |
| } |
| var badNamedPointerSliceLiteral = []*unicode.CaseRange{ |
| {1, 2, delta}, // want "unkeyed fields" |
| &unicode.CaseRange{1, 2, delta}, // want "unkeyed fields" |
| } |
| |
| // unicode.Range16 is whitelisted, so there'll be no vet error |
| var range16 = unicode.Range16{0xfdd0, 0xfdef, 1} |
| |
| // unicode.Range32 is whitelisted, so there'll be no vet error |
| var range32 = unicode.Range32{0x1fffe, 0x1ffff, 1} |