aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-05-24 14:18:15 -0700
committerRuss Cox <rsc@golang.org>2010-05-24 14:18:15 -0700
commit80ac15ec12e265f2958195e7fad7030dac4de3d7 (patch)
tree85f9cb20af02b57fc4723efbb9a7f85e85d16a57
parent2034f7213938c215f2739941e8de70d92dc14b9d (diff)
downloadgo-80ac15ec12e265f2958195e7fad7030dac4de3d7.tar.gz
go-80ac15ec12e265f2958195e7fad7030dac4de3d7.zip
gc: fix unsafe.Sizeof on ideal constants
R=ken2 CC=golang-dev https://golang.org/cl/1280041
-rw-r--r--src/cmd/gc/unsafe.c6
-rw-r--r--test/fixedbugs/bug279.go36
2 files changed, 38 insertions, 4 deletions
diff --git a/src/cmd/gc/unsafe.c b/src/cmd/gc/unsafe.c
index 5d27dd648d..423fc08c6e 100644
--- a/src/cmd/gc/unsafe.c
+++ b/src/cmd/gc/unsafe.c
@@ -32,9 +32,8 @@ unsafenmagic(Node *fn, NodeList *args)
if(strcmp(s->name, "Sizeof") == 0) {
typecheck(&r, Erv);
+ defaultlit(&r, T);
tr = r->type;
- if(r->op == OLITERAL && r->val.ctype == CTSTR)
- tr = types[TSTRING];
if(tr == T)
goto no;
v = tr->width;
@@ -49,9 +48,8 @@ unsafenmagic(Node *fn, NodeList *args)
}
if(strcmp(s->name, "Alignof") == 0) {
typecheck(&r, Erv);
+ defaultlit(&r, T);
tr = r->type;
- if(r->op == OLITERAL && r->val.ctype == CTSTR)
- tr = types[TSTRING];
if(tr == T)
goto no;
diff --git a/test/fixedbugs/bug279.go b/test/fixedbugs/bug279.go
new file mode 100644
index 0000000000..af8e056d97
--- /dev/null
+++ b/test/fixedbugs/bug279.go
@@ -0,0 +1,36 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// http://code.google.com/p/go/issues/detail?id=799
+
+package main
+
+import "unsafe"
+
+func main() {
+ n := unsafe.Sizeof(0)
+ if n != 4 && n != 8 {
+ println("BUG sizeof 0", n)
+ return
+ }
+ n = unsafe.Alignof(0)
+ if n != 4 && n != 8 {
+ println("BUG alignof 0", n)
+ return
+ }
+
+ n = unsafe.Sizeof("")
+ if n != 8 && n != 16 {
+ println("BUG sizeof \"\"", n)
+ return
+ }
+ n = unsafe.Alignof("")
+ if n != 4 && n != 8 {
+ println("BUG alignof \"\"", n)
+ return
+ }
+}
+