compiler: add COMPARE_ALIASES flag for type compare and hash
Normally aliases compare as identical to the underlying type. Add a COMPARE_ALIASES flag to let them compare (and hash) differently. This will be used by later patches in this series. Reviewed-on: https://go-review.googlesource.com/c/143021 From-SVN: r265297
This commit is contained in:
parent
dbf9376f9e
commit
083e9210db
@ -1,4 +1,4 @@
|
|||||||
9c985ce6f76dd65b8eb0e4b03c09ad0100712e04
|
6f4bce815786ff3803741355f7f280e4e2c89668
|
||||||
|
|
||||||
The first line of this file holds the git revision number of the last
|
The first line of this file holds the git revision number of the last
|
||||||
merge done from the gofrontend repository.
|
merge done from the gofrontend repository.
|
||||||
|
@ -349,9 +349,16 @@ Type::are_identical(const Type* t1, const Type* t2, int flags,
|
|||||||
return (flags & COMPARE_ERRORS) == 0 ? true : t1 == t2;
|
return (flags & COMPARE_ERRORS) == 0 ? true : t1 == t2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip defined forward declarations. Ignore aliases.
|
// Skip defined forward declarations.
|
||||||
t1 = t1->unalias();
|
t1 = t1->forwarded();
|
||||||
t2 = t2->unalias();
|
t2 = t2->forwarded();
|
||||||
|
|
||||||
|
if ((flags & COMPARE_ALIASES) == 0)
|
||||||
|
{
|
||||||
|
// Ignore aliases.
|
||||||
|
t1 = t1->unalias();
|
||||||
|
t2 = t2->unalias();
|
||||||
|
}
|
||||||
|
|
||||||
if (t1 == t2)
|
if (t1 == t2)
|
||||||
return true;
|
return true;
|
||||||
@ -923,12 +930,17 @@ Type::copy_expressions()
|
|||||||
unsigned int
|
unsigned int
|
||||||
Type::hash_for_method(Gogo* gogo, int flags) const
|
Type::hash_for_method(Gogo* gogo, int flags) const
|
||||||
{
|
{
|
||||||
if (this->named_type() != NULL && this->named_type()->is_alias())
|
const Type* t = this->forwarded();
|
||||||
return this->named_type()->real_type()->hash_for_method(gogo, flags);
|
if (t->named_type() != NULL && t->named_type()->is_alias())
|
||||||
unsigned int ret = 0;
|
{
|
||||||
if (this->classification_ != TYPE_FORWARD)
|
unsigned int r =
|
||||||
ret += this->classification_;
|
t->named_type()->real_type()->hash_for_method(gogo, flags);
|
||||||
return ret + this->do_hash_for_method(gogo, flags);
|
if ((flags & Type::COMPARE_ALIASES) != 0)
|
||||||
|
r += TYPE_FORWARD;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
unsigned int ret = t->classification_;
|
||||||
|
return ret + t->do_hash_for_method(gogo, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default implementation of do_hash_for_method. This is appropriate
|
// Default implementation of do_hash_for_method. This is appropriate
|
||||||
|
@ -574,6 +574,9 @@ class Type
|
|||||||
// struct field tags for purposes of type conversion.
|
// struct field tags for purposes of type conversion.
|
||||||
static const int COMPARE_TAGS = 2;
|
static const int COMPARE_TAGS = 2;
|
||||||
|
|
||||||
|
// Compare aliases: treat an alias to T as distinct from T.
|
||||||
|
static const int COMPARE_ALIASES = 4;
|
||||||
|
|
||||||
// Return true if two types are identical. If this returns false,
|
// Return true if two types are identical. If this returns false,
|
||||||
// and REASON is not NULL, it may set *REASON.
|
// and REASON is not NULL, it may set *REASON.
|
||||||
static bool
|
static bool
|
||||||
|
Loading…
Reference in New Issue
Block a user