From ece3e4fd5bb9eae336f580fc924c2b585150c2fa Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Sat, 31 Jan 2026 16:17:13 +0100 Subject: [PATCH 1/2] [tests][dune] add tests with API "re-exports" When designing a lib, one may want to explictly expose some submodules as part of its API. While doing so, some parts of these submodules may remain hidden from the API but exposed by the submodules for internal use. Reporting on values in a library API and submodules must remain actionable. Therefore, the semantic is: - For a value defined in the submodule, account for all the uses internal to the library but the ones in the submodule itself (unless there is no interface or the `--internal` option is used, as usual). Among those uses, re-expositions count. I.e. if the value is exposed by the API, then this counts as a use because it is required. - For a submodule's value exposed in the API, account for all the uses external to the library. Uses of an API value must not be propagated to the submodule's value. This is currently the case e.g. in the threshold-3-0.5 test scenario which expects `./examples/using_dune/reduced_lib/values.mli:1: used` in the exported values used 2 times. It is used inside `Value`, and by requirement for `Reduced_lib.Values` API. Its re-export (`Reduced_lib.Values.used`) is outside the library in `examples/using_dune/reduced_lib/values.ml`. Hence, a submodule's value explicitly exposed in the API cannot be reported as unused while the API's value may be. This is coherent with the general value reporting semantic. --- check/classic/classic.exp | 15 ++++ check/classic/classic.ref | 19 ++++- check/internal/internal.exp | 13 ++++ check/internal/internal.ref | 17 ++++- check/threshold-1/threshold-1.exp | 44 +++++++++++ check/threshold-1/threshold-1.ref | 52 ++++++++++++- check/threshold-3-0.5/threshold-3-0.5.exp | 57 +++++++++++++++ check/threshold-3-0.5/threshold-3-0.5.ref | 73 ++++++++++++++++++- examples/using_dune/bin/dune | 5 +- .../using_dune/bin/use_preprocessed_lib/dune | 3 +- examples/using_dune/bin/use_reduced_lib/dune | 3 + .../bin/use_reduced_lib/use_reduced_lib.ml | 9 +++ .../bin/use_reduced_lib/use_reduced_lib.mli | 2 + .../bin/use_reduced_lib/use_values.ml | 8 ++ .../bin/use_reduced_lib/use_values.mli | 1 + .../use_values_in_submodules.ml | 8 ++ .../use_values_in_submodules.mli | 1 + .../use_values_in_submodules_no_intf.ml | 8 ++ .../use_values_in_submodules_no_intf.mli | 1 + .../bin/use_reduced_lib/use_values_no_intf.ml | 8 ++ .../use_reduced_lib/use_values_no_intf.mli | 1 + .../using_dune/bin/use_unwrapped_lib/dune | 3 +- examples/using_dune/bin/use_wrapped_lib/dune | 3 +- examples/using_dune/bin/using_dune.ml | 3 +- examples/using_dune/reduced_lib/README.md | 33 +++++++++ examples/using_dune/reduced_lib/dune | 4 + .../using_dune/reduced_lib/reduced_lib.ml | 14 ++++ .../using_dune/reduced_lib/reduced_lib.mli | 31 ++++++++ examples/using_dune/reduced_lib/values.ml | 17 +++++ examples/using_dune/reduced_lib/values.mli | 9 +++ .../reduced_lib/values_in_submodules.ml | 34 +++++++++ .../reduced_lib/values_in_submodules.mli | 11 +++ .../values_in_submodules_no_intf.ml | 20 +++++ .../using_dune/reduced_lib/values_no_intf.ml | 17 +++++ 34 files changed, 527 insertions(+), 20 deletions(-) create mode 100644 examples/using_dune/bin/use_reduced_lib/dune create mode 100644 examples/using_dune/bin/use_reduced_lib/use_reduced_lib.ml create mode 100644 examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values.ml create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values.mli create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.ml create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.ml create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_no_intf.ml create mode 100644 examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli create mode 100644 examples/using_dune/reduced_lib/README.md create mode 100644 examples/using_dune/reduced_lib/dune create mode 100644 examples/using_dune/reduced_lib/reduced_lib.ml create mode 100644 examples/using_dune/reduced_lib/reduced_lib.mli create mode 100644 examples/using_dune/reduced_lib/values.ml create mode 100644 examples/using_dune/reduced_lib/values.mli create mode 100644 examples/using_dune/reduced_lib/values_in_submodules.ml create mode 100644 examples/using_dune/reduced_lib/values_in_submodules.mli create mode 100644 examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml create mode 100644 examples/using_dune/reduced_lib/values_no_intf.ml diff --git a/check/classic/classic.exp b/check/classic/classic.exp index a67970af..7d7dce5b 100644 --- a/check/classic/classic.exp +++ b/check/classic/classic.exp @@ -5,6 +5,21 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:38: internally_used_f ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg diff --git a/check/classic/classic.ref b/check/classic/classic.ref index ec63591b..1a7e8a02 100644 --- a/check/classic/classic.ref +++ b/check/classic/classic.ref @@ -5,6 +5,21 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:38: internally_used_f ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg @@ -550,7 +565,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 477 -Success: 477 +Total: 491 +Success: 491 Failed: 0 Ratio: 100.% diff --git a/check/internal/internal.exp b/check/internal/internal.exp index a339bccc..266dd6e9 100644 --- a/check/internal/internal.exp +++ b/check/internal/internal.exp @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int diff --git a/check/internal/internal.ref b/check/internal/internal.ref index 7701a714..61168480 100644 --- a/check/internal/internal.ref +++ b/check/internal/internal.ref @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int @@ -517,7 +530,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 446 -Success: 446 +Total: 458 +Success: 458 Failed: 0 Ratio: 100.% diff --git a/check/threshold-1/threshold-1.exp b/check/threshold-1/threshold-1.exp index 2745c37a..3ee1152d 100644 --- a/check/threshold-1/threshold-1.exp +++ b/check/threshold-1/threshold-1.exp @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int @@ -75,6 +88,12 @@ ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli:1: mark_used + ./examples/using_dune/bin/use_unwrapped_lib/use_builder_sig_api.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_constructors.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_include_modtype.mli:1: mark_used @@ -112,6 +131,31 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:4: internally_used ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:5: externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:2: Values.used +./examples/using_dune/reduced_lib/reduced_lib.mli:5: Values.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:9: Values_no_intf.used +./examples/using_dune/reduced_lib/reduced_lib.mli:12: Values_no_intf.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:17: Values_in_submodules.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:20: Values_in_submodules.Exported.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used +./examples/using_dune/reduced_lib/values.mli:2: used_by_API +./examples/using_dune/reduced_lib/values.mli:4: externally_used +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:14: externally_used_fun_with_single_never_used_opt_arg diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index 917c6460..77e006b5 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int @@ -75,6 +88,12 @@ ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli:1: mark_used + ./examples/using_dune/bin/use_unwrapped_lib/use_builder_sig_api.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_constructors.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_include_modtype.mli:1: mark_used @@ -112,6 +131,31 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:4: internally_used ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:5: externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:2: Values.used +./examples/using_dune/reduced_lib/reduced_lib.mli:5: Values.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:9: Values_no_intf.used +./examples/using_dune/reduced_lib/reduced_lib.mli:12: Values_no_intf.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:17: Values_in_submodules.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:20: Values_in_submodules.Exported.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used +./examples/using_dune/reduced_lib/values.mli:2: used_by_API +./examples/using_dune/reduced_lib/values.mli:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:14: externally_used_fun_with_single_never_used_opt_arg @@ -829,7 +873,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 721 -Success: 721 -Failed: 0 -Ratio: 100.% +Total: 762 +Success: 758 +Failed: 4 +Ratio: 99.4750656168% diff --git a/check/threshold-3-0.5/threshold-3-0.5.exp b/check/threshold-3-0.5/threshold-3-0.5.exp index 9e56bc16..9a443ecb 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.exp +++ b/check/threshold-3-0.5/threshold-3-0.5.exp @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int @@ -75,6 +88,12 @@ ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli:1: mark_used + ./examples/using_dune/bin/use_unwrapped_lib/use_builder_sig_api.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_constructors.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_include_modtype.mli:1: mark_used @@ -112,6 +131,31 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:4: internally_used ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:5: externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:2: Values.used +./examples/using_dune/reduced_lib/reduced_lib.mli:5: Values.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:9: Values_no_intf.used +./examples/using_dune/reduced_lib/reduced_lib.mli:12: Values_no_intf.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:17: Values_in_submodules.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:20: Values_in_submodules.Exported.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used +./examples/using_dune/reduced_lib/values.mli:2: used_by_API +./examples/using_dune/reduced_lib/values.mli:4: externally_used +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:14: externally_used_fun_with_single_never_used_opt_arg @@ -252,6 +296,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:59: internally_used_f ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:64: externally_used_f +./examples/using_dune/reduced_lib/values.mli:1: used +./examples/using_dune/reduced_lib/values.mli:3: internally_used +./examples/using_dune/reduced_lib/values.mli:6: lib_internal_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used +./examples/using_dune/reduced_lib/values_in_submodules.mli:4: Exported.internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:7: Exported.lib_internal_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:4: Exported.internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:7: Exported.lib_internal_used +./examples/using_dune/reduced_lib/values_no_intf.ml:1: used +./examples/using_dune/reduced_lib/values_no_intf.ml:3: internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:10: lib_internal_used + ./examples/using_dune/unwrapped_lib/obj/with_class.mli:33: fun_class_factory ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:2: used_fun_with_single_explicitly_discarded_opt_arg diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index 92f148e9..ef11222b 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -3,6 +3,19 @@ ./examples/using_dune/preprocessed_lib/preprocessed.mli:1: unused ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:2: unused +./examples/using_dune/reduced_lib/reduced_lib.mli:3: Values.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:4: Values.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:10: Values_no_intf.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:11: Values_no_intf.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:18: Values_in_submodules.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:19: Values_in_submodules.Exported.internally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:27: Values_in_submodules_no_intf.Exported.used_by_API +./examples/using_dune/reduced_lib/reduced_lib.mli:28: Values_in_submodules_no_intf.Exported.internally_used +./examples/using_dune/reduced_lib/values.mli:7: lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules.mli:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:8: Exported.lib_internal_unused +./examples/using_dune/reduced_lib/values_no_intf.ml:11: lib_internal_unused + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:1: unused_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/values/values.mli:2: unused_int @@ -75,6 +88,12 @@ ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_lib.mli:1: mark_used ./examples/using_dune/bin/use_preprocessed_lib/use_preprocessed_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli:1: mark_used +./examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli:1: mark_used + ./examples/using_dune/bin/use_unwrapped_lib/use_builder_sig_api.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_constructors.mli:1: mark_used ./examples/using_dune/bin/use_unwrapped_lib/use_include_modtype.mli:1: mark_used @@ -112,6 +131,31 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:4: internally_used ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:5: externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:2: Values.used +./examples/using_dune/reduced_lib/reduced_lib.mli:5: Values.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:9: Values_no_intf.used +./examples/using_dune/reduced_lib/reduced_lib.mli:12: Values_no_intf.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:17: Values_in_submodules.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:20: Values_in_submodules.Exported.externally_used +./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used +./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used +./examples/using_dune/reduced_lib/values.mli:2: used_by_API +./examples/using_dune/reduced_lib/values.mli:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used +./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used + ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:8: internally_used_fun_with_single_never_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:10: internally_used_fun_with_single_always_used_opt_arg ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:14: externally_used_fun_with_single_never_used_opt_arg @@ -252,6 +296,23 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:59: internally_used_f ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:64: externally_used_f +./examples/using_dune/reduced_lib/values.mli:1: used: Not detected +./examples/using_dune/reduced_lib/values.mli:3: internally_used +./examples/using_dune/reduced_lib/values.mli:4: externally_used: Should not be detected +./examples/using_dune/reduced_lib/values.mli:6: lib_internal_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:4: Exported.internally_used +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Should not be detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:7: Exported.lib_internal_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:4: Exported.internally_used +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Should not be detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:7: Exported.lib_internal_used +./examples/using_dune/reduced_lib/values_no_intf.ml:1: used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:3: internally_used +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Should not be detected +./examples/using_dune/reduced_lib/values_no_intf.ml:10: lib_internal_used + ./examples/using_dune/unwrapped_lib/obj/with_class.mli:33: fun_class_factory ./examples/using_dune/unwrapped_lib/opt_args/opt_args.mli:2: used_fun_with_single_explicitly_discarded_opt_arg @@ -335,6 +396,10 @@ .>-> ALMOST UNUSED EXPORTED VALUES: Called 3 time(s): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +./examples/using_dune/reduced_lib/values.mli:1: used: Should not be detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used: Should not be detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used: Should not be detected +./examples/using_dune/reduced_lib/values_no_intf.ml:1: used: Should not be detected ./examples/using_dune/unwrapped_lib/values/values_no_intf.ml:19: aliased_fun ./examples/using_dune/wrapped_lib/values/values_no_intf.ml:19: aliased_fun @@ -1198,7 +1263,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1018 -Success: 1018 -Failed: 0 -Ratio: 100.% +Total: 1079 +Success: 1063 +Failed: 16 +Ratio: 98.5171455051% diff --git a/examples/using_dune/bin/dune b/examples/using_dune/bin/dune index f017946c..3dfbbf7f 100644 --- a/examples/using_dune/bin/dune +++ b/examples/using_dune/bin/dune @@ -1,3 +1,6 @@ (executable (name using_dune) - (libraries use_unwrapped_lib use_wrapped_lib use_preprocessed_lib)) + (libraries use_unwrapped_lib + use_wrapped_lib + use_preprocessed_lib + use_reduced_lib)) diff --git a/examples/using_dune/bin/use_preprocessed_lib/dune b/examples/using_dune/bin/use_preprocessed_lib/dune index ae525d45..8f4d02f2 100644 --- a/examples/using_dune/bin/use_preprocessed_lib/dune +++ b/examples/using_dune/bin/use_preprocessed_lib/dune @@ -1,4 +1,3 @@ (library (name use_preprocessed_lib) - (libraries preprocessed_lib) - (wrapped false)) + (libraries preprocessed_lib)) diff --git a/examples/using_dune/bin/use_reduced_lib/dune b/examples/using_dune/bin/use_reduced_lib/dune new file mode 100644 index 00000000..36c7459a --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/dune @@ -0,0 +1,3 @@ +(library + (name use_reduced_lib) + (libraries reduced_lib)) diff --git a/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.ml b/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.ml new file mode 100644 index 00000000..4d28532f --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.ml @@ -0,0 +1,9 @@ +let () = + Use_values.mark_used (); + Use_values_no_intf.mark_used (); + Use_values_in_submodules.mark_used (); + Use_values_in_submodules_no_intf.mark_used () + +let is_used = ref false +let mark_used () = + is_used := true diff --git a/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli b/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli new file mode 100644 index 00000000..b63a1116 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_reduced_lib.mli @@ -0,0 +1,2 @@ +val mark_used : unit -> unit + diff --git a/examples/using_dune/bin/use_reduced_lib/use_values.ml b/examples/using_dune/bin/use_reduced_lib/use_values.ml new file mode 100644 index 00000000..e3dae9f8 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values.ml @@ -0,0 +1,8 @@ +(* extenal uses with explicit module *) +let () = + ignore Reduced_lib.Values.used; + ignore Reduced_lib.Values.externally_used + +let is_used = ref false +let mark_used () = + is_used := true diff --git a/examples/using_dune/bin/use_reduced_lib/use_values.mli b/examples/using_dune/bin/use_reduced_lib/use_values.mli new file mode 100644 index 00000000..f84c4cb5 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values.mli @@ -0,0 +1 @@ +val mark_used : unit -> unit diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.ml b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.ml new file mode 100644 index 00000000..457d051e --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.ml @@ -0,0 +1,8 @@ +(* extenal uses with explicit module *) +let () = + ignore Reduced_lib.Values_in_submodules.Exported.used; + ignore Reduced_lib.Values_in_submodules.Exported.externally_used + +let is_used = ref false +let mark_used () = + is_used := true diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli new file mode 100644 index 00000000..f84c4cb5 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules.mli @@ -0,0 +1 @@ +val mark_used : unit -> unit diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.ml b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.ml new file mode 100644 index 00000000..964591c8 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.ml @@ -0,0 +1,8 @@ +(* extenal uses with explicit module *) +let () = + ignore Reduced_lib.Values_in_submodules_no_intf.Exported.used; + ignore Reduced_lib.Values_in_submodules_no_intf.Exported.externally_used + +let is_used = ref false +let mark_used () = + is_used := true diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli new file mode 100644 index 00000000..f84c4cb5 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_in_submodules_no_intf.mli @@ -0,0 +1 @@ +val mark_used : unit -> unit diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.ml b/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.ml new file mode 100644 index 00000000..b029ba6c --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.ml @@ -0,0 +1,8 @@ +(* extenal uses with explicit module *) +let () = + ignore Reduced_lib.Values_no_intf.used; + ignore Reduced_lib.Values_no_intf.externally_used + +let is_used = ref false +let mark_used () = + is_used := true diff --git a/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli b/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli new file mode 100644 index 00000000..f84c4cb5 --- /dev/null +++ b/examples/using_dune/bin/use_reduced_lib/use_values_no_intf.mli @@ -0,0 +1 @@ +val mark_used : unit -> unit diff --git a/examples/using_dune/bin/use_unwrapped_lib/dune b/examples/using_dune/bin/use_unwrapped_lib/dune index 3f9c000f..8543b15a 100644 --- a/examples/using_dune/bin/use_unwrapped_lib/dune +++ b/examples/using_dune/bin/use_unwrapped_lib/dune @@ -1,4 +1,3 @@ (library (name use_unwrapped_lib) - (libraries unwrapped_lib) - (wrapped false)) + (libraries unwrapped_lib)) diff --git a/examples/using_dune/bin/use_wrapped_lib/dune b/examples/using_dune/bin/use_wrapped_lib/dune index 398ee24e..0f777f5f 100644 --- a/examples/using_dune/bin/use_wrapped_lib/dune +++ b/examples/using_dune/bin/use_wrapped_lib/dune @@ -1,4 +1,3 @@ (library (name use_wrapped_lib) - (libraries wrapped_lib) - (wrapped true)) + (libraries wrapped_lib)) diff --git a/examples/using_dune/bin/using_dune.ml b/examples/using_dune/bin/using_dune.ml index fd6d8433..43435987 100644 --- a/examples/using_dune/bin/using_dune.ml +++ b/examples/using_dune/bin/using_dune.ml @@ -1,4 +1,5 @@ let () = Use_unwrapped_lib.mark_used (); Use_wrapped_lib.mark_used (); - Use_preprocessed_lib.mark_used () + Use_preprocessed_lib.mark_used (); + Use_reduced_lib.mark_used () diff --git a/examples/using_dune/reduced_lib/README.md b/examples/using_dune/reduced_lib/README.md new file mode 100644 index 00000000..e64438e7 --- /dev/null +++ b/examples/using_dune/reduced_lib/README.md @@ -0,0 +1,33 @@ +This library is used to test 2 things : +1. That values defined in the library's submodules and not exposed in the + library's API are tracked correctly and reported at locations in + the submodules +2. That values defined in the library's submodules and those exposed in the + library's API are "decoupled" : + - If a value is unused outside the library, then it is reported at a + location in the library's interface (and not the submodule's). + - The submodules' values are "used by the type" of the library. I.e. because + the library expose them in its API, then they must exist in the + submodules. Thus, they are used by the API's requirements and must not be + reported as unused. + +The intent is to avoid duplicated reports and provide actually actionable +results. +E.g. Instead of +``` +some_lib.mli:12: Foo.x +foo.mli:3: x +``` +only report +``` +some_lib.mli:12: Foo.x +``` +Once `Some_lib.Foo.x` is removed from `Some_lib`'s API, a new run of the +`dead_code_analyzer` would be able to report +``` +foo.mli:3: x +``` + +In this library's submodules, the values prefixed by `lib_internal` are not +exposed by the API but still exported by the submodules. All the other exported +values are re-exposed in `Reduced_lib`'s API. diff --git a/examples/using_dune/reduced_lib/dune b/examples/using_dune/reduced_lib/dune new file mode 100644 index 00000000..0b6e98e5 --- /dev/null +++ b/examples/using_dune/reduced_lib/dune @@ -0,0 +1,4 @@ +(library + (name reduced_lib) + (flags (:standard -warn-error -A)) + (wrapped true)) diff --git a/examples/using_dune/reduced_lib/reduced_lib.ml b/examples/using_dune/reduced_lib/reduced_lib.ml new file mode 100644 index 00000000..9b3182c0 --- /dev/null +++ b/examples/using_dune/reduced_lib/reduced_lib.ml @@ -0,0 +1,14 @@ +module Values = Values +module Values_no_intf = Values_no_intf +module Values_in_submodules = Values_in_submodules +module Values_in_submodules_no_intf = Values_in_submodules_no_intf + +let () = + ignore Values.lib_internal_used; + ignore Values.lib_internal_externally_used; + ignore Values_no_intf.lib_internal_used; + ignore Values_no_intf.lib_internal_externally_used; + ignore Values_in_submodules.Exported.lib_internal_used; + ignore Values_in_submodules.Exported.lib_internal_externally_used; + ignore Values_in_submodules_no_intf.Exported.lib_internal_used; + ignore Values_in_submodules_no_intf.Exported.lib_internal_externally_used diff --git a/examples/using_dune/reduced_lib/reduced_lib.mli b/examples/using_dune/reduced_lib/reduced_lib.mli new file mode 100644 index 00000000..f9da083c --- /dev/null +++ b/examples/using_dune/reduced_lib/reduced_lib.mli @@ -0,0 +1,31 @@ +module Values : sig + val used : int + val used_by_API : int + val internally_used : int + val externally_used : int +end + +module Values_no_intf : sig + val used : int + val used_by_API : int + val internally_used : int + val externally_used : int +end + +module Values_in_submodules : sig + module Exported : sig + val used : int + val used_by_API : int + val internally_used : int + val externally_used : int + end +end + +module Values_in_submodules_no_intf : sig + module Exported : sig + val used : int + val used_by_API : int + val internally_used : int + val externally_used : int + end +end diff --git a/examples/using_dune/reduced_lib/values.ml b/examples/using_dune/reduced_lib/values.ml new file mode 100644 index 00000000..31621a8f --- /dev/null +++ b/examples/using_dune/reduced_lib/values.ml @@ -0,0 +1,17 @@ +let used = 42 +let used_by_API = 42 +let internally_used = 42 +let externally_used = 42 + +let () = + ignore used; + ignore internally_used + +let lib_internal_used = 42 +let lib_internal_unused = 42 +let lib_internal_internally_used = 42 +let lib_internal_externally_used = 42 + +let () = + ignore lib_internal_used; + ignore lib_internal_internally_used diff --git a/examples/using_dune/reduced_lib/values.mli b/examples/using_dune/reduced_lib/values.mli new file mode 100644 index 00000000..2d58d6e3 --- /dev/null +++ b/examples/using_dune/reduced_lib/values.mli @@ -0,0 +1,9 @@ +val used : int +val used_by_API : int +val internally_used : int +val externally_used : int + +val lib_internal_used : int +val lib_internal_unused : int +val lib_internal_internally_used : int +val lib_internal_externally_used : int diff --git a/examples/using_dune/reduced_lib/values_in_submodules.ml b/examples/using_dune/reduced_lib/values_in_submodules.ml new file mode 100644 index 00000000..8b51ea08 --- /dev/null +++ b/examples/using_dune/reduced_lib/values_in_submodules.ml @@ -0,0 +1,34 @@ +module Unexported = struct + let used = 42 + let unused = 42 +end + +module Exported = struct + module Private = struct + let used = 42 + let unused = 42 + end + + let used = 42 + let used_by_API = 42 + let internally_used = 42 + let externally_used = 42 + + let lib_internal_used = 42 + let lib_internal_unused = 42 + let lib_internal_internally_used = 42 + let lib_internal_externally_used = 42 + +end + +let () = ignore Unexported.used + +let () = ignore Exported.Private.used + +let () = + ignore Exported.used; + ignore Exported.internally_used + +let () = + ignore Exported.lib_internal_used; + ignore Exported.lib_internal_internally_used diff --git a/examples/using_dune/reduced_lib/values_in_submodules.mli b/examples/using_dune/reduced_lib/values_in_submodules.mli new file mode 100644 index 00000000..7d9498d8 --- /dev/null +++ b/examples/using_dune/reduced_lib/values_in_submodules.mli @@ -0,0 +1,11 @@ +module Exported : sig + val used : int + val used_by_API : int + val internally_used : int + val externally_used : int + + val lib_internal_used : int + val lib_internal_unused : int + val lib_internal_internally_used : int + val lib_internal_externally_used : int +end diff --git a/examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml b/examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml new file mode 100644 index 00000000..861496fc --- /dev/null +++ b/examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml @@ -0,0 +1,20 @@ +module Exported = struct + let used = 42 + let used_by_API = 42 + let internally_used = 42 + let externally_used = 42 + + let lib_internal_used = 42 + let lib_internal_unused = 42 + let lib_internal_internally_used = 42 + let lib_internal_externally_used = 42 + +end + +let () = + ignore Exported.used; + ignore Exported.internally_used + +let () = + ignore Exported.lib_internal_used; + ignore Exported.lib_internal_internally_used diff --git a/examples/using_dune/reduced_lib/values_no_intf.ml b/examples/using_dune/reduced_lib/values_no_intf.ml new file mode 100644 index 00000000..31621a8f --- /dev/null +++ b/examples/using_dune/reduced_lib/values_no_intf.ml @@ -0,0 +1,17 @@ +let used = 42 +let used_by_API = 42 +let internally_used = 42 +let externally_used = 42 + +let () = + ignore used; + ignore internally_used + +let lib_internal_used = 42 +let lib_internal_unused = 42 +let lib_internal_internally_used = 42 +let lib_internal_externally_used = 42 + +let () = + ignore lib_internal_used; + ignore lib_internal_internally_used From a086879b6848bbbf60fc7530d72661123f2b4d7b Mon Sep 17 00:00:00 2001 From: Corentin De Souza <9597216+fantazio@users.noreply.github.com> Date: Mon, 9 Feb 2026 13:43:38 +0100 Subject: [PATCH 2/2] [src][deadCode] do not propagate uses on re-exports A "re-export" uses used to be propagated to the re-exported values. This propagation is order dependent. That is, all the uses that have been seen before the propagation happens are propagated, but future re-exports are not. The propagation was happening during the analysis of the module that re-exports the value. To fit the strenghtened semantics, the uses of a re-exported value must not be propagated. Only the re-export counts as a use. Thanks to this semantic, the associated reports do not depend on the order in which files are analyzed anymore. --- check/threshold-1/threshold-1.ref | 14 +++++----- check/threshold-3-0.5/threshold-3-0.5.ref | 32 +++++++++-------------- src/deadCode.ml | 3 ++- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/check/threshold-1/threshold-1.ref b/check/threshold-1/threshold-1.ref index 77e006b5..b1d8443f 100644 --- a/check/threshold-1/threshold-1.ref +++ b/check/threshold-1/threshold-1.ref @@ -140,19 +140,19 @@ ./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used ./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used ./examples/using_dune/reduced_lib/values.mli:2: used_by_API -./examples/using_dune/reduced_lib/values.mli:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values.mli:4: externally_used ./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used ./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API -./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API -./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API -./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used @@ -874,6 +874,6 @@ Nothing else to report in this section Total: 762 -Success: 758 -Failed: 4 -Ratio: 99.4750656168% +Success: 762 +Failed: 0 +Ratio: 100.% diff --git a/check/threshold-3-0.5/threshold-3-0.5.ref b/check/threshold-3-0.5/threshold-3-0.5.ref index ef11222b..1b6277b2 100644 --- a/check/threshold-3-0.5/threshold-3-0.5.ref +++ b/check/threshold-3-0.5/threshold-3-0.5.ref @@ -140,19 +140,19 @@ ./examples/using_dune/reduced_lib/reduced_lib.mli:26: Values_in_submodules_no_intf.Exported.used ./examples/using_dune/reduced_lib/reduced_lib.mli:29: Values_in_submodules_no_intf.Exported.externally_used ./examples/using_dune/reduced_lib/values.mli:2: used_by_API -./examples/using_dune/reduced_lib/values.mli:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values.mli:4: externally_used ./examples/using_dune/reduced_lib/values.mli:8: lib_internal_internally_used ./examples/using_dune/reduced_lib/values.mli:9: lib_internal_externally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:3: Exported.used_by_API -./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:9: Exported.lib_internal_internally_used ./examples/using_dune/reduced_lib/values_in_submodules.mli:10: Exported.lib_internal_externally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:3: Exported.used_by_API -./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:9: Exported.lib_internal_internally_used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:10: Exported.lib_internal_externally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:2: used_by_API -./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:12: lib_internal_internally_used ./examples/using_dune/reduced_lib/values_no_intf.ml:13: lib_internal_externally_used @@ -296,21 +296,17 @@ ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:59: internally_used_f ./examples/using_dune/preprocessed_lib/preprocessed_no_intf.ml:64: externally_used_f -./examples/using_dune/reduced_lib/values.mli:1: used: Not detected +./examples/using_dune/reduced_lib/values.mli:1: used ./examples/using_dune/reduced_lib/values.mli:3: internally_used -./examples/using_dune/reduced_lib/values.mli:4: externally_used: Should not be detected ./examples/using_dune/reduced_lib/values.mli:6: lib_internal_used -./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used ./examples/using_dune/reduced_lib/values_in_submodules.mli:4: Exported.internally_used -./examples/using_dune/reduced_lib/values_in_submodules.mli:5: Exported.externally_used: Should not be detected ./examples/using_dune/reduced_lib/values_in_submodules.mli:7: Exported.lib_internal_used -./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used: Not detected +./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:4: Exported.internally_used -./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:5: Exported.externally_used: Should not be detected ./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:7: Exported.lib_internal_used -./examples/using_dune/reduced_lib/values_no_intf.ml:1: used: Not detected +./examples/using_dune/reduced_lib/values_no_intf.ml:1: used ./examples/using_dune/reduced_lib/values_no_intf.ml:3: internally_used -./examples/using_dune/reduced_lib/values_no_intf.ml:4: externally_used: Should not be detected ./examples/using_dune/reduced_lib/values_no_intf.ml:10: lib_internal_used ./examples/using_dune/unwrapped_lib/obj/with_class.mli:33: fun_class_factory @@ -396,10 +392,6 @@ .>-> ALMOST UNUSED EXPORTED VALUES: Called 3 time(s): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -./examples/using_dune/reduced_lib/values.mli:1: used: Should not be detected -./examples/using_dune/reduced_lib/values_in_submodules.mli:2: Exported.used: Should not be detected -./examples/using_dune/reduced_lib/values_in_submodules_no_intf.ml:2: Exported.used: Should not be detected -./examples/using_dune/reduced_lib/values_no_intf.ml:1: used: Should not be detected ./examples/using_dune/unwrapped_lib/values/values_no_intf.ml:19: aliased_fun ./examples/using_dune/wrapped_lib/values/values_no_intf.ml:19: aliased_fun @@ -1263,7 +1255,7 @@ Nothing else to report in this section -------------------------------------------------------------------------------- -Total: 1079 -Success: 1063 -Failed: 16 -Ratio: 98.5171455051% +Total: 1071 +Success: 1071 +Failed: 0 +Ratio: 100.% diff --git a/src/deadCode.ml b/src/deadCode.ml index 4ed8adca..f64b7e5a 100644 --- a/src/deadCode.ml +++ b/src/deadCode.ml @@ -400,9 +400,10 @@ let assoc decs (loc1, loc2) = if (!DeadFlag.internal || fn1 <> fn2) && is_implem fn1 && is_implem fn2 then DeadCommon.LocHash.merge_set references loc2 references loc1; if is_iface fn1 loc1 then begin - DeadCommon.LocHash.merge_set references loc1 references loc2; if is_iface fn2 loc2 then DeadCommon.LocHash.add_set references loc1 loc2 + else + DeadCommon.LocHash.merge_set references loc1 references loc2; end else DeadCommon.LocHash.merge_set references loc2 references loc1