]> git.lizzy.rs Git - rust.git/commitdiff
revert making casts atomic, test order dependency
authorleonardo.yvens <leoyvens@gmail.com>
Thu, 22 Mar 2018 20:41:07 +0000 (17:41 -0300)
committerleonardo.yvens <leoyvens@gmail.com>
Tue, 27 Mar 2018 01:58:36 +0000 (22:58 -0300)
src/librustc_typeck/check/cast.rs
src/librustc_typeck/check/mod.rs
src/test/run-pass/cast.rs
src/test/ui/order-dependent-cast-inference.rs [new file with mode: 0644]
src/test/ui/order-dependent-cast-inference.stderr [new file with mode: 0644]

index 31f418df902be0e3eb849879722a1d77636b7f6c..7ebacc92babf8bc41509580179daa655a555078c 100644 (file)
@@ -389,8 +389,8 @@ fn trivial_cast_lint(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) {
     }
 
     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,
index e5d3e84e840d2136eca49db47999bbae00bd64a4..69879bbe85d6e4e50d22af815d071c08be95a4f2 100644 (file)
@@ -3639,7 +3639,7 @@ fn check_expr_kind(&self,
                                                                                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) {
index bb60626a4bf02afaeea6107dcc59c532212fbbc1..80fa5362a8be940c134ea9a112487991f03e805c 100644 (file)
@@ -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 _;
 }
diff --git a/src/test/ui/order-dependent-cast-inference.rs b/src/test/ui/order-dependent-cast-inference.rs
new file mode 100644 (file)
index 0000000..afcd402
--- /dev/null
@@ -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 _;
+}
diff --git a/src/test/ui/order-dependent-cast-inference.stderr b/src/test/ui/order-dependent-cast-inference.stderr
new file mode 100644 (file)
index 0000000..556acc8
--- /dev/null
@@ -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`.