diff --git a/lib/modules.nix b/lib/modules.nix index f16df20425ef..4966619f6630 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -639,7 +639,7 @@ let unmatchedDefns = []; } else if optionDecls != [] then - if all (x: x.options.type.name == "submodule") optionDecls + if all (x: x.options.type.name or null == "submodule") optionDecls # Raw options can only be merged into submodules. Merging into # attrsets might be nice, but ambiguous. Suppose we have # attrset as a `attrsOf submodule`. User declares option diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index 180cca9955e8..4adbd69effbb 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -371,6 +371,9 @@ checkConfigError \ config.set \ ./declare-set.nix ./declare-enable-nested.nix +# Check that that merging of option collisions doesn't depend on type being set +checkConfigError 'The option .group..*would be a parent of the following options, but its type .. does not support nested options.\n\s*- option.s. with prefix .group.enable..*' config.group.enable ./merge-typeless-option.nix + # Test that types.optionType merges types correctly checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix diff --git a/lib/tests/modules/merge-typeless-option.nix b/lib/tests/modules/merge-typeless-option.nix new file mode 100644 index 000000000000..627d90b15db2 --- /dev/null +++ b/lib/tests/modules/merge-typeless-option.nix @@ -0,0 +1,25 @@ +{ lib, ... }: + +let + typeless = + { lib, ... }: + + { + options.group = lib.mkOption { }; + }; + childOfTypeless = + { lib, ... }: + + { + options.group.enable = lib.mkEnableOption "nothing"; + }; +in + +{ + imports = [ + typeless + childOfTypeless + ]; + + config.group.enable = false; +}