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 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.

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; return (flags & COMPARE_ERRORS) == 0 ? true : t1 == t2;
} }
// Skip defined forward declarations. Ignore aliases. // Skip defined forward declarations.
t1 = t1->forwarded();
t2 = t2->forwarded();
if ((flags & COMPARE_ALIASES) == 0)
{
// Ignore aliases.
t1 = t1->unalias(); t1 = t1->unalias();
t2 = t2->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

View File

@ -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