]> git.lizzy.rs Git - rust.git/commitdiff
Fixes issue #11004
authorGuillaume Gomez <guillaume1.gomez@gmail.com>
Wed, 17 Aug 2016 13:59:27 +0000 (15:59 +0200)
committerGuillaume Gomez <guillaume1.gomez@gmail.com>
Wed, 17 Aug 2016 17:12:37 +0000 (19:12 +0200)
src/librustc_typeck/check/mod.rs
src/test/compile-fail/issue-11004.rs [new file with mode: 0644]

index e573655b8c9847ffd045a7e07110e0e7109c1130..ff0b86aa595408da4eee1a88f87b53205eea7dfd 100644 (file)
@@ -3000,6 +3000,10 @@ fn check_field(&self,
                          but no field with that name was found",
                         field.node, actual)
             }, expr_t);
+            if let ty::TyRawPtr(..) = expr_t.sty {
+                err.note(&format!("`{0}` is a native pointer; perhaps you need to deref with \
+                                  `(*{0}).{1}`", pprust::expr_to_string(base), field.node));
+            }
             if let ty::TyStruct(def, _) = expr_t.sty {
                 Self::suggest_field_names(&mut err, def.struct_variant(), field, vec![]);
             }
diff --git a/src/test/compile-fail/issue-11004.rs b/src/test/compile-fail/issue-11004.rs
new file mode 100644 (file)
index 0000000..308be46
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2016 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.
+
+use std::mem;
+
+struct A { x: i32, y: f64 }
+
+#[cfg(not(works))]
+unsafe fn access(n:*mut A) -> (i32, f64) {
+    let x : i32 = n.x; //~ ERROR attempted access of field `x`
+                       //~| NOTE `n` is a native pointer; perhaps you need to deref with `(*n).x`
+    let y : f64 = n.y; //~ ERROR attempted access of field `y`
+                       //~| NOTE `n` is a native pointer; perhaps you need to deref with `(*n).y`
+    (x, y)
+}
+
+#[cfg(works)]
+unsafe fn access(n:*mut A) -> (i32, f64) {
+    let x : i32 = (*n).x;
+    let y : f64 = (*n).y;
+    (x, y)
+}
+
+fn main() {
+    let a :  A = A { x: 3, y: 3.14 };
+    let p : &A = &a;
+    let (x,y) = unsafe {
+        let n : *mut A = mem::transmute(p);
+        access(n)
+    };
+    println!("x: {}, y: {}", x, y);
+}