]> www.infradead.org Git - nvme.git/commitdiff
kconfig: call expr_eliminate_yn() at least once in expr_eliminate_dups()
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 7 Jul 2024 15:38:04 +0000 (00:38 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Tue, 16 Jul 2024 07:07:14 +0000 (16:07 +0900)
Kconfig simplifies expressions, but redundant '&&' and '||' operators
involving constant symbols 'y' and 'n' are sometimes trimmed and
sometimes not.

[Test Code]

    config DEP
            def_bool y

    config A
            bool "A"
            depends on DEP && y

    config B
            bool "B"
            depends on DEP && y && y

[Result]

    $ make helpnewconfig
      [ snip ]
    -----

    There is no help available for this option.
    Symbol: A [=n]
    Type  : bool
    Defined at Kconfig:4
      Prompt: A
      Depends on: DEP [=y] && y [=y]
      Location:
        -> A (A [=n])

    -----
    -----

    There is no help available for this option.
    Symbol: B [=n]
    Type  : bool
    Defined at Kconfig:8
      Prompt: B
      Depends on: DEP [=y]
      Location:
        -> B (B [=n])

    -----

The dependency for A, 'DEP && y', remains as-is, while that for B,
'DEP && y && y', has been reduced to 'DEP'.

Currently, expr_eliminate_dups() calls expr_eliminate_yn() only when
trans_count != 0, in other words, only when expr_eliminate_dups1() has
trimmed at least one leaf. It fails to trim a single '&& y', etc.

To fix this inconsistent behavior, expr_eliminate_yn() should be called
at least once even if no leaf has been trimmed.

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

index 6d4b5a5a1e6247c20ab1023eadf0be019b313b8a..b2dfd3123a5deaf3b5ae4e25a4420359c5a6bb44 100644 (file)
@@ -637,7 +637,7 @@ struct expr *expr_eliminate_dups(struct expr *e)
                return e;
 
        oldcount = trans_count;
-       while (1) {
+       do {
                trans_count = 0;
                switch (e->type) {
                case E_OR: case E_AND:
@@ -645,11 +645,8 @@ struct expr *expr_eliminate_dups(struct expr *e)
                default:
                        ;
                }
-               if (!trans_count)
-                       /* No simplifications done in this pass. We're done */
-                       break;
                e = expr_eliminate_yn(e);
-       }
+       } while (trans_count); /* repeat until we get no more simplifications */
        trans_count = oldcount;
        return e;
 }