half of bug193

R=ken
OCL=33730
CL=33730
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c
index 6beacab..d774773 100644
--- a/src/cmd/gc/const.c
+++ b/src/cmd/gc/const.c
@@ -100,7 +100,12 @@
 	case OLSH:
 	case ORSH:
 		convlit(&n->left, t);
-		n->type = n->left->type;
+		t = n->left->type;
+		if(t != T && !isint[t->etype]) {
+			yyerror("invalid operation: %#N (shift of type %T)", n, t);
+			t = T;
+		}
+		n->type = t;
 		return;
 	}
 	// avoided repeated calculations, errors
@@ -728,7 +733,12 @@
 	case OLSH:
 	case ORSH:
 		defaultlit(&n->left, t);
-		n->type = n->left->type;
+		t = n->left->type;
+		if(t != T && !isint[t->etype]) {
+			yyerror("invalid operation: %#N (shift of type %T)", n, t);
+			t = T;
+		}
+		n->type = t;
 		return;
 	default:
 		defaultlit(&n->left, t);
diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index fba107f..8c76ebb 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -335,6 +335,11 @@
 			yyerror("invalid operation: %#N (shift count type %T)", n, r->type);
 			goto error;
 		}
+		t = l->type;
+		if(t != T && t->etype != TIDEAL && !isint[t->etype]) {
+			yyerror("invalid operation: %#N (shift of type %T)", n, t);
+			goto error;
+		}
 		// no defaultlit for left
 		// the outer context gives the type
 		n->type = l->type;
diff --git a/test/golden.out b/test/golden.out
index eedbcb2..c1a6092 100644
--- a/test/golden.out
+++ b/test/golden.out
@@ -170,9 +170,7 @@
 BUG: should compile
 
 =========== bugs/bug193.go
-BUG: errchk: bugs/bug193.go:13: error message does not match 'shift'
-bugs/bug193.go:13: fatal error: optoas: no entry LSH-float
-errchk: bugs/bug193.go:14: missing expected error: 'shift'
+BUG: errchk: bugs/bug193.go:14: missing expected error: 'shift'
 
 =========== bugs/bug194.go
 bugs/bug194.go:15: array index must be non-negative integer constant