summaryrefslogtreecommitdiff
path: root/parse/stab.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse/stab.c')
-rw-r--r--parse/stab.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/parse/stab.c b/parse/stab.c
index 7c031f9..49fc776 100644
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -505,12 +505,18 @@ putucon(Stab *st, Ucon *uc)
static int
mergetrait(Trait *old, Trait *new)
{
+ int hidden;
+
+ hidden = old->ishidden && new->ishidden;
if (old->isproto && !new->isproto)
*old = *new;
else if (new->isproto && !old->isproto)
*new = *old;
else if (!new->isimport && !old->isimport)
- return new->vis == Vishidden || old->vis == Vishidden;
+ if (new->vis == Vishidden || old->vis == Vishidden)
+ return 0;
+ new->ishidden = hidden;
+ old->ishidden = hidden;
return 1;
}
@@ -523,9 +529,12 @@ puttrait(Stab *st, Node *n, Trait *c)
st = findstab(st, n);
t = gettrait(st, n);
- if (t && !mergetrait(t, c))
+ if (t) {
+ if (mergetrait(t, c))
+ return;
fatal(n, "trait %s already defined on %s:%d",
namestr(n), fname(t->loc), lnum(t->loc));
+ }
ty = gettype(st, n);
if (ty)
fatal(n, "trait %s defined as a type on %s:%d",
@@ -572,6 +581,9 @@ putimpl(Stab *st, Node *n)
fatal(n, "trait %s already implemented over %s at %s:%d",
namestr(n->impl.traitname), tystr(n->impl.type),
fname(n->loc), lnum(n->loc));
+ /* if this is not a duplicate, record it for later export */
+ if (!impl)
+ lappend(&file->file.impl, &file->file.nimpl, n);
/*
The impl is not defined in this file, so setting the
trait name would be a bug here.