Commit ba6974fd authored by Daniel Martí's avatar Daniel Martí

cmd/compile: fix crash on invalid struct literal

If one tries to use promoted fields in a struct literal, the compiler
errors correctly. However, if the embedded fields are of struct pointer
type, the field.Type.Sym.Name expression below panics.

This is because field.Type.Sym is nil in that case. We can simply use
field.Sym.Name in this piece of code though, as it only concerns
embedded fields, in which case what we are after is the field name.

Added a test mirroring fixedbugs/issue23609.go, but with pointer types.

Fixes #26416.

Change-Id: Ia46ce62995c9e1653f315accb99d592aff2f285e
Reviewed-on: https://go-review.googlesource.com/124395
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarEmmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
parent ee198df4
...@@ -3152,7 +3152,7 @@ func typecheckcomplit(n *Node) *Node { ...@@ -3152,7 +3152,7 @@ func typecheckcomplit(n *Node) *Node {
// dotpath returns the parent embedded types in reverse order. // dotpath returns the parent embedded types in reverse order.
var ep []string var ep []string
for ei := len(p) - 1; ei >= 0; ei-- { for ei := len(p) - 1; ei >= 0; ei-- {
ep = append(ep, p[ei].field.Type.Sym.Name) ep = append(ep, p[ei].field.Sym.Name)
} }
ep = append(ep, l.Sym.Name) ep = append(ep, l.Sym.Name)
yyerror("cannot use promoted field %v in struct literal of type %v", strings.Join(ep, "."), t) yyerror("cannot use promoted field %v in struct literal of type %v", strings.Join(ep, "."), t)
......
// errorcheck
// Copyright 2018 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 main
type t1 struct {
t1f1 int
t1f2 int
}
type t2 struct {
t2f1 int
t2f2 int
*t1
}
type t3 struct {
t3f1 int
*t2
}
var (
_ = t2{t1f1: 600} // ERROR "cannot use promoted field t1.t1f1 in struct literal of type t2"
_ = t3{t1f2: 800} // ERROR "cannot use promoted field t2.t1.t1f2 in struct literal of type t3"
_ = t3{t2f1: 900} // ERROR "cannot use promoted field t2.t2f1 in struct literal of type t3"
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment