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
*/
case OLITERAL:
ok |= Erv;
+ if(n->iota && !(top & Eiota))
+ yyerror("use of iota outside of constant initializer");
goto ret;
case ONONAME:
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;
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]) {
out:
lineno = lno;
n->typecheck = 1;
+ if(n->iota)
+ n->typecheck = 0;
*np = n;
return 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;
--- /dev/null
+// 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"
+}