Message ID | 20240504183333.2031860-10-masahiroy@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/10] kconfig: gconf: redraw pane correctly after loading a config file | expand |
On Sun, May 5, 2024 at 3:34 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > 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 | 10 ---------- > scripts/kconfig/parser.y | 39 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 39 insertions(+), 10 deletions(-) > > diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c > index a9b1e451dfe7..bee96c9964fd 100644 > --- a/scripts/kconfig/menu.c > +++ b/scripts/kconfig/menu.c > @@ -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 > diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y > index ed86869e5ed0..0a9e249b5dcc 100644 > --- a/scripts/kconfig/parser.y > +++ b/scripts/kconfig/parser.y > @@ -476,6 +476,37 @@ 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) { > + fprintf(stderr, "%s:%d: error: %s", > + prop->filename, prop->lineno, > + "choice value has a prompt outside its choice group\n"); > + ret = -1; > + } > + } > + > + return ret; > +} > + I observed an error in powerpc. I will fix up this as follows: diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y index 0a9e249b5dcc..ff709001b1f0 100644 --- a/scripts/kconfig/parser.y +++ b/scripts/kconfig/parser.y @@ -496,7 +496,8 @@ static int choice_check_sanity(struct menu *menu) ret = -1; } - if (prop->menu != menu && prop->type == P_PROMPT) { + 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");
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index a9b1e451dfe7..bee96c9964fd 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -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 diff --git a/scripts/kconfig/parser.y b/scripts/kconfig/parser.y index ed86869e5ed0..0a9e249b5dcc 100644 --- a/scripts/kconfig/parser.y +++ b/scripts/kconfig/parser.y @@ -476,6 +476,37 @@ 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) { + 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 +554,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)
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 | 10 ---------- scripts/kconfig/parser.y | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-)