Commit 083e9210 by Ian Lance Taylor

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
parent dbf9376f
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, ...@@ -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() ...@@ -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 ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment