summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2017-10-22 20:13:02 -0700
committerOri Bernstein <ori@eigenstate.org>2017-10-23 00:57:46 -0700
commit3ff4453f5f5898a7b44d47218945d4385c2f5c32 (patch)
tree51fca97ae14f60d528742fd455673536382c99c0
parent26ac18e94d9f64f5153c51cf6d6151367ea0dfd7 (diff)
downloadmc-3ff4453f5f5898a7b44d47218945d4385c2f5c32.tar.gz
Propagate hiddenness properly across usefile merges.
-rw-r--r--parse/export.c3
-rw-r--r--parse/node.c2
-rw-r--r--parse/stab.c8
3 files changed, 9 insertions, 4 deletions
diff --git a/parse/export.c b/parse/export.c
index ee40165..a225057 100644
--- a/parse/export.c
+++ b/parse/export.c
@@ -272,6 +272,7 @@ tagexports(Node *file, int hidelocal)
tr->aux[i]->vis = tr->vis;
for (i = 0; i < tr->nproto; i++) {
tr->proto[i]->decl.vis = tr->vis;
+ printf("leaving %s with vis %d\n", declname(tr->proto[i]), tr->vis);
tagnode(st, tr->proto[i], 0, hidelocal);
}
}
@@ -287,7 +288,7 @@ tagexports(Node *file, int hidelocal)
tr = s->impl.trait;
tagtrait(st, tr, 0, hidelocal);
for (j = 0; j < tr->naux; j++)
- tr->aux[j]->vis = Visexport;
+ tr->aux[j]->vis = tr->vis;
}
free(k);
diff --git a/parse/node.c b/parse/node.c
index 957a15e..f6827de 100644
--- a/parse/node.c
+++ b/parse/node.c
@@ -553,8 +553,6 @@ nameeq(void *p1, void *p2)
void
setns(Node *n, char *ns)
{
- assert(!ns || !n->name.ns || !strcmp(n->name.ns, ns));
-
if (!ns)
return;
n->name.ns = strdup(ns);
diff --git a/parse/stab.c b/parse/stab.c
index c24b4a4..023e9f7 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;
}