mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
cmd/gc: fix defaultlit of shifts used in interface context.
Fixes #4545. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6937058
This commit is contained in:
parent
78cee46f3a
commit
1947960a6f
|
@ -1052,6 +1052,11 @@ defaultlit(Node **np, Type *t)
|
|||
// When compiling x := 1<<i + 3.14, this means we try to push
|
||||
// the float64 down into the 1<<i, producing the correct error
|
||||
// (cannot shift float64).
|
||||
//
|
||||
// If t is an interface type, we want the default type for the
|
||||
// value, so just do as if no type was given.
|
||||
if(t && t->etype == TINTER)
|
||||
t = T;
|
||||
if(t == T && (n->right->op == OLSH || n->right->op == ORSH)) {
|
||||
defaultlit(&n->left, T);
|
||||
defaultlit(&n->right, n->left->type);
|
||||
|
|
19
test/fixedbugs/issue4545.go
Normal file
19
test/fixedbugs/issue4545.go
Normal file
|
@ -0,0 +1,19 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2012 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 4545: untyped constants are incorrectly coerced
|
||||
// to concrete types when used in interface{} context.
|
||||
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var s uint
|
||||
fmt.Println(1.0 + 1<<s) // ERROR "invalid operation"
|
||||
x := 1.0 + 1<<s // ERROR "invalid operation"
|
||||
_ = x
|
||||
}
|
Loading…
Reference in a new issue