On Sun, Jun 2, 2024 at 9:54 PM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote: > > I previously submitted a fix for a bug in the choice feature [1], where > I mentioned, "Another (much cleaner) approach would be to remove the > tristate choice support entirely". > > There are more issues in the tristate choice feature. For example, you > can observe a couple of bugs in the following test code. > > [Test Code] > > config MODULES > def_bool y > modules > > choice > prompt "tristate choice" > default A > > config A > tristate "A" > > config B > tristate "B" > > endchoice > > [Bug 1] the 'default' property is not correctly processed > > 'make alldefconfig' produces: > > CONFIG_MODULES=y > # CONFIG_A is not set > # CONFIG_B is not set > > However, the correct output should be: > > CONFIG_MODULES=y > CONFIG_A=y > # CONFIG_B is not set > > The unit test file, scripts/kconfig/tests/choice/alldef_expected_config, > is wrong as well. > > [Bug 2] choice members never get 'y' with randconfig > > For the test code above, the following combinations are possible: > > A B > (1) y n > (2) n y > (3) m m > (4) m n > (5) n m > (6) n n > > 'make randconfig' never produces (1) or (2). > > These bugs are fixable, but a more critical problem is the lack of a > sensible syntax to specify the default for the tristate choice. > The default for the choice must be one of the choice members, which > cannot specify any of the patterns (3) through (6) above. > > In addition, I have never seen it being used in a useful way. > > The following commits removed unnecessary use of tristate choices: > > - df8df5e4bc37 ("usb: get rid of 'choice' for legacy gadget drivers") > - bfb57ef0544a ("rapidio: remove choice for enumeration") > > This commit removes the tristate choice support entirely, which allows > me to delete a lot of code, making further refactoring easier. > > This includes the revert of commit fa64e5f6a35e ("kconfig/symbol.c: > handle choice_values that depend on 'm' symbols"). It was suspicious > because it did not address the root cause but introduced inconsistency > in visibility between choice members and other symbols. > > [1]: https://lore.kernel.org/linux-kbuild/20240427104231.2728905-1-masahiroy@xxxxxxxxxx/T/#m0a1bb6992581462ceca861b409bb33cb8fd7dbae > > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- I will fix a couple of mistakes. > diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c > index baa1c512de3c..217f85ea0910 100644 > --- a/scripts/kconfig/gconf.c > +++ b/scripts/kconfig/gconf.c > @@ -1067,10 +1067,7 @@ static gchar **fill_row(struct menu *menu) > row[COL_VALUE] = > g_strdup(menu_get_prompt(def_menu)); > > - if (sym_get_type(sym) == S_BOOLEAN) { > - row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); > - return row; > - } > + return row; I accidentally dropped row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); I will restore it. The intention is to drop the if-condition that is always met. > @@ -479,7 +461,7 @@ void sym_calc_value(struct symbol *sym) > } > > sym->curr = newval; > - if (sym_is_choice(sym) && newval.tri == yes) > + if (sym_is_choice(sym)) > sym->curr.val = sym_calc_choice(sym); > sym_validate_range(sym); > I will keep "&& newval.tri == yes" here. When a choice block is hidden by 'depends on', there is no need to call sym_calc_choice(). -- Best Regards Masahiro Yamada