mirror of
https://github.com/golang/go
synced 2024-11-21 21:44:40 -07:00
gc: better error for non-calling use of unsafe builtins.
Fixes #1951 R=rsc CC=golang-dev https://golang.org/cl/5372041
This commit is contained in:
parent
21f5057639
commit
924ea515cf
@ -1247,6 +1247,7 @@ void queuemethod(Node *n);
|
||||
/*
|
||||
* unsafe.c
|
||||
*/
|
||||
int isunsafebuiltin(Node *n);
|
||||
Node* unsafenmagic(Node *n);
|
||||
|
||||
/*
|
||||
|
@ -210,6 +210,10 @@ reswitch:
|
||||
}
|
||||
n->used = 1;
|
||||
}
|
||||
if(!(top &Ecall) && isunsafebuiltin(n)) {
|
||||
yyerror("%N is not an expression, must be called", n);
|
||||
goto error;
|
||||
}
|
||||
ok |= Erv;
|
||||
goto ret;
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
* look for
|
||||
* unsafe.Sizeof
|
||||
* unsafe.Offsetof
|
||||
* unsafe.Alignof
|
||||
* rewrite with a constant
|
||||
*/
|
||||
Node*
|
||||
@ -22,7 +23,7 @@ unsafenmagic(Node *nn)
|
||||
Val val;
|
||||
Node *fn;
|
||||
NodeList *args;
|
||||
|
||||
|
||||
fn = nn->left;
|
||||
args = nn->list;
|
||||
|
||||
@ -83,7 +84,7 @@ bad:
|
||||
yyerror("invalid expression %N", nn);
|
||||
v = 0;
|
||||
goto ret;
|
||||
|
||||
|
||||
yes:
|
||||
if(args->next != nil)
|
||||
yyerror("extra arguments for %S", s);
|
||||
@ -97,3 +98,17 @@ ret:
|
||||
n->type = types[TUINTPTR];
|
||||
return n;
|
||||
}
|
||||
|
||||
int
|
||||
isunsafebuiltin(Node *n)
|
||||
{
|
||||
if(n == N || n->op != ONAME || n->sym == S || n->sym->pkg != unsafepkg)
|
||||
return 0;
|
||||
if(strcmp(n->sym->name, "Sizeof") == 0)
|
||||
return 1;
|
||||
if(strcmp(n->sym->name, "Offsetof") == 0)
|
||||
return 1;
|
||||
if(strcmp(n->sym->name, "Alignof") == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
11
test/fixedbugs/bug376.go
Normal file
11
test/fixedbugs/bug376.go
Normal file
@ -0,0 +1,11 @@
|
||||
// errchk $G $D/$F.go
|
||||
|
||||
// Copyright 2011 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.
|
||||
|
||||
// issue 1951
|
||||
package foo
|
||||
import "unsafe"
|
||||
var v = unsafe.Sizeof // ERROR "must be called"
|
||||
|
Loading…
Reference in New Issue
Block a user