gc: more crash avoidance

Fixes #961.
Fixes #962.

R=ken2
CC=golang-dev
https://golang.org/cl/1903043
This commit is contained in:
Russ Cox 2010-07-26 17:34:17 -07:00
parent 9a442211c6
commit f20c2e1cf5
4 changed files with 36 additions and 0 deletions

View file

@ -536,6 +536,12 @@ evconst(Node *n)
v = toflt(v);
rv = toflt(rv);
}
if(v.ctype != rv.ctype) {
// Use of undefined name as constant?
if((v.ctype == 0 || rv.ctype == 0) && nerrors > 0)
return;
fatal("constant type mismatch %T(%d) %T(%d)", nl->type, v.ctype, nr->type, rv.ctype);
}
// run op
switch(TUP(n->op, v.ctype)) {

View file

@ -1129,6 +1129,10 @@ reswitch:
case ORETURN:
ok |= Etop;
typechecklist(n->list, Erv | Efnstruct);
if(curfn == N) {
yyerror("return outside function");
goto error;
}
if(curfn->type->outnamed && n->list == nil)
goto ret;
typecheckaste(ORETURN, getoutargx(curfn->type), n->list, "return argument");

15
test/fixedbugs/bug297.go Normal file
View file

@ -0,0 +1,15 @@
// errchk $G $D/$F.go
// Copyright 2010 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.
// Used to crash; issue 961.
package main
type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*X) // ERROR "undefined"
)

11
test/fixedbugs/bug298.go Normal file
View file

@ -0,0 +1,11 @@
// errchk $G $D/$F.go
// Copyright 2010 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.
package ddd
func Sum() int
for i := range []int{} { return i } // ERROR "return outside function"