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:
Ian Lance Taylor 2018-10-18 23:26:20 +00:00
parent dbf9376f9e
commit 083e9210db
3 changed files with 25 additions and 10 deletions

View File

@ -1,4 +1,4 @@
9c985ce6f76dd65b8eb0e4b03c09ad0100712e04
6f4bce815786ff3803741355f7f280e4e2c89668
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -349,9 +349,16 @@ Type::are_identical(const Type* t1, const Type* t2, int flags,
return (flags & COMPARE_ERRORS) == 0 ? true : t1 == t2;
}
// Skip defined forward declarations. Ignore aliases.
t1 = t1->unalias();
t2 = t2->unalias();
// Skip defined forward declarations.
t1 = t1->forwarded();
t2 = t2->forwarded();
if ((flags & COMPARE_ALIASES) == 0)
{
// Ignore aliases.
t1 = t1->unalias();
t2 = t2->unalias();
}
if (t1 == t2)
return true;
@ -923,12 +930,17 @@ Type::copy_expressions()
unsigned int
Type::hash_for_method(Gogo* gogo, int flags) const
{
if (this->named_type() != NULL && this->named_type()->is_alias())
return this->named_type()->real_type()->hash_for_method(gogo, flags);
unsigned int ret = 0;
if (this->classification_ != TYPE_FORWARD)
ret += this->classification_;
return ret + this->do_hash_for_method(gogo, flags);
const Type* t = this->forwarded();
if (t->named_type() != NULL && t->named_type()->is_alias())
{
unsigned int r =
t->named_type()->real_type()->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

View File

@ -574,6 +574,9 @@ class Type
// struct field tags for purposes of type conversion.
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,
// and REASON is not NULL, it may set *REASON.
static bool