mirror of
https://github.com/golang/go
synced 2024-11-21 20:34:40 -07:00
parent
b13b80e555
commit
674458e1c4
@ -410,6 +410,7 @@ typeinit(void)
|
||||
okforarith[i] = 1;
|
||||
okforadd[i] = 1;
|
||||
okforand[i] = 1;
|
||||
okforconst[i] = 1;
|
||||
issimple[i] = 1;
|
||||
minintval[i] = mal(sizeof(*minintval[i]));
|
||||
maxintval[i] = mal(sizeof(*maxintval[i]));
|
||||
@ -419,6 +420,7 @@ typeinit(void)
|
||||
okforcmp[i] = 1;
|
||||
okforadd[i] = 1;
|
||||
okforarith[i] = 1;
|
||||
okforconst[i] = 1;
|
||||
issimple[i] = 1;
|
||||
minfltval[i] = mal(sizeof(*minfltval[i]));
|
||||
maxfltval[i] = mal(sizeof(*maxfltval[i]));
|
||||
@ -434,6 +436,9 @@ typeinit(void)
|
||||
okforcap[TARRAY] = 1;
|
||||
okforcap[TCHAN] = 1;
|
||||
|
||||
okforconst[TBOOL] = 1;
|
||||
okforconst[TSTRING] = 1;
|
||||
|
||||
okforlen[TARRAY] = 1;
|
||||
okforlen[TCHAN] = 1;
|
||||
okforlen[TMAP] = 1;
|
||||
|
@ -93,6 +93,9 @@ convlit1(Node **np, Type *t, int explicit)
|
||||
}
|
||||
return;
|
||||
case OLITERAL:
|
||||
// target is invalid type for a constant? leave alone.
|
||||
if(!okforconst[t->etype] && n->type->etype != TNIL)
|
||||
return;
|
||||
break;
|
||||
case OLSH:
|
||||
case ORSH:
|
||||
@ -105,6 +108,7 @@ convlit1(Node **np, Type *t, int explicit)
|
||||
n->type = t;
|
||||
return;
|
||||
}
|
||||
|
||||
// avoided repeated calculations, errors
|
||||
if(cvttype(n->type, t) == 1) {
|
||||
n->type = t;
|
||||
@ -345,7 +349,6 @@ evconst(Node *n)
|
||||
case OANDNOT:
|
||||
case OARRAYBYTESTR:
|
||||
case OCOM:
|
||||
case OCONV:
|
||||
case ODIV:
|
||||
case OEQ:
|
||||
case OGE:
|
||||
@ -365,6 +368,12 @@ evconst(Node *n)
|
||||
case OSUB:
|
||||
case OXOR:
|
||||
break;
|
||||
case OCONV:
|
||||
if(n->type == T)
|
||||
return;
|
||||
if(!okforconst[n->type->etype] && n->type->etype != TNIL)
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
nl = n->left;
|
||||
|
@ -680,6 +680,7 @@ EXTERN uchar okforbool[NTYPE];
|
||||
EXTERN uchar okforcap[NTYPE];
|
||||
EXTERN uchar okforlen[NTYPE];
|
||||
EXTERN uchar okforarith[NTYPE];
|
||||
EXTERN uchar okforconst[NTYPE];
|
||||
EXTERN uchar* okfor[OEND];
|
||||
EXTERN uchar iscmp[OEND];
|
||||
|
||||
|
@ -182,7 +182,7 @@ walkdef(Node *n)
|
||||
t = n->type;
|
||||
if(t != T) {
|
||||
convlit(&e, t);
|
||||
if(!isint[t->etype] && !isfloat[t->etype] && t->etype != TSTRING && t->etype != TBOOL)
|
||||
if(!okforconst[t->etype])
|
||||
yyerror("invalid constant type %T", t);
|
||||
}
|
||||
n->val = e->val;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $G $D/$F.go || echo BUG: bug246
|
||||
// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug246
|
||||
|
||||
// Copyright 2009 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
@ -10,9 +10,13 @@ import "unsafe"
|
||||
|
||||
func main() {
|
||||
// works
|
||||
addr := uintptr(0)
|
||||
_ = (*int)(unsafe.Pointer(addr))
|
||||
addr := uintptr(0x234)
|
||||
x1 := (*int)(unsafe.Pointer(addr))
|
||||
|
||||
// fails
|
||||
_ = (*int)(unsafe.Pointer(uintptr(0)))
|
||||
x2 := (*int)(unsafe.Pointer(uintptr(0x234)))
|
||||
|
||||
if x1 != x2 {
|
||||
panicln("mismatch", x1, x2)
|
||||
}
|
||||
}
|
@ -150,8 +150,3 @@ throw: interface conversion
|
||||
panic PC=xxx
|
||||
|
||||
== bugs/
|
||||
|
||||
=========== bugs/bug246.go
|
||||
bugs/bug246.go:17: cannot convert 0 to type unsafe.Pointer
|
||||
bugs/bug246.go:17: cannot convert 0 (type uintptr) to type *int in conversion
|
||||
BUG: bug246
|
||||
|
Loading…
Reference in New Issue
Block a user