diff --git a/lang/funcs/collection.go b/lang/funcs/collection.go index 1257895e3..c6adce52d 100644 --- a/lang/funcs/collection.go +++ b/lang/funcs/collection.go @@ -800,7 +800,13 @@ var MatchkeysFunc = function.New(&function.Spec{ }, }, Type: func(args []cty.Value) (cty.Type, error) { - if !args[1].Type().Equals(args[2].Type()) { + argTypes := make([]cty.Type, 2) + for i := 0; i < 2; i++ { + argTypes[i] = args[i+1].Type() + } + + ty, _ := convert.UnifyUnsafe(argTypes) + if ty == cty.NilType { return cty.NilType, errors.New("lists must be of the same type") } diff --git a/lang/funcs/collection_test.go b/lang/funcs/collection_test.go index e408d385b..bfc007c8c 100644 --- a/lang/funcs/collection_test.go +++ b/lang/funcs/collection_test.go @@ -1883,8 +1883,7 @@ func TestMatchkeys(t *testing.T) { cty.UnknownVal(cty.List(cty.String)), false, }, - // errors - { // different types + { // different types that can be unified cty.ListVal([]cty.Value{ cty.StringVal("a"), }), @@ -1894,9 +1893,10 @@ func TestMatchkeys(t *testing.T) { cty.ListVal([]cty.Value{ cty.StringVal("a"), }), - cty.NilVal, - true, + cty.ListValEmpty(cty.String), + false, }, + // errors { // different types cty.ListVal([]cty.Value{ cty.StringVal("a"),