mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 01:04:03 +00:00
Rollup merge of #124957 - compiler-errors:builtin-deref, r=michaelwoerister
Make `Ty::builtin_deref` just return a `Ty` Nowhere in the compiler are we using the mutability part of the `TyAndMut` that we used to return.
This commit is contained in:
commit
44c29bd7d1
@ -6,7 +6,7 @@ use rustc_errors::{Applicability, Diag};
|
|||||||
use rustc_hir::intravisit::{walk_expr, Visitor};
|
use rustc_hir::intravisit::{walk_expr, Visitor};
|
||||||
use rustc_hir::{Arm, Expr, ExprKind, MatchSource};
|
use rustc_hir::{Arm, Expr, ExprKind, MatchSource};
|
||||||
use rustc_lint::{LateContext, LintContext};
|
use rustc_lint::{LateContext, LintContext};
|
||||||
use rustc_middle::ty::{GenericArgKind, Ty, TypeAndMut};
|
use rustc_middle::ty::{GenericArgKind, Ty};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use super::SIGNIFICANT_DROP_IN_SCRUTINEE;
|
use super::SIGNIFICANT_DROP_IN_SCRUTINEE;
|
||||||
@ -234,9 +234,9 @@ impl<'a, 'tcx> SigDropHelper<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
let ty = self.sig_drop_checker.get_type(expr);
|
let ty = self.sig_drop_checker.get_type(expr);
|
||||||
if ty.is_ref() {
|
if ty.is_ref() {
|
||||||
// We checked that the type was ref, so builtin_deref will return Some TypeAndMut,
|
// We checked that the type was ref, so builtin_deref will return Some,
|
||||||
// but let's avoid any chance of an ICE
|
// but let's avoid any chance of an ICE.
|
||||||
if let Some(TypeAndMut { ty, .. }) = ty.builtin_deref(true) {
|
if let Some(ty) = ty.builtin_deref(true) {
|
||||||
if ty.is_trivially_pure_clone_copy() {
|
if ty.is_trivially_pure_clone_copy() {
|
||||||
self.replace_current_sig_drop(expr.span, false, LintSuggestion::MoveAndDerefToCopy);
|
self.replace_current_sig_drop(expr.span, false, LintSuggestion::MoveAndDerefToCopy);
|
||||||
} else if allow_move_and_clone {
|
} else if allow_move_and_clone {
|
||||||
|
@ -70,7 +70,7 @@ fn check_op(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left: bool)
|
|||||||
let without_deref = symmetric_partial_eq(cx, arg_ty, other_ty).unwrap_or_default();
|
let without_deref = symmetric_partial_eq(cx, arg_ty, other_ty).unwrap_or_default();
|
||||||
let with_deref = arg_ty
|
let with_deref = arg_ty
|
||||||
.builtin_deref(true)
|
.builtin_deref(true)
|
||||||
.and_then(|tam| symmetric_partial_eq(cx, tam.ty, other_ty))
|
.and_then(|ty| symmetric_partial_eq(cx, ty, other_ty))
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
if !with_deref.is_implemented() && !without_deref.is_implemented() {
|
if !with_deref.is_implemented() && !without_deref.is_implemented() {
|
||||||
|
@ -134,7 +134,7 @@ fn check_rvalue<'tcx>(
|
|||||||
) => Err((span, "function pointer casts are not allowed in const fn".into())),
|
) => Err((span, "function pointer casts are not allowed in const fn".into())),
|
||||||
Rvalue::Cast(CastKind::PointerCoercion(PointerCoercion::Unsize), op, cast_ty) => {
|
Rvalue::Cast(CastKind::PointerCoercion(PointerCoercion::Unsize), op, cast_ty) => {
|
||||||
let pointee_ty = if let Some(deref_ty) = cast_ty.builtin_deref(true) {
|
let pointee_ty = if let Some(deref_ty) = cast_ty.builtin_deref(true) {
|
||||||
deref_ty.ty
|
deref_ty
|
||||||
} else {
|
} else {
|
||||||
// We cannot allow this for now.
|
// We cannot allow this for now.
|
||||||
return Err((span, "unsizing casts are only allowed for references right now".into()));
|
return Err((span, "unsizing casts are only allowed for references right now".into()));
|
||||||
|
Loading…
Reference in New Issue
Block a user