shithub: mc

Download patch

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