From: Akshat Kumar Date: Sun, 7 Oct 2012 06:11:59 +0000 (+0800) Subject: cmd/gc: don't dereference a nil Type pointer in widstruct X-Git-Tag: go1.1rc2~2229 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=51e8fe5b1b6ae86976fb8e6d6333f14299b36b17;p=gostls13.git cmd/gc: don't dereference a nil Type pointer in widstruct The nil dereference in the next few lines doesn't seem to cause a segmentation fault on Unix, but does seem to halt the Go compiler. The following is a test case: >>> package main func mine(int b) int { return b + 2 } func main() { mine() c = mine() } <<< Without this change only the following is caught: typecheck.go:3: undefined: b typecheck.go:4: undefined: b with it, we catch all the errors: typecheck.go:3: undefined: b typecheck.go:4: undefined: b typecheck.go:10: undefined: c typecheck.go:10: cannot assign to c . R=rsc, minux.ma CC=golang-dev https://golang.org/cl/6542060 --- diff --git a/src/cmd/gc/align.c b/src/cmd/gc/align.c index 2440a4b3e2..d9d4df316f 100644 --- a/src/cmd/gc/align.c +++ b/src/cmd/gc/align.c @@ -54,6 +54,8 @@ widstruct(Type *errtype, Type *t, vlong o, int flag) for(f=t->type; f!=T; f=f->down) { if(f->etype != TFIELD) fatal("widstruct: not TFIELD: %lT", f); + if(f->type == T) + break; dowidth(f->type); if(f->type->align > maxalign) maxalign = f->type->align; diff --git a/test/typecheck.go b/test/typecheck.go new file mode 100644 index 0000000000..239ceacc69 --- /dev/null +++ b/test/typecheck.go @@ -0,0 +1,18 @@ +// errorcheck + +// Verify that the Go compiler will not +// die after running into an undefined +// type in the argument list for a +// function. +// Does not compile. + +package main + +func mine(int b) int { // ERROR "undefined.*b" + return b + 2 // ERROR "undefined.*b" +} + +func main() { + mine() + c = mine() // ERROR "undefined.*c" "cannot assign to c" +}