kconfig: print recursive dependency errors in the parsed order
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 11 Feb 2024 12:41:04 +0000 (21:41 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Tue, 20 Feb 2024 11:47:45 +0000 (20:47 +0900)
for_all_symbols() iterates in the symbol hash table. The order of
iteration depends on the hash table implementation.

If you use it for printing errors, they are shown in random order.

For example, the order of following test input and the corresponding
error do not match:
 - scripts/kconfig/tests/err_recursive_dep/Kconfig
 - scripts/kconfig/tests/err_recursive_dep/expected_stderr

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/kconfig/parser.y
scripts/kconfig/tests/err_recursive_dep/expected_stderr

index e58c24d2e5abe6acc46671ce10a3d48209ddd8ee..efd0e234e0d28c9087ac65d3a3b55c03a5937e14 100644 (file)
@@ -473,8 +473,7 @@ assign_val:
 
 void conf_parse(const char *name)
 {
-       struct symbol *sym;
-       int i;
+       struct menu *menu;
 
        autoconf_cmd = str_new();
 
@@ -517,10 +516,23 @@ void conf_parse(const char *name)
        }
 
        menu_finalize(&rootmenu);
-       for_all_symbols(i, sym) {
-               if (sym_check_deps(sym))
+
+       menu = &rootmenu;
+       while (menu) {
+               if (menu->sym && sym_check_deps(menu->sym))
                        yynerrs++;
+
+               if (menu->list) {
+                       menu = menu->list;
+                       continue;
+               }
+
+               while (!menu->next && menu->parent)
+                       menu = menu->parent;
+
+               menu = menu->next;
        }
+
        if (yynerrs)
                exit(1);
        conf_set_changed(true);
index c9f4abf9a79160652691f465b67a2e0029ec6645..05d4ced703206f8d10ed0d34f78a4957bb53b678 100644 (file)
@@ -1,10 +1,10 @@
-Kconfig:11:error: recursive dependency detected!
-Kconfig:11:    symbol B is selected by B
+Kconfig:5:error: recursive dependency detected!
+Kconfig:5:     symbol A depends on A
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:5:error: recursive dependency detected!
-Kconfig:5:     symbol A depends on A
+Kconfig:11:error: recursive dependency detected!
+Kconfig:11:    symbol B is selected by B
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
@@ -14,9 +14,9 @@ Kconfig:21:   symbol C2 depends on C1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:32:error: recursive dependency detected!
-Kconfig:32:    symbol D2 is selected by D1
+Kconfig:27:error: recursive dependency detected!
 Kconfig:27:    symbol D1 depends on D2
+Kconfig:32:    symbol D2 is selected by D1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
@@ -26,13 +26,13 @@ Kconfig:42: symbol E2 is implied by E1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:60:error: recursive dependency detected!
-Kconfig:60:    symbol G depends on G
+Kconfig:49:error: recursive dependency detected!
+Kconfig:49:    symbol F1 default value contains F2
+Kconfig:51:    symbol F2 depends on F1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:51:error: recursive dependency detected!
-Kconfig:51:    symbol F2 depends on F1
-Kconfig:49:    symbol F1 default value contains F2
+Kconfig:60:error: recursive dependency detected!
+Kconfig:60:    symbol G depends on G
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"