rust/tests/ui/check-cfg
Guillaume Gomez 015e9371e0
Rollup merge of #123940 - kornelski:remove-derived-debug, r=Urgau
debug-fmt-detail option

I'd like to propose a new option that makes `#[derive(Debug)]` generate no-op implementations that don't print anything, and makes `{:?}` in format strings a no-op.

There are a couple of motivations for this:

1. A more thorough stripping of debug symbols. Binaries stripped of debug symbols still retain some of them through `Debug` implementations. It's hard to avoid that without compiler's help, because debug formatting can be used in many places, including dependencies, and their loggers, asserts, panics, etc.
   * In my testing it gives about 2% binary size reduction on top of all other binary-minimizing best practices (including `panic_immediate_abort`). There are targets like Web WASM or embedded where users pay attention to binary sizes.
   * Users distributing closed-source binaries may not want to "leak" any symbol names as a matter of principle.
2. Adds ability to test whether code depends on specifics of the `Debug` format implementation in unwise ways (e.g. trying to get data unavailable via public interface, or using it as a serialization format). Because current Rust's debug implementation doesn't change, there's a risk of it becoming a fragile de-facto API that [won't be possible to change in the future](https://www.hyrumslaw.com/). An option that "breaks" it can act as a [grease](https://www.rfc-editor.org/rfc/rfc8701.html).

This implementation is a `-Z fmt-debug=opt` flag that takes:

* `full` — the default, current state.
* `none` — makes derived `Debug` and `{:?}` no-ops. Explicit `impl Debug for T` implementations are left unharmed, but `{:?}` format won't use them, so they may get dead-code eliminated if they aren't invoked directly.
* `shallow` — makes derived `Debug` print only the type's name, without recursing into fields. Fieldless enums print their variant names. `{:?}` works.

The `shallow` option is a compromise between minimizing the `Debug` code, and compatibility. There are popular proc-macro crates that use `Debug::fmt` as a way to convert enum values into their Rust source code.

There's a corresponding `cfg` flag: `#[cfg(fmt_debug = "none")]` that can be used in user code to react to this setting to minimize custom `Debug` implementations or remove unnecessary formatting helper functions.
2024-08-29 16:21:46 +02:00
..
allow-at-crate-level.rs
allow-macro-cfg.rs
allow-same-level.rs
allow-same-level.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
allow-top-level.rs
allow-upper-level.rs
cargo-build-script.rs
cargo-build-script.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
cargo-feature.none.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
cargo-feature.rs
cargo-feature.some.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
cfg-value-for-cfg-name-duplicate.rs
cfg-value-for-cfg-name-duplicate.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
cfg-value-for-cfg-name-multiple.rs
cfg-value-for-cfg-name-multiple.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
cfg-value-for-cfg-name.rs
cfg-value-for-cfg-name.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
compact-names.rs
compact-names.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
compact-values.rs
compact-values.stderr
concat-values.rs
concat-values.stderr
diagnotics.cargo.stderr
diagnotics.rs
diagnotics.rustc.stderr
empty-values.rs
empty-values.stderr
exhaustive-names-values.empty_cfg.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
exhaustive-names-values.feature.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
exhaustive-names-values.full.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
exhaustive-names-values.rs
exhaustive-names.rs
exhaustive-names.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
exhaustive-values.empty_cfg.stderr
exhaustive-values.rs
exhaustive-values.without_names.stderr
invalid-arguments.any_values.stderr
invalid-arguments.anything_else.stderr
invalid-arguments.boolean.stderr
invalid-arguments.cfg_none.stderr
invalid-arguments.giberich.stderr
invalid-arguments.ident_in_values_1.stderr
invalid-arguments.ident_in_values_2.stderr
invalid-arguments.mixed_any.stderr
invalid-arguments.mixed_values_any.stderr
invalid-arguments.multiple_any.stderr
invalid-arguments.multiple_values_any.stderr
invalid-arguments.multiple_values.stderr
invalid-arguments.none_not_empty.stderr
invalid-arguments.not_empty_any.stderr
invalid-arguments.not_empty_values_any.stderr
invalid-arguments.rs
invalid-arguments.string_for_name_1.stderr
invalid-arguments.string_for_name_2.stderr
invalid-arguments.unknown_meta_item_1.stderr
invalid-arguments.unknown_meta_item_2.stderr
invalid-arguments.unknown_meta_item_3.stderr
invalid-arguments.unterminated.stderr
invalid-arguments.values_any_before_ident.stderr
invalid-arguments.values_any_missing_values.stderr
mix.rs
mix.stderr Rollup merge of #123940 - kornelski:remove-derived-debug, r=Urgau 2024-08-29 16:21:46 +02:00
my-awesome-platform.json
no-expected-values.empty.stderr
no-expected-values.mixed.stderr
no-expected-values.rs
no-expected-values.simple.stderr
order-independant.rs
order-independant.values_after.stderr
order-independant.values_before.stderr
stmt-no-ice.rs
stmt-no-ice.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
unexpected-cfg-name.rs
unexpected-cfg-name.stderr
unexpected-cfg-value.rs
unexpected-cfg-value.stderr
unknown-values.rs
values-none.concat_1.stderr
values-none.concat_2.stderr
values-none.explicit.stderr
values-none.implicit.stderr
values-none.rs
values-none.simple.stderr
values-target-json.rs
well-known-names.rs
well-known-names.stderr fmt-debug option 2024-08-28 23:32:40 +01:00
well-known-values.rs fmt-debug option 2024-08-28 23:32:40 +01:00
well-known-values.stderr Rollup merge of #123940 - kornelski:remove-derived-debug, r=Urgau 2024-08-29 16:21:46 +02:00