about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/modules.nix2
-rwxr-xr-xlib/tests/modules.sh8
-rw-r--r--lib/tests/modules/error-mkOption-in-config.nix14
-rw-r--r--lib/tests/modules/error-mkOption-in-submodule-config.nix12
4 files changed, 36 insertions, 0 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 4acbce39e94d..64939a1eae81 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -275,6 +275,8 @@ let
                 "The option `${optText}' does not exist. Definition values:${defText}";
           in
             if attrNames options == [ "_module" ]
+              # No options were declared at all (`_module` is built in)
+              # but we do have unmatched definitions, and no freeformType (earlier conditions)
               then
                 let
                   optionName = showOption prefix;
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index 0eb976c1f497..4cf9821a3063 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -94,6 +94,14 @@ checkConfigOutput '^true$' config.result ./module-argument-default.nix
 # gvariant
 checkConfigOutput '^true$' config.assertion ./gvariant.nix
 
+# https://github.com/NixOS/nixpkgs/pull/131205
+# We currently throw this error already in `config`, but throwing in `config.wrong1` would be acceptable.
+checkConfigError 'It seems as if you.re trying to declare an option by placing it into .config. rather than .options.' config.wrong1 ./error-mkOption-in-config.nix
+# We currently throw this error already in `config`, but throwing in `config.nest.wrong2` would be acceptable.
+checkConfigError 'It seems as if you.re trying to declare an option by placing it into .config. rather than .options.' config.nest.wrong2 ./error-mkOption-in-config.nix
+checkConfigError 'The option .sub.wrong2. does not exist. Definition values:' config.sub ./error-mkOption-in-submodule-config.nix
+checkConfigError '.*This can happen if you e.g. declared your options in .types.submodule.' config.sub ./error-mkOption-in-submodule-config.nix
+
 # types.pathInStore
 checkConfigOutput '".*/store/0lz9p8xhf89kb1c1kk6jxrzskaiygnlh-bash-5.2-p15.drv"' config.pathInStore.ok1 ./types.nix
 checkConfigOutput '".*/store/0fb3ykw9r5hpayd05sr0cizwadzq1d8q-bash-5.2-p15"' config.pathInStore.ok2 ./types.nix
diff --git a/lib/tests/modules/error-mkOption-in-config.nix b/lib/tests/modules/error-mkOption-in-config.nix
new file mode 100644
index 000000000000..2d78cd8db8ba
--- /dev/null
+++ b/lib/tests/modules/error-mkOption-in-config.nix
@@ -0,0 +1,14 @@
+{ lib, ... }:
+let
+  inherit (lib) mkOption;
+in
+{
+  wrong1 = mkOption {
+  };
+  # This is not actually reported separately, so could be omitted from the test
+  # but it makes the example more realistic.
+  # Making it parse this _config_ as options would too risky. What if it's not
+  # options but other values, that abort, throw, diverge, etc?
+  nest.wrong2 = mkOption {
+  };
+}
diff --git a/lib/tests/modules/error-mkOption-in-submodule-config.nix b/lib/tests/modules/error-mkOption-in-submodule-config.nix
new file mode 100644
index 000000000000..91ac3d65780a
--- /dev/null
+++ b/lib/tests/modules/error-mkOption-in-submodule-config.nix
@@ -0,0 +1,12 @@
+{ lib, ... }:
+let
+  inherit (lib) mkOption;
+in
+{
+  options.sub = lib.mkOption {
+    type = lib.types.submodule {
+      wrong2 = mkOption {};
+    };
+    default = {};
+  };
+}