diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs index 91b31bd0bc957..2c332b65a48d4 100644 --- a/src/librustc_typeck/check/coercion.rs +++ b/src/librustc_typeck/check/coercion.rs @@ -403,8 +403,9 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { a.repr(self.tcx()), b.repr(self.tcx())); - let mt_a = match a.sty { - ty::TyRef(_, mt) | ty::TyRawPtr(mt) => mt, + let (is_ref, mt_a) = match a.sty { + ty::TyRef(_, mt) => (true, mt), + ty::TyRawPtr(mt) => (false, mt), _ => { return self.subtype(a, b); } @@ -418,11 +419,15 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { // Although references and unsafe ptrs have the same // representation, we still register an AutoDerefRef so that // regionck knows that the region for `a` must be valid here. - Ok(Some(AdjustDerefRef(AutoDerefRef { - autoderefs: 1, - autoref: Some(ty::AutoUnsafe(mutbl_b)), - unsize: None - }))) + if is_ref { + Ok(Some(AdjustDerefRef(AutoDerefRef { + autoderefs: 1, + autoref: Some(ty::AutoUnsafe(mutbl_b)), + unsize: None + }))) + } else { + Ok(None) + } } } diff --git a/src/test/codegen/coercions.rs b/src/test/codegen/coercions.rs new file mode 100644 index 0000000000000..2a136d7024d9b --- /dev/null +++ b/src/test/codegen/coercions.rs @@ -0,0 +1,27 @@ +// 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. + +// compile-flags: -C no-prepopulate-passes + +static X: i32 = 5; + +// CHECK-LABEL: @raw_ptr_to_raw_ptr_noop +// CHECK-NOT: alloca +#[no_mangle] +pub fn raw_ptr_to_raw_ptr_noop() -> *const i32{ + &X as *const i32 +} + +// CHECK-LABEL: @reference_to_raw_ptr_noop +// CHECK-NOT: alloca +#[no_mangle] +pub fn reference_to_raw_ptr_noop() -> *const i32 { + &X +} diff --git a/src/test/compile-fail/issue-16538.rs b/src/test/compile-fail/issue-16538.rs index 2b53e92d9bce6..6f627bfe704a8 100644 --- a/src/test/compile-fail/issue-16538.rs +++ b/src/test/compile-fail/issue-16538.rs @@ -20,6 +20,7 @@ mod Y { static foo: *const Y::X = Y::foo(Y::x as *const Y::X); //~^ ERROR the trait `core::marker::Sync` is not implemented for the type +//~| ERROR cannot refer to other statics by value, use the address-of operator or a constant instead //~| ERROR E0015 fn main() {}