| // Copyright 2024 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. |
| |
| package p |
| |
| import ( |
| "go/ast" |
| "math/big" |
| ) |
| |
| // case sel pkg have message (examples for general lookup) |
| // --------------------------------------------------------------------------------------------------------- |
| // ok x.Foo == Foo |
| // misspelled x.Foo == FoO type X has no field or method Foo, but does have field FoO |
| // misspelled x.Foo == foo type X has no field or method Foo, but does have field foo |
| // misspelled x.Foo == foO type X has no field or method Foo, but does have field foO |
| // |
| // misspelled x.foo == Foo type X has no field or method foo, but does have field Foo |
| // misspelled x.foo == FoO type X has no field or method foo, but does have field FoO |
| // ok x.foo == foo |
| // misspelled x.foo == foO type X has no field or method foo, but does have field foO |
| // |
| // ok x.Foo != Foo |
| // misspelled x.Foo != FoO type X has no field or method Foo, but does have field FoO |
| // unexported x.Foo != foo type X has no field or method Foo, but does have unexported field foo |
| // missing x.Foo != foO type X has no field or method Foo |
| // |
| // misspelled x.foo != Foo type X has no field or method foo, but does have field Foo |
| // missing x.foo != FoO type X has no field or method foo |
| // inaccessible x.foo != foo cannot refer to unexported field foo |
| // missing x.foo != foO type X has no field or method foo |
| |
| type S struct { |
| Foo1 int |
| FoO2 int |
| foo3 int |
| foO4 int |
| } |
| |
| func _() { |
| var x S |
| _ = x.Foo1 // OK |
| _ = x.Foo2 // ERROR "x.Foo2 undefined (type S has no field or method Foo2, but does have field FoO2)" |
| _ = x.Foo3 // ERROR "x.Foo3 undefined (type S has no field or method Foo3, but does have field foo3)" |
| _ = x.Foo4 // ERROR "x.Foo4 undefined (type S has no field or method Foo4, but does have field foO4)" |
| |
| _ = x.foo1 // ERROR "x.foo1 undefined (type S has no field or method foo1, but does have field Foo1)" |
| _ = x.foo2 // ERROR "x.foo2 undefined (type S has no field or method foo2, but does have field FoO2)" |
| _ = x.foo3 // OK |
| _ = x.foo4 // ERROR "x.foo4 undefined (type S has no field or method foo4, but does have field foO4)" |
| } |
| |
| func _() { |
| _ = S{Foo1: 0} // OK |
| _ = S{Foo2 /* ERROR "unknown field Foo2 in struct literal of type S, but does have FoO2" */ : 0} |
| _ = S{Foo3 /* ERROR "unknown field Foo3 in struct literal of type S, but does have foo3" */ : 0} |
| _ = S{Foo4 /* ERROR "unknown field Foo4 in struct literal of type S, but does have foO4" */ : 0} |
| |
| _ = S{foo1 /* ERROR "unknown field foo1 in struct literal of type S, but does have Foo1" */ : 0} |
| _ = S{foo2 /* ERROR "unknown field foo2 in struct literal of type S, but does have FoO2" */ : 0} |
| _ = S{foo3: 0} // OK |
| _ = S{foo4 /* ERROR "unknown field foo4 in struct literal of type S, but does have foO4" */ : 0} |
| } |
| |
| // The following tests follow the same pattern as above but operate on an imported type instead of S. |
| // Currently our testing framework doesn't make it easy to define an imported package for testing, so |
| // instead we use the big.Float and ast.File types as they provide a suitable mix of exported and un- |
| // exported fields and methods. |
| |
| func _() { |
| var x *big.Float |
| _ = x.Neg // OK |
| _ = x.NeG // ERROR "x.NeG undefined (type *big.Float has no field or method NeG, but does have method Neg)" |
| _ = x.Form // ERROR "x.Form undefined (type *big.Float has no field or method Form, but does have unexported field form)" |
| _ = x.ForM // ERROR "x.ForM undefined (type *big.Float has no field or method ForM)" |
| |
| _ = x.abs // ERROR "x.abs undefined (type *big.Float has no field or method abs, but does have method Abs)" |
| _ = x.abS // ERROR "x.abS undefined (type *big.Float has no field or method abS)" |
| _ = x.form // ERROR "x.form undefined (cannot refer to unexported field form)" |
| _ = x.forM // ERROR "x.forM undefined (type *big.Float has no field or method forM)" |
| } |
| |
| func _() { |
| _ = ast.File{Name: nil} // OK |
| _ = ast.File{NamE /* ERROR "unknown field NamE in struct literal of type ast.File, but does have Name" */ : nil} |
| _ = big.Float{Form /* ERROR "unknown field Form in struct literal of type big.Float, but does have unexported form" */ : 0} |
| _ = big.Float{ForM /* ERROR "unknown field ForM in struct literal of type big.Float" */ : 0} |
| |
| _ = ast.File{name /* ERROR "unknown field name in struct literal of type ast.File, but does have Name" */ : nil} |
| _ = ast.File{namE /* ERROR "unknown field namE in struct literal of type ast.File" */ : nil} |
| _ = big.Float{form /* ERROR "cannot refer to unexported field form in struct literal of type big.Float" */ : 0} |
| _ = big.Float{forM /* ERROR "unknown field forM in struct literal of type big.Float" */ : 0} |
| } |