]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: don't dereference a nil Type pointer in widstruct
authorAkshat Kumar <seed@mail.nanosouffle.net>
Sun, 7 Oct 2012 06:11:59 +0000 (14:11 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Sun, 7 Oct 2012 06:11:59 +0000 (14:11 +0800)
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

src/cmd/gc/align.c
test/typecheck.go [new file with mode: 0644]

index 2440a4b3e277536bc500c3ff77de0ce06d77c8d0..d9d4df316fd384f9a1764a31c31a9bc07fa0ae79 100644 (file)
@@ -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 (file)
index 0000000..239ceac
--- /dev/null
@@ -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"
+}