rust/compiler/rustc_lint/src
bors a932eb36f8 Auto merge of #123239 - Urgau:dangerous_implicit_autorefs, r=jdonszelmann,traviscross
Implement a lint for implicit autoref of raw pointer dereference - take 2

*[t-lang nomination comment](https://github.com/rust-lang/rust/pull/123239#issuecomment-2727551097)*

This PR aims at implementing a lint for implicit autoref of raw pointer dereference, it is based on #103735 with suggestion and improvements from https://github.com/rust-lang/rust/pull/103735#issuecomment-1370420305.

The goal is to catch cases like this, where the user probably doesn't realise it just created a reference.

```rust
pub struct Test {
    data: [u8],
}

pub fn test_len(t: *const Test) -> usize {
    unsafe { (*t).data.len() }  // this calls <[T]>::len(&self)
}
```

Since #103735 already went 2 times through T-lang, where they T-lang ended-up asking for a more restricted version (which is what this PR does), I would prefer this PR to be reviewed first before re-nominating it for T-lang.

----

Compared to the PR it is as based on, this PR adds 3 restrictions on the outer most expression, which must either be:
   1. A deref followed by any non-deref place projection (that intermediate deref will typically be auto-inserted)
   2. A method call annotated with `#[rustc_no_implicit_refs]`.
   3. A deref followed by a `addr_of!` or `addr_of_mut!`. See bottom of post for details.

There are several points that are not 100% clear to me when implementing the modifications:
 - ~~"4. Any number of automatically inserted deref/derefmut calls." I as never able to trigger this. Am I missing something?~~ Fixed
 - Are "index" and "field" enough?

----

cc `@JakobDegen` `@WaffleLapkin`
r? `@RalfJung`

try-job: dist-various-1
try-job: dist-various-2
2025-04-28 08:25:23 +00:00
..
early Reword message 2025-02-20 17:55:31 +00:00
nonstandard_style mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
types Add helper methods checking for "#[non_exhaustive] that's active" 2025-03-07 16:16:36 +01:00
async_closures.rs Move some Map methods onto TyCtxt. 2025-02-17 13:21:02 +11: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
autorefs.rs Implement lint against dangerous implicit autorefs 2025-04-20 11:36:28 +02:00
builtin.rs Update lint-docs to default to Rust 2024 2025-04-26 14:08:58 -07:00
context.rs Avoid re-interning in LateContext::get_def_path 2025-04-26 22:06:44 +02:00
dangling.rs Implement .use keyword as an alias of clone 2025-03-06 17:58:32 -03:00
default_could_be_derived.rs Move hir::Item::ident into hir::ItemKind. 2025-03-18 06:29:50 +11:00
deref_into_dyn_supertrait.rs Use Symbol in LateContext::get_associated_type. 2025-04-14 16:12:21 +10:00
drop_forget_useless.rs Move methods from Map to TyCtxt, part 3. 2025-02-21 14:31:09 +11:00
early.rs Track whether an assoc item is in a trait impl or an inherent impl 2025-03-25 10:12:07 +00:00
enum_intrinsics_non_enums.rs Fold visit into ty 2025-03-15 06:34:36 +00:00
errors.rs Move eager translation to a method on Diag 2025-04-16 21:38:59 -04:00
expect.rs Move methods from Map to TyCtxt, part 4. 2025-03-12 08:55:37 +11:00
for_loops_over_fallibles.rs Move methods from Map to TyCtxt, part 2. 2025-02-18 10:17:44 +11:00
foreign_modules.rs Stop relying on rustc_type_ir in non-type-system crates 2025-03-15 06:42:48 +00:00
hidden_unicode_codepoints.rs Rustfmt 2025-02-08 22:12:13 +00:00
if_let_rescope.rs Move eager translation to a method on Diag 2025-04-16 21:38:59 -04:00
impl_trait_overcaptures.rs Update lint-docs to default to Rust 2024 2025-04-26 14:08:58 -07:00
internal.rs Implement lint against using Interner and InferCtxtLike in random compiler crates 2025-03-26 04:39:38 +00:00
invalid_from_utf8.rs invalid_from_utf8[_unchecked]: also lint inherent methods 2025-02-16 16:34:51 +03:00
late.rs Move methods from Map to TyCtxt, part 4. 2025-03-12 08:55:37 +11:00
let_underscore.rs Rustfmt 2025-02-08 22:12:13 +00:00
levels.rs Fix register_group_alias for tools 2025-04-10 20:58:15 +00:00
lib.rs Auto merge of #123239 - Urgau:dangerous_implicit_autorefs, r=jdonszelmann,traviscross 2025-04-28 08:25:23 +00:00
lints.rs Implement lint against dangerous implicit autorefs 2025-04-20 11:36:28 +02:00
macro_expr_fragment_specifier_2024_migration.rs Rename RefTokenTreeCursor. 2024-12-18 10:39:07 +11:00
map_unit_fn.rs Rustfmt 2025-02-08 22:12:13 +00:00
multiple_supertrait_upcastable.rs Move hir::Item::ident into hir::ItemKind. 2025-03-18 06:29:50 +11:00
non_ascii_idents.rs Make LevelAndSource a struct 2025-04-03 09:17:55 +00:00
non_fmt_panic.rs Use Option<Symbol> in panic_call. 2025-03-25 16:14:27 +11:00
non_local_def.rs Add environment variable tracking in places where it was convenient 2025-03-26 15:46:40 +01:00
nonstandard_style.rs Rename some name variables as ident. 2025-04-10 09:30:55 +10:00
noop_method_call.rs Rustfmt 2025-02-08 22:12:13 +00:00
opaque_hidden_inferred_bound.rs Squash fold into ty 2025-03-15 06:34:36 +00:00
pass_by_value.rs Rustfmt 2025-02-08 22:12:13 +00:00
passes.rs fix empty after lint on impl/trait items 2025-02-07 16:47:26 +01:00
precedence.rs Temporarily switch ambiguous_negative_literals lint to allow 2024-07-31 19:36:47 +02:00
ptr_nulls.rs Uplift clippy::invalid_null_ptr_usage as invalid_null_arguments 2025-03-30 19:33:15 +02:00
redundant_semicolon.rs Rustfmt 2025-02-08 22:12:13 +00:00
reference_casting.rs Expose peel_casts method as an util method inside rustc_lint 2025-03-30 12:14:02 +02:00
shadowed_into_iter.rs Use is_lang_item and as_lang_item instead of handrolling their logic 2025-04-22 11:02:37 +00:00
static_mut_refs.rs Rustfmt 2025-02-08 22:12:13 +00:00
tests.rs update cfg(bootstrap) 2025-01-08 21:26:39 +01:00
traits.rs Rustfmt 2025-02-08 22:12:13 +00:00
types.rs Rollup merge of #138282 - beetrees:repr128-not-ffi-safe, r=oli-obk 2025-04-24 17:19:43 +02:00
unit_bindings.rs Rustfmt 2025-02-08 22:12:13 +00:00
unqualified_local_imports.rs Move methods from Map to TyCtxt, part 3. 2025-02-21 14:31:09 +11:00
unused.rs Add {ast,hir,thir}::PatKind::Missing variants. 2025-03-28 09:18:57 +11:00
utils.rs Uplift clippy::invalid_null_ptr_usage as invalid_null_arguments 2025-03-30 19:33:15 +02:00