cmd/compile: add Type.Elem

This removes almost all direct access to
Type’s heavily overloaded Type field.

Mostly generated by eg, manually checked.

Significant manual changes:

* reflect.go's typPkg used Type indiscriminately.
  Use it only for specific etypes.
* gen.go's visitComponents contained a usage of Type
  with structs. Using Type for structs no longer
  occurs, and the Fatal contained therein has not triggered,
  so it has been axed.
* Scary code in cgen.go's cgen_slice is now explicitly scary.

Passes toolstash -cmp.

Change-Id: I2dbfb3c959da7ae239f964d83898c204affcabc6
Reviewed-on: https://go-review.googlesource.com/21331
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2016-03-30 10:57:47 -07:00
parent 76e72691a0
commit 8640b51df8
23 changed files with 226 additions and 213 deletions

View file

@ -716,7 +716,7 @@ func checkembeddedtype(t *Type) {
}
if t.Sym == nil && Isptr[t.Etype] {
t = t.Type
t = t.Elem()
if t.Etype == TINTER {
Yyerror("embedded type cannot be a pointer to interface")
}
@ -1020,7 +1020,7 @@ func isifacemethod(f *Type) bool {
if !Isptr[t.Etype] {
return false
}
t = t.Type
t = t.Elem()
if t.Sym != nil || t.Etype != TSTRUCT || t.NumFields() != 0 {
return false
}
@ -1076,7 +1076,7 @@ func methodsym(nsym *Sym, t0 *Type, iface int) *Sym {
}
s = t.Sym
if s == nil && Isptr[t.Etype] {
t = t.Type
t = t.Elem()
if t == nil {
goto bad
}
@ -1198,7 +1198,7 @@ func addmethod(msym *Sym, t *Type, tpkg *Pkg, local, nointerface bool) {
return
}
t = t.Type
t = t.Elem()
}
if t.Broke { // rely on typecheck having complained before