diff --git a/lib/modules.nix b/lib/modules.nix index ff286ad7c4b2..9dfcc6086f41 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -1322,13 +1322,24 @@ let : 1\. Function argument */ pushDownProperties = + let + mapAttrsIfAttrs = + f: val: + if isAttrs val then + mapAttrs f val + else + # This does not actually work, since arriving here means we have e.g. + # (lib.mkIf cond nonAttrs), while an attrset is expected. However, + # avoiding the mapAttrs call here gives better errors later. + val; + in cfg: if cfg._type or "" == "merge" then concatMap pushDownProperties cfg.contents else if cfg._type or "" == "if" then - map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content) + map (mapAttrsIfAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content) else if cfg._type or "" == "override" then - map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content) + map (mapAttrsIfAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content) # FIXME: handle mkOrder? else [ cfg ]; diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index bc89d4c20851..efa2d2034090 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -171,6 +171,8 @@ checkConfigError() { # Shorthand meta attribute does not duplicate the config checkConfigOutput '^"one two"$' config.result ./shorthand-meta.nix +checkConfigError "In module .*test-push-down-non-attrs.nix., you're trying to define a value of type \`bool'\n\s*rather than an attribute set for the option" config ./test-push-down-non-attrs.nix + checkConfigOutput '^true$' config.result ./test-mergeAttrDefinitionsWithPrio.nix # Check that a module argument is passed, also when a default is available diff --git a/lib/tests/modules/test-push-down-non-attrs.nix b/lib/tests/modules/test-push-down-non-attrs.nix new file mode 100644 index 000000000000..ce9222ca3cfd --- /dev/null +++ b/lib/tests/modules/test-push-down-non-attrs.nix @@ -0,0 +1,5 @@ +{ lib, ... }: + +{ + config = lib.mkIf true true; +}