From dfeecda91df3b0760fb380061f6af41e38f7938e Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 29 Apr 2017 14:27:55 -0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/typecheck.go | 1 + test/fixedbugs/issue20174.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 test/fixedbugs/issue20174.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 69d07d583fd..e66ce5dc985 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -498,6 +498,7 @@ OpSwitch: ok |= Etype n.Op = OTYPE n.Type = types.NewPtr(l.Type) + checkwidth(l.Type) // ensure this gets dowidth'd for the backend n.Left = nil break OpSwitch } diff --git a/test/fixedbugs/issue20174.go b/test/fixedbugs/issue20174.go new file mode 100644 index 00000000000..a9c1fd8daff --- /dev/null +++ b/test/fixedbugs/issue20174.go @@ -0,0 +1,18 @@ +// compile -c=2 + +// Copyright 2017 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. + +// Issue 20174: failure to typecheck contents of *T in the frontend. + +package p + +func f() { + _ = (*interface{})(nil) // interface{} here used to not have its width calculated going into backend + select { + case _ = <-make(chan interface { + M() + }, 1): + } +}