Skip to content

Commit 8c4a10a

Browse files
luqmanaalexcrichton
authored andcommitted
librustc: Take in account mutability when casting array to raw ptr.
1 parent d884cc8 commit 8c4a10a

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/librustc/middle/typeck/check/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3099,9 +3099,9 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
30993099
/* this cast is only allowed from &[T] to *T or
31003100
&T to *T. */
31013101
match (&ty::get(te).sty, &ty::get(t_1).sty) {
3102-
(&ty::ty_rptr(_, mt1), &ty::ty_ptr(mt2))
3103-
if types_compatible(fcx, e.span,
3104-
mt1.ty, mt2.ty) => {
3102+
(&ty::ty_rptr(_, ty::mt { ty: mt1, mutbl: ast::MutImmutable }),
3103+
&ty::ty_ptr(ty::mt { ty: mt2, mutbl: ast::MutImmutable }))
3104+
if types_compatible(fcx, e.span, mt1, mt2) => {
31053105
/* this case is allowed */
31063106
}
31073107
_ => {

src/test/compile-fail/issue-14845.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
12+
struct X {
13+
a: [u8, ..1]
14+
}
15+
16+
fn main() {
17+
let x = X { a: [0] };
18+
let _f = &x.a as *mut u8;
19+
//~^ ERROR mismatched types: expected `*mut u8` but found `&[u8, .. 1]`
20+
21+
let local = [0u8];
22+
let _v = &local as *mut u8;
23+
//~^ ERROR mismatched types: expected `*mut u8` but found `&[u8, .. 1]`
24+
}

0 commit comments

Comments
 (0)