Skip to content

Commit dfeecda

Browse files
committed
cmd/compile: checkwidth T when constructing *T
Without this, T can sneak through to the backend with its width unknown. Fixes #20174 Change-Id: I9b21e0e2641f75e360cc5e45dcb4eefe8255b675 Reviewed-on: https://go-review.googlesource.com/42175 Run-TryBot: Josh Bleecher Snyder <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 320aabb commit dfeecda

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/cmd/compile/internal/gc/typecheck.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ OpSwitch:
498498
ok |= Etype
499499
n.Op = OTYPE
500500
n.Type = types.NewPtr(l.Type)
501+
checkwidth(l.Type) // ensure this gets dowidth'd for the backend
501502
n.Left = nil
502503
break OpSwitch
503504
}

test/fixedbugs/issue20174.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// compile -c=2
2+
3+
// Copyright 2017 The Go Authors. All rights reserved.
4+
// Use of this source code is governed by a BSD-style
5+
// license that can be found in the LICENSE file.
6+
7+
// Issue 20174: failure to typecheck contents of *T in the frontend.
8+
9+
package p
10+
11+
func f() {
12+
_ = (*interface{})(nil) // interface{} here used to not have its width calculated going into backend
13+
select {
14+
case _ = <-make(chan interface {
15+
M()
16+
}, 1):
17+
}
18+
}

0 commit comments

Comments
 (0)