GH-1296: fix type-checks related to list-type equality

List-types as used in composite table/set indices, for example,
previously had incorrect same_type() comparisons due to flattening
of the list-type into a single type without checking whether the
number and kind of types all match.

This patch simply removes the flatten_type() call from same_type() since
it was already contradicting/preventing a subsequent full-comparison
between elements of two TYPE_LISTs.

There was also a superfluous special-case of the `in` operator's
type-checking for testing whether a record is in a table/set.  It's
superfluous because the general case will already do the type-checking
from MatchesIndex() after first wrapping the record operand in a
ListExpr.  The previous logic was incorrectly relying on the
flatten_type() for testing equality of a record-type against a
list-type, whereas the general case correctly normalizes to testing
equality of two list-types.

The special-cased type-checking logic for assigning a record value to a
table index during its initialization similarly needed minor
re-organization in order to maintain the same error messages as before.
This commit is contained in:
Jon Siwek 2021-01-10 17:32:50 -08:00
parent 54b52eb197
commit 8c64ba6907
6 changed files with 88 additions and 38 deletions

View file

@ -1586,11 +1586,8 @@ bool same_type(const Type& arg_t1, const Type& arg_t2,
arg_t2.Tag() == TYPE_ANY )
return true;
auto t1 = flatten_type(&arg_t1);
auto t2 = flatten_type(&arg_t2);
if ( t1 == t2 )
return true;
auto t1 = &arg_t1;
auto t2 = &arg_t2;
if ( t1->Tag() != t2->Tag() )
{