diff --git a/terraform/eval_for_each.go b/terraform/eval_for_each.go index f03e02c27311..e92371216fc9 100644 --- a/terraform/eval_for_each.go +++ b/terraform/eval_for_each.go @@ -52,6 +52,10 @@ func evaluateResourceForEachExpressionKnown(expr hcl.Expression, ctx EvalContext return nil, true, diags case !forEachVal.IsKnown(): return map[string]cty.Value{}, false, diags + // If the map is empty ({}), return an empty map, because cty will return nil when representing {} AsValueMap + // This also covers an empty set (toset([])) + case forEachVal.LengthInt() == 0: + return map[string]cty.Value{}, true, diags } if !forEachVal.CanIterateElements() || forEachVal.Type().IsListType() || forEachVal.Type().IsTupleType() { @@ -84,10 +88,5 @@ func evaluateResourceForEachExpressionKnown(expr hcl.Expression, ctx EvalContext } } - // If the map is empty ({}), return an empty map, because cty will return nil when representing {} AsValueMap - if forEachVal.LengthInt() == 0 { - return map[string]cty.Value{}, true, diags - } - return forEachVal.AsValueMap(), true, nil } diff --git a/terraform/graph_builder_plan_test.go b/terraform/graph_builder_plan_test.go index 2eab2c31d53f..9b81cb87cd04 100644 --- a/terraform/graph_builder_plan_test.go +++ b/terraform/graph_builder_plan_test.go @@ -338,6 +338,8 @@ var.foo const testPlanGraphBuilderForEachStr = ` aws_instance.bar provider.aws +aws_instance.bar2 + provider.aws aws_instance.bat aws_instance.boo provider.aws @@ -349,6 +351,7 @@ aws_instance.foo provider.aws meta.count-boundary (EachMode fixup) aws_instance.bar + aws_instance.bar2 aws_instance.bat aws_instance.baz aws_instance.boo @@ -357,6 +360,7 @@ meta.count-boundary (EachMode fixup) provider.aws provider.aws (close) aws_instance.bar + aws_instance.bar2 aws_instance.bat aws_instance.baz aws_instance.boo diff --git a/terraform/testdata/plan-for-each/main.tf b/terraform/testdata/plan-for-each/main.tf index cbe0c587570e..bffb079cbe6d 100644 --- a/terraform/testdata/plan-for-each/main.tf +++ b/terraform/testdata/plan-for-each/main.tf @@ -10,6 +10,9 @@ resource "aws_instance" "foo" { # sets resource "aws_instance" "bar" { + for_each = toset([]) +} +resource "aws_instance" "bar2" { for_each = toset(list("z", "y", "x")) }