ref: 9e6df79b9758504cb7c1d965bce61d8ae9cf7c62
parent: e79cc81b134141763a5e0b92a5f4bb8743ac990b
author: Ori Bernstein <[email protected]>
date: Mon Jun 4 17:33:28 EDT 2012
Add in tyidxhack for indexing.
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -107,11 +107,7 @@
case Tyunion:
die("Sizes for composite types not implemented yet");
break;
- case Tybad:
- case Tyvar:
- case Typaram:
- case Tyname:
- case Ntypes:
+ case Tybad: case Tyvar: case Typaram: case Tyname: case Tyidxhack: case Ntypes:
die("Type %s does not have size; why did it get down to here?", tystr(t));
break;
}
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -293,10 +293,14 @@
settype(n, t);
break;
case Oidx: /* @a[@b::tcint] -> @a */
- die("inference of indexes not done yet");
+ t = mktyidxhack(n->line, type(args[1]));
+ t = unify(n, type(args[0]), t);
+ settype(n, t);
break;
case Oslice: /* @a[@b::tcint,@b::tcint] -> @a[,] */
- die("inference of slices not done yet");
+ t = mktyidxhack(n->line, type(args[1]));
+ t = unify(n, type(args[0]), t);
+ settype(n, t);
break;
/* special cases */
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -283,6 +283,7 @@
Type *mktynamed(int line, Node *name);
Type *mktyarray(int line, Type *base, Node *sz);
Type *mktyslice(int line, Type *base);
+Type *mktyidxhack(int line, Type *base);
Type *mktyptr(int line, Type *base);
Type *mktyfunc(int line, Node **args, size_t nargs, Type *ret);
Type *mktystruct(int line, Node **decls, size_t ndecls);
--- a/parse/type.c
+++ b/parse/type.c
@@ -143,6 +143,16 @@
return t;
}
+Type *mktyidxhack(int line, Type *base)
+{
+ Type *t;
+
+ t = mkty(line, Tyidxhack);
+ t->sub = xalloc(sizeof(Type*));
+ t->sub[0] = base;
+ return t;
+}
+
Type *mktyptr(int line, Type *base)
{
Type *t;
@@ -344,6 +354,11 @@
case Tyarray:
p += tybfmt(p, end - p, t->sub[0]);
p += snprintf(p, end - p, "[LEN]");
+ break;
+ case Tyidxhack:
+ p += snprintf(p, end - p, "Tyidxhack(");
+ p += tybfmt(p, end - p, t->sub[0]);
+ p += snprintf(p, end - p, ")[]");
break;
case Tyfunc:
p += snprintf(p, end - p, "(");
--- a/parse/types.def
+++ b/parse/types.def
@@ -31,6 +31,7 @@
Ty(Typtr, NULL)
Ty(Tyslice, NULL)
Ty(Tyarray, NULL)
+Ty(Tyidxhack, NULL)
Ty(Tyfunc, NULL)
Ty(Tytuple, NULL)
Ty(Tyvar, NULL)