summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/modules.nix2
-rwxr-xr-xlib/tests/modules.sh3
-rw-r--r--lib/tests/modules/merge-typeless-option.nix25
3 files changed, 29 insertions, 1 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 0bedd28e877..8a145b8f11f 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -624,7 +624,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 c81febb4156..7cc15702569 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -365,6 +365,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 .<no description>. 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 00000000000..627d90b15db
--- /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;
+}