mirror of
https://github.com/golang/go
synced 2024-11-22 00:54:43 -07:00
bug186 - f(iota)
R=ken OCL=33051 CL=33051
This commit is contained in:
parent
68e250516c
commit
866b272336
@ -470,6 +470,7 @@ enum
|
||||
Etype = 1<<3,
|
||||
Ecall = 1<<4, // call-only expressions are ok
|
||||
Efnstruct = 1<<5, // multivalue function returns are ok
|
||||
Eiota = 1<<6, // iota is ok
|
||||
};
|
||||
|
||||
#define BITS 5
|
||||
|
@ -85,6 +85,8 @@ reswitch:
|
||||
*/
|
||||
case OLITERAL:
|
||||
ok |= Erv;
|
||||
if(n->iota && !(top & Eiota))
|
||||
yyerror("use of iota outside of constant initializer");
|
||||
goto ret;
|
||||
|
||||
case ONONAME:
|
||||
@ -261,8 +263,8 @@ reswitch:
|
||||
case OSUB:
|
||||
case OXOR:
|
||||
ok |= Erv;
|
||||
l = typecheck(&n->left, Erv);
|
||||
r = typecheck(&n->right, Erv);
|
||||
l = typecheck(&n->left, Erv | (top & Eiota));
|
||||
r = typecheck(&n->right, Erv | (top & Eiota));
|
||||
if(l->type == T || r->type == T)
|
||||
goto error;
|
||||
op = n->op;
|
||||
@ -339,7 +341,7 @@ reswitch:
|
||||
case ONOT:
|
||||
case OPLUS:
|
||||
ok |= Erv;
|
||||
l = typecheck(&n->left, Erv);
|
||||
l = typecheck(&n->left, Erv | (top & Eiota));
|
||||
if((t = l->type) == T)
|
||||
goto error;
|
||||
if(!okfor[n->op][t->etype]) {
|
||||
@ -995,6 +997,8 @@ error:
|
||||
out:
|
||||
lineno = lno;
|
||||
n->typecheck = 1;
|
||||
if(n->iota)
|
||||
n->typecheck = 0;
|
||||
*np = n;
|
||||
return n;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ walkdef(Node *n)
|
||||
dump("walkdef nil defn", n);
|
||||
yyerror("xxx");
|
||||
}
|
||||
typecheck(&e, Erv);
|
||||
typecheck(&e, Erv | Eiota);
|
||||
if(e->op != OLITERAL) {
|
||||
yyerror("const initializer must be constant");
|
||||
goto ret;
|
||||
|
18
test/fixedbugs/bug186.go
Normal file
18
test/fixedbugs/bug186.go
Normal file
@ -0,0 +1,18 @@
|
||||
// errchk $G $D/$F.go
|
||||
|
||||
// Copyright 2009 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.
|
||||
|
||||
package main
|
||||
|
||||
const X = iota
|
||||
|
||||
func f(x int) { }
|
||||
|
||||
func main() {
|
||||
f(X);
|
||||
f(iota); // ERROR "iota.*outside.*initializer"
|
||||
f(X);
|
||||
f(iota); // ERROR "iota.*outside.*initializer"
|
||||
}
|
Loading…
Reference in New Issue
Block a user