diff options
author | Russ Cox <rsc@golang.org> | 2010-07-26 17:34:17 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-07-26 17:34:17 -0700 |
commit | f20c2e1cf5fa9e7bbb78f990e083d6e58864f179 (patch) | |
tree | 544db4de3ca0c96db8bda5d86879589920ce1751 | |
parent | 9a442211c6972c2d35a64562db864bb499b5915e (diff) | |
download | go-f20c2e1cf5fa9e7bbb78f990e083d6e58864f179.tar.gz go-f20c2e1cf5fa9e7bbb78f990e083d6e58864f179.zip |
gc: more crash avoidance
Fixes #961.
Fixes #962.
R=ken2
CC=golang-dev
https://golang.org/cl/1903043
-rw-r--r-- | src/cmd/gc/const.c | 6 | ||||
-rw-r--r-- | src/cmd/gc/typecheck.c | 4 | ||||
-rw-r--r-- | test/fixedbugs/bug297.go | 15 | ||||
-rw-r--r-- | test/fixedbugs/bug298.go | 11 |
4 files changed, 36 insertions, 0 deletions
diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c index cec95359a0..479e7dd6b7 100644 --- a/src/cmd/gc/const.c +++ b/src/cmd/gc/const.c @@ -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)) { diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index 3784c6699e..b1991333ca 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -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"); diff --git a/test/fixedbugs/bug297.go b/test/fixedbugs/bug297.go new file mode 100644 index 0000000000..ba029427f2 --- /dev/null +++ b/test/fixedbugs/bug297.go @@ -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" +) diff --git a/test/fixedbugs/bug298.go b/test/fixedbugs/bug298.go new file mode 100644 index 0000000000..9b329aedfc --- /dev/null +++ b/test/fixedbugs/bug298.go @@ -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" + |