]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: allow inlined struct == to mention unsafe.Pointer even in safe mode
authorRuss Cox <rsc@golang.org>
Mon, 9 Sep 2013 17:11:41 +0000 (13:11 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 9 Sep 2013 17:11:41 +0000 (13:11 -0400)
Fixes #5578.

R=ken2
CC=golang-dev
https://golang.org/cl/13417044

src/cmd/gc/walk.c

index e539d25d32a98c8e4ddc2ec9c18380b86df59720..b170d6e38725f67c1d94ab5b6de63ba9c8c6d94e 100644 (file)
@@ -340,7 +340,7 @@ walkexpr(Node **np, NodeList **init)
        Node *r, *l, *var, *a;
        NodeList *ll, *lr, *lpost;
        Type *t;
-       int et;
+       int et, old_safemode;
        int64 v;
        int32 lno;
        Node *n, *fn, *n1, *n2;
@@ -488,7 +488,15 @@ walkexpr(Node **np, NodeList **init)
        case ONE:
                walkexpr(&n->left, init);
                walkexpr(&n->right, init);
+               // Disable safemode while compiling this code: the code we
+               // generate internally can refer to unsafe.Pointer.
+               // In this case it can happen if we need to generate an ==
+               // for a struct containing a reflect.Value, which itself has
+               // an unexported field of type unsafe.Pointer.
+               old_safemode = safemode;
+               safemode = 0;
                walkcompare(&n, init);
+               safemode = old_safemode;
                goto ret;
 
        case OANDAND: