rust/compiler/rustc_lint/src
León Orell Valerian Liehr 3eaa785daa
Rollup merge of #134008 - jswrenn:unsafe-fields-copy, r=compiler-errors
Make `Copy` unsafe to implement for ADTs with `unsafe` fields

As a rule, the application of `unsafe` to a declaration requires that use-sites of that declaration also entail `unsafe`. For example, a field declared `unsafe` may only be read in the lexical context of an `unsafe` block.

For nearly all safe traits, the safety obligations of fields are explicitly discharged when they are mentioned in method definitions. For example, idiomatically implementing `Clone` (a safe trait) for a type with unsafe fields will require `unsafe` to clone those fields.

Prior to this commit, `Copy` violated this rule. The trait is marked safe, and although it has no explicit methods, its implementation permits reads of `Self`.

This commit resolves this by making `Copy` conditionally safe to implement. It remains safe to implement for ADTs without unsafe fields, but unsafe to implement for ADTs with unsafe fields.

Tracking: #132922

r? ```@compiler-errors```
2024-12-10 13:51:10 +01:00
..
context fix confusing diagnostic for reserved ## 2024-11-25 22:29:14 -07:00
nonstandard_style mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
types compiler: Depend on rustc_abi in rustc_lint 2024-10-27 23:59:31 -07:00
async_closures.rs docs: Enable required feature for 'closure_returning_async_block' lint 2024-09-14 10:43:26 +02:00
async_fn_in_trait.rs nightly feature tracking: get rid of the per-feature bool fields 2024-10-23 09:14:41 +01:00
builtin.rs Make Copy unsafe to implement for ADTs with unsafe fields 2024-12-07 20:50:00 +00:00
context.rs remove Ty::is_copy_modulo_regions 2024-12-02 13:57:56 +01:00
dangling.rs Avoid even more decoding if not absolutely necessary 2024-11-27 07:35:55 +01:00
deref_into_dyn_supertrait.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
drop_forget_useless.rs remove Ty::is_copy_modulo_regions 2024-12-02 13:57:56 +01:00
early.rs Actually walk into lifetimes and attrs in EarlyContextAndPass 2024-12-07 02:08:40 +00:00
enum_intrinsics_non_enums.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
errors.rs Add warn(unreachable_pub) to rustc_lint. 2024-08-27 15:24:11 +10:00
expect.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
for_loops_over_fallibles.rs use TypingEnv when no infcx is available 2024-11-18 10:38:56 +01:00
foreign_modules.rs use TypingEnv when no infcx is available 2024-11-18 10:38:56 +01:00
hidden_unicode_codepoints.rs Actually walk into lifetimes and attrs in EarlyContextAndPass 2024-12-07 02:08:40 +00:00
if_let_rescope.rs reduce false positives on some common cases from if-let-rescope 2024-12-02 18:30:29 +08:00
impl_trait_overcaptures.rs impl trait overcaptures, yeet TypingMode::from_param_env 2024-11-19 18:06:20 +01:00
internal.rs Rollup merge of #133545 - clubby789:symbol-intern-lit, r=jieyouxu 2024-12-03 17:27:06 +01:00
invalid_from_utf8.rs Remove extern crate rustc_session from rustc_lint. 2024-04-29 13:57:41 +10:00
late.rs Do not filter empty passes & Make CTFE Clippy into lintless pass 2024-11-05 15:27:09 +01:00
let_underscore.rs use TypingEnv when no infcx is available 2024-11-18 10:38:56 +01:00
levels.rs lints_that_dont_need_to_run: never skip future-compat-reported lints 2024-11-19 22:04:10 +01:00
lib.rs Implement lint against Symbol::intern on a string literal 2024-11-28 15:45:25 +00:00
lints.rs Revert #131669 due to ICEs 2024-12-09 17:31:16 +08:00
macro_expr_fragment_specifier_2024_migration.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
map_unit_fn.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
multiple_supertrait_upcastable.rs Compiler: Rename "object safe" to "dyn compatible" 2024-09-25 13:26:48 +02:00
non_ascii_idents.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
non_fmt_panic.rs use TypingEnv when no infcx is available 2024-11-18 10:38:56 +01:00
non_local_def.rs Also treat impl definition parent as transparent regarding modules 2024-11-01 16:07:02 +01:00
nonstandard_style.rs ty::KContainer -> ty::AssocItemContainer::K 2024-11-04 04:45:52 +00:00
noop_method_call.rs use TypingEnv when no infcx is available 2024-11-18 10:38:56 +01:00
opaque_hidden_inferred_bound.rs Remap impl-trait lifetimes on HIR instead of AST lowering. 2024-10-30 16:18:50 +00:00
pass_by_value.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
passes.rs Auto merge of #125116 - blyxyas:ignore-allowed-lints-final, r=cjgillot 2024-10-26 16:37:43 +00:00
precedence.rs Temporarily switch ambiguous_negative_literals lint to allow 2024-07-31 19:36:47 +02:00
ptr_nulls.rs Reformat use declarations. 2024-07-29 08:26:52 +10:00
redundant_semicolon.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
reference_casting.rs move fn is_item_raw to TypingEnv 2024-11-19 18:06:20 +01:00
shadowed_into_iter.rs Move COGNITIVE_COMPLEXITY to use macro again 2024-10-21 19:27:34 +02:00
static_mut_refs.rs Fix #131977 parens mangled in shared mut static lint suggestion 2024-10-24 03:34:37 +00:00
tests.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
traits.rs Represent TraitBoundModifiers as distinct parts in HIR 2024-10-22 19:48:44 +00:00
types.rs Revert #131669 due to ICEs 2024-12-09 17:31:16 +08:00
unit_bindings.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
unqualified_local_imports.rs add unqualified_local_imports lint 2024-09-23 11:57:28 +02:00
unused.rs Rollup merge of #133424 - Nadrieril:guard-patterns-parsing, r=fee1-dead 2024-12-08 17:18:50 +01:00