Commit 1947960a authored by Rémy Oudompheng's avatar Rémy Oudompheng

cmd/gc: fix defaultlit of shifts used in interface context.

Fixes #4545.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6937058
parent 78cee46f
...@@ -1052,6 +1052,11 @@ defaultlit(Node **np, Type *t) ...@@ -1052,6 +1052,11 @@ defaultlit(Node **np, Type *t)
// When compiling x := 1<<i + 3.14, this means we try to push // When compiling x := 1<<i + 3.14, this means we try to push
// the float64 down into the 1<<i, producing the correct error // the float64 down into the 1<<i, producing the correct error
// (cannot shift float64). // (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)) { if(t == T && (n->right->op == OLSH || n->right->op == ORSH)) {
defaultlit(&n->left, T); defaultlit(&n->left, T);
defaultlit(&n->right, n->left->type); defaultlit(&n->right, n->left->type);
......
// 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
}
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