aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-06-21 13:06:39 -0700
committerRuss Cox <rsc@golang.org>2010-06-21 13:06:39 -0700
commit2fc0b4f01b8ef79c1cffc22080711f067cc072ce (patch)
tree2e07f284daefee9341341868ca00011cbe08aca2
parent96d35c6984fe932fba22ab56116d9d547a4fc188 (diff)
downloadgo-2fc0b4f01b8ef79c1cffc22080711f067cc072ce.tar.gz
go-2fc0b4f01b8ef79c1cffc22080711f067cc072ce.zip
gc: include struct field tags in type equality
R=ken2 CC=golang-dev https://golang.org/cl/1667048
-rw-r--r--src/cmd/gc/subr.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 70d58a9ab0..65b56dee62 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;