kconfig: turn defaults and additional prompt for choice members into error
authorMasahiro Yamada <masahiroy@kernel.org>
Sat, 4 May 2024 18:33:33 +0000 (03:33 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Thu, 9 May 2024 19:34:53 +0000 (04:34 +0900)
menu_finalize() warns default properties for choice members and prompts
outside the choice block. These should be hard errors.

While I was here, I moved the checks to slim down menu_finalize().

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/kconfig/menu.c
scripts/kconfig/parser.y

index a9b1e451dfe778be0ee2eb6c9a18dfdd5628c99d..bee96c9964fd8cc50fb9ba483f3712225f3b0a1c 100644 (file)
@@ -507,16 +507,6 @@ static void _menu_finalize(struct menu *parent, bool inside_choice)
                    menu->sym && !sym_is_choice_value(menu->sym)) {
                        current_entry = menu;
                        menu->sym->flags |= SYMBOL_CHOICEVAL;
-                       for (prop = menu->sym->prop; prop; prop = prop->next) {
-                               if (prop->type == P_DEFAULT)
-                                       prop_warn(prop, "defaults for choice "
-                                                 "values not supported");
-                               if (prop->menu == menu)
-                                       continue;
-                               if (prop->type == P_PROMPT &&
-                                   prop->menu->parent->sym != sym)
-                                       prop_warn(prop, "choice value used outside its choice group");
-                       }
                        /* Non-tristate choice values of tristate choices must
                         * depend on the choice being set to Y. The choice
                         * values' dependencies were propagated to their
index ed86869e5ed007ee7396b33d21e885f7ca184cf7..ff709001b1f0268ecf475f010b95841b7fdb52db 100644 (file)
@@ -476,6 +476,38 @@ assign_val:
 
 %%
 
+/**
+ * choice_check_sanity - check sanity of a choice member
+ *
+ * @menu: menu of the choice member
+ *
+ * Return: -1 if an error is found, 0 otherwise.
+ */
+static int choice_check_sanity(struct menu *menu)
+{
+       struct property *prop;
+       int ret = 0;
+
+       for (prop = menu->sym->prop; prop; prop = prop->next) {
+               if (prop->type == P_DEFAULT) {
+                       fprintf(stderr, "%s:%d: error: %s",
+                               prop->filename, prop->lineno,
+                               "defaults for choice values not supported\n");
+                       ret = -1;
+               }
+
+               if (prop->menu != menu && prop->type == P_PROMPT &&
+                   prop->menu->parent != menu->parent) {
+                       fprintf(stderr, "%s:%d: error: %s",
+                               prop->filename, prop->lineno,
+                               "choice value has a prompt outside its choice group\n");
+                       ret = -1;
+               }
+       }
+
+       return ret;
+}
+
 void conf_parse(const char *name)
 {
        struct menu *menu;
@@ -523,8 +555,16 @@ void conf_parse(const char *name)
        menu_finalize();
 
        menu_for_each_entry(menu) {
+               struct menu *child;
+
                if (menu->sym && sym_check_deps(menu->sym))
                        yynerrs++;
+
+               if (menu->sym && sym_is_choice(menu->sym)) {
+                       menu_for_each_sub_entry(child, menu)
+                               if (child->sym && choice_check_sanity(child))
+                                       yynerrs++;
+               }
        }
 
        if (yynerrs)