ref: c158da43321893956e4be405ed04af37f86259fa
parent: dc335f52e7cd8526d3cc9d979057d3de593f94c6
author: Ori Bernstein <[email protected]>
date: Mon Feb 10 16:33:10 EST 2014
Split types and traits. They used to live in the same hash table in the symtab. This was a bug. Now, they no longer live in the same hash table, but they do live in the same namespace; ie, var foo : bar::bar will not compile, since 'bar' can't be both a type and a trait.
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -97,9 +97,10 @@
* types and values are in separate namespaces. */
Htab *dcl;
Htab *closure; /* the syms we close over */
- Htab *ns;
- Htab *ty;
- Htab *uc;
+ Htab *ns; /* namespaces */
+ Htab *ty; /* types */
+ Htab *tr; /* traits */
+ Htab *uc; /* union constructors */
};
struct Type {
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -71,6 +71,7 @@
st->ns = mkht(strhash, streq);
st->dcl = mkht(nsnamehash, nsnameeq);
st->ty = mkht(nsnamehash, nsnameeq);
+ st->tr = mkht(nsnamehash, nsnameeq);
st->uc = mkht(nsnamehash, nsnameeq);
return st;
}
@@ -145,7 +146,7 @@
Traitdefn *c;
do {
- if ((c = htget(st->ty, n)))
+ if ((c = htget(st->tr, n)))
return c->trait;
st = st->super;
} while (st);
@@ -224,13 +225,15 @@
{
Traitdefn *td;
+ if (gettrait(st, n))
+ fatal(n->line, "Trait %s already defined", namestr(n));
if (gettype(st, n))
- fatal(n->line, "Type %s already defined", namestr(n));
+ fatal(n->line, "Trait %s already defined as type", namestr(n));
td = xalloc(sizeof(Tydefn));
td->line = n->line;
td->name = n;
td->trait = c;
- htput(st->ty, td->name, td);
+ htput(st->tr, td->name, td);
}
void putns(Stab *st, Stab *scope)
--- a/test/tests
+++ b/test/tests
@@ -72,7 +72,7 @@
B generic E 42
B genericval E 42
B trait-builtin E 42
-# E emptytrait E 123 ## BUGGERED
+B emptytrait E 123
B nestucon P asdf
B mkunion E 0
B genericcall E 42