From 0706ac0faeff6c01b8a2505736534038978164c0 Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Thu, 1 Oct 2015 16:06:50 +0300 Subject: [PATCH] use the *adjusted* callee type in effect checking Fixes #28776 --- src/librustc/lib.rs | 2 +- src/librustc/middle/effect.rs | 4 ++-- src/test/compile-fail/issue-28776.rs | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/issue-28776.rs diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index cfeab976e24c..0bbb57afc278 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -105,6 +105,7 @@ pub mod front { } pub mod middle { + pub mod expr_use_visitor; // STAGE0: increase glitch immunity pub mod astconv_util; pub mod astencode; pub mod cfg; @@ -122,7 +123,6 @@ pub mod middle { pub mod dependency_format; pub mod effect; pub mod entry; - pub mod expr_use_visitor; pub mod free_region; pub mod intrinsicck; pub mod infer; diff --git a/src/librustc/middle/effect.rs b/src/librustc/middle/effect.rs index d1e1434dad8a..8a206e3d88e4 100644 --- a/src/librustc/middle/effect.rs +++ b/src/librustc/middle/effect.rs @@ -151,7 +151,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> { } } hir::ExprCall(ref base, _) => { - let base_type = self.tcx.node_id_to_type(base.id); + let base_type = self.tcx.expr_ty_adjusted(base); debug!("effect: call case, base type is {:?}", base_type); if type_is_unsafe_function(base_type) { @@ -159,7 +159,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for EffectCheckVisitor<'a, 'tcx> { } } hir::ExprUnary(hir::UnDeref, ref base) => { - let base_type = self.tcx.node_id_to_type(base.id); + let base_type = self.tcx.expr_ty_adjusted(base); debug!("effect: unary case, base type is {:?}", base_type); if let ty::TyRawPtr(_) = base_type.sty { diff --git a/src/test/compile-fail/issue-28776.rs b/src/test/compile-fail/issue-28776.rs new file mode 100644 index 000000000000..ce06c8bf220e --- /dev/null +++ b/src/test/compile-fail/issue-28776.rs @@ -0,0 +1,15 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::ptr; + +fn main() { + (&ptr::write)(1 as *mut _, 42); //~ ERROR E0133 +}