diff options
author | Russ Cox <rsc@golang.org> | 2010-06-21 13:06:39 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-06-21 13:06:39 -0700 |
commit | fa47c8634b287c59a8fb1b01880f63985356f52d (patch) | |
tree | 6de84cb33914ea049accae8daa63ce55ff1d331f | |
parent | 57bae4ad607c850a598ca819e5770eb6f920bcbb (diff) | |
download | golang-fa47c8634b287c59a8fb1b01880f63985356f52d.tar.gz |
gc: include struct field tags in type equality
R=ken2
CC=golang-dev
http://codereview.appspot.com/1667048
-rw-r--r-- | src/cmd/gc/subr.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 70d58a9ab..65b56dee6 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -1725,6 +1725,18 @@ cplxsubtype(int et) return 0; } +static int +eqnote(Strlit *a, Strlit *b) +{ + if(a == b) + return 1; + if(a == nil || b == nil) + return 0; + if(a->len != b->len) + return 0; + return memcmp(a->s, b->s, a->len) == 0; +} + // Return 1 if t1 and t2 are identical, following the spec rules. // // Any cyclic type must go through a named type, and if one is @@ -1745,7 +1757,7 @@ eqtype(Type *t1, Type *t2) for(t1=t1->type, t2=t2->type; t1 && t2; t1=t1->down, t2=t2->down) { if(t1->etype != TFIELD || t2->etype != TFIELD) fatal("struct/interface missing field: %T %T", t1, t2); - if(t1->sym != t2->sym || t1->embedded != t2->embedded || !eqtype(t1->type, t2->type)) + if(t1->sym != t2->sym || t1->embedded != t2->embedded || !eqtype(t1->type, t2->type) || !eqnote(t1->note, t2->note)) return 0; } return t1 == T && t2 == T; |