}
pub fn check(mut self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) {
- self.expr_ty = fcx.resolve_type_vars_if_possible(&self.expr_ty);
- self.cast_ty = fcx.resolve_type_vars_if_possible(&self.cast_ty);
+ self.expr_ty = fcx.structurally_resolved_type(self.span, self.expr_ty);
+ self.cast_ty = fcx.structurally_resolved_type(self.span, self.cast_ty);
debug!("check_cast({}, {:?} as {:?})",
self.expr.id,
needs);
if !oprnd_t.references_error() {
- oprnd_t = self.resolve_type_vars_with_obligations(&oprnd_t);
+ oprnd_t = self.structurally_resolved_type(expr.span, oprnd_t);
match unop {
hir::UnDeref => {
if let Some(mt) = oprnd_t.builtin_deref(true) {
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 _;
}
--- /dev/null
+// 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 _;
+}
--- /dev/null
+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`.