Rollup merge of #48270 - leodasvacas:refactor-casts, r=nikomatsakis
Replace `structurally_resolved_type` in casts check. The behaviour of `resolve_type_vars_if_possible` is simpler and infallible. Other minor refactorings. I'm not sure if this is backwards compatible, in theory resolving obligations between two cast checks could solve a dependency between them, but I don't know if that's actually possible and it doesn't sound like something we'd want to support.
This commit is contained in:
commit
9f6e5ae024
@ -20,7 +20,6 @@ use syntax::ast;
|
||||
pub enum IntTy {
|
||||
U(ast::UintTy),
|
||||
I,
|
||||
Ivar,
|
||||
CEnum,
|
||||
Bool,
|
||||
Char
|
||||
@ -64,7 +63,7 @@ impl<'tcx> CastTy<'tcx> {
|
||||
ty::TyBool => Some(CastTy::Int(IntTy::Bool)),
|
||||
ty::TyChar => Some(CastTy::Int(IntTy::Char)),
|
||||
ty::TyInt(_) => Some(CastTy::Int(IntTy::I)),
|
||||
ty::TyInfer(ty::InferTy::IntVar(_)) => Some(CastTy::Int(IntTy::Ivar)),
|
||||
ty::TyInfer(ty::InferTy::IntVar(_)) => Some(CastTy::Int(IntTy::I)),
|
||||
ty::TyInfer(ty::InferTy::FloatVar(_)) => Some(CastTy::Float),
|
||||
ty::TyUint(u) => Some(CastTy::Int(IntTy::U(u))),
|
||||
ty::TyFloat(_) => Some(CastTy::Float),
|
||||
|
@ -486,11 +486,7 @@ impl<'a, 'gcx, 'tcx> CastCheck<'tcx> {
|
||||
ty::TypeVariants::TyInfer(t) => {
|
||||
match t {
|
||||
ty::InferTy::IntVar(_) |
|
||||
ty::InferTy::FloatVar(_) |
|
||||
ty::InferTy::FreshIntTy(_) |
|
||||
ty::InferTy::FreshFloatTy(_) => {
|
||||
Err(CastError::NeedDeref)
|
||||
}
|
||||
ty::InferTy::FloatVar(_) => Err(CastError::NeedDeref),
|
||||
_ => Err(CastError::NeedViaPtr),
|
||||
}
|
||||
}
|
||||
|
@ -19,4 +19,9 @@ pub fn main() {
|
||||
assert_eq!(i as u8 as i8, 'Q' as u8 as i8);
|
||||
assert_eq!(0x51 as char, 'Q');
|
||||
assert_eq!(0 as u32, false as u32);
|
||||
|
||||
// Test that `_` is correctly inferred.
|
||||
let x = &"hello";
|
||||
let mut y = x as *const _;
|
||||
y = 0 as *const _;
|
||||
}
|
||||
|
18
src/test/ui/order-dependent-cast-inference.rs
Normal file
18
src/test/ui/order-dependent-cast-inference.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
fn main() {
|
||||
// Tests case where inference fails due to the order in which casts are checked.
|
||||
// Ideally this would compile, see #48270.
|
||||
let x = &"hello";
|
||||
let mut y = 0 as *const _;
|
||||
//~^ ERROR cannot cast to a pointer of an unknown kind
|
||||
y = x as *const _;
|
||||
}
|
13
src/test/ui/order-dependent-cast-inference.stderr
Normal file
13
src/test/ui/order-dependent-cast-inference.stderr
Normal file
@ -0,0 +1,13 @@
|
||||
error[E0641]: cannot cast to a pointer of an unknown kind
|
||||
--> $DIR/order-dependent-cast-inference.rs:15:17
|
||||
|
|
||||
LL | let mut y = 0 as *const _;
|
||||
| ^^^^^--------
|
||||
| |
|
||||
| help: consider giving more type information
|
||||
|
|
||||
= note: The type information given here is insufficient to check whether the pointer cast is valid
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0641`.
|
Loading…
x
Reference in New Issue
Block a user