Skip to content

Commit 76608c8

Browse files
Ariel Ben-Yehudaarielb1
Ariel Ben-Yehuda
authored andcommitted
make *mut T -> *const T a coercion
rather than being implicit quasi-subtyping. Nothing good can come out of quasi-subtyping.
1 parent 6f633ef commit 76608c8

File tree

11 files changed

+70
-20
lines changed

11 files changed

+70
-20
lines changed

src/librustc/middle/expr_use_visitor.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -721,10 +721,11 @@ impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> {
721721
if let Some(adjustment) = adj {
722722
match adjustment {
723723
adjustment::AdjustReifyFnPointer |
724-
adjustment::AdjustUnsafeFnPointer => {
724+
adjustment::AdjustUnsafeFnPointer |
725+
adjustment::AdjustMutToConstPointer => {
725726
// Creating a closure/fn-pointer or unsizing consumes
726727
// the input and stores it into the resulting rvalue.
727-
debug!("walk_adjustment(AdjustReifyFnPointer|AdjustUnsafeFnPointer)");
728+
debug!("walk_adjustment: trivial adjustment");
728729
let cmt_unadjusted =
729730
return_if_err!(self.mc.cat_expr_unadjusted(expr));
730731
self.delegate_consume(expr.id, expr.span, cmt_unadjusted);

src/librustc/middle/mem_categorization.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
430430

431431
adjustment::AdjustReifyFnPointer |
432432
adjustment::AdjustUnsafeFnPointer |
433+
adjustment::AdjustMutToConstPointer |
433434
adjustment::AdjustDerefRef(_) => {
434435
debug!("cat_expr({:?}): {:?}",
435436
adjustment,

src/librustc/middle/ty/adjustment.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ use rustc_front::hir;
2121

2222
#[derive(Copy, Clone)]
2323
pub enum AutoAdjustment<'tcx> {
24-
AdjustReifyFnPointer, // go from a fn-item type to a fn-pointer type
25-
AdjustUnsafeFnPointer, // go from a safe fn pointer to an unsafe fn pointer
24+
AdjustReifyFnPointer, // go from a fn-item type to a fn-pointer type
25+
AdjustUnsafeFnPointer, // go from a safe fn pointer to an unsafe fn pointer
26+
AdjustMutToConstPointer, // go from a mut raw pointer to a const raw pointer
2627
AdjustDerefRef(AutoDerefRef<'tcx>),
2728
}
2829

@@ -106,7 +107,8 @@ impl<'tcx> AutoAdjustment<'tcx> {
106107
pub fn is_identity(&self) -> bool {
107108
match *self {
108109
AdjustReifyFnPointer |
109-
AdjustUnsafeFnPointer => false,
110+
AdjustUnsafeFnPointer |
111+
AdjustMutToConstPointer => false,
110112
AdjustDerefRef(ref r) => r.is_identity(),
111113
}
112114
}
@@ -151,7 +153,7 @@ impl<'tcx> ty::TyS<'tcx> {
151153
return match adjustment {
152154
Some(adjustment) => {
153155
match *adjustment {
154-
AdjustReifyFnPointer => {
156+
AdjustReifyFnPointer => {
155157
match self.sty {
156158
ty::TyBareFn(Some(_), b) => {
157159
cx.mk_fn(None, b)
@@ -164,17 +166,32 @@ impl<'tcx> ty::TyS<'tcx> {
164166
}
165167
}
166168

167-
AdjustUnsafeFnPointer => {
169+
AdjustUnsafeFnPointer => {
168170
match self.sty {
169171
ty::TyBareFn(None, b) => cx.safe_to_unsafe_fn_ty(b),
170172
ref b => {
171173
cx.sess.bug(
172-
&format!("AdjustReifyFnPointer adjustment on non-fn-item: \
174+
&format!("AdjustUnsafeFnPointer adjustment on non-fn-ptr: \
173175
{:?}",
174176
b));
175177
}
176178
}
177-
}
179+
}
180+
181+
AdjustMutToConstPointer => {
182+
match self.sty {
183+
ty::TyRawPtr(mt) => cx.mk_ptr(ty::TypeAndMut {
184+
ty: mt.ty,
185+
mutbl: hir::MutImmutable
186+
}),
187+
ref b => {
188+
cx.sess.bug(
189+
&format!("AdjustMutToConstPointer on non-raw-ptr: \
190+
{:?}",
191+
b));
192+
}
193+
}
194+
}
178195

179196
AdjustDerefRef(ref adj) => {
180197
let mut adjusted_ty = self;

src/librustc/util/ppaux.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,9 @@ impl<'tcx> fmt::Debug for ty::adjustment::AutoAdjustment<'tcx> {
396396
ty::adjustment::AdjustUnsafeFnPointer => {
397397
write!(f, "AdjustUnsafeFnPointer")
398398
}
399+
ty::adjustment::AdjustMutToConstPointer => {
400+
write!(f, "AdjustMutToConstPointer")
401+
}
399402
ty::adjustment::AdjustDerefRef(ref data) => {
400403
write!(f, "{:?}", data)
401404
}

src/librustc_metadata/astencode.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ impl<'a, 'tcx> rbml_writer_helpers<'tcx> for Encoder<'a> {
610610

611611
self.emit_enum("AutoAdjustment", |this| {
612612
match *adj {
613-
adjustment::AdjustReifyFnPointer=> {
613+
adjustment::AdjustReifyFnPointer => {
614614
this.emit_enum_variant("AdjustReifyFnPointer", 1, 0, |_| Ok(()))
615615
}
616616

@@ -620,8 +620,14 @@ impl<'a, 'tcx> rbml_writer_helpers<'tcx> for Encoder<'a> {
620620
})
621621
}
622622

623+
adjustment::AdjustMutToConstPointer => {
624+
this.emit_enum_variant("AdjustMutToConstPointer", 3, 0, |_| {
625+
Ok(())
626+
})
627+
}
628+
623629
adjustment::AdjustDerefRef(ref auto_deref_ref) => {
624-
this.emit_enum_variant("AdjustDerefRef", 3, 2, |this| {
630+
this.emit_enum_variant("AdjustDerefRef", 4, 2, |this| {
625631
this.emit_enum_variant_arg(0,
626632
|this| Ok(this.emit_auto_deref_ref(ecx, auto_deref_ref)))
627633
})
@@ -1002,12 +1008,14 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
10021008
fn read_auto_adjustment<'b, 'c>(&mut self, dcx: &DecodeContext<'b, 'c, 'tcx>)
10031009
-> adjustment::AutoAdjustment<'tcx> {
10041010
self.read_enum("AutoAdjustment", |this| {
1005-
let variants = ["AdjustReifyFnPointer", "AdjustUnsafeFnPointer", "AdjustDerefRef"];
1011+
let variants = ["AdjustReifyFnPointer", "AdjustUnsafeFnPointer",
1012+
"AdjustMutToConstPointer", "AdjustDerefRef"];
10061013
this.read_enum_variant(&variants, |this, i| {
10071014
Ok(match i {
10081015
1 => adjustment::AdjustReifyFnPointer,
10091016
2 => adjustment::AdjustUnsafeFnPointer,
1010-
3 => {
1017+
3 => adjustment::AdjustMutToConstPointer,
1018+
4 => {
10111019
let auto_deref_ref: adjustment::AutoDerefRef =
10121020
this.read_enum_variant_arg(0,
10131021
|this| Ok(this.read_auto_deref_ref(dcx))).unwrap();

src/librustc_mir/hair/cx/expr.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
416416
kind: kind,
417417
};
418418

419+
debug!("unadjusted-expr={:?} applying adjustments={:?}",
420+
expr, cx.tcx.tables.borrow().adjustments.get(&self.id));
421+
419422
// Now apply adjustments, if any.
420423
match cx.tcx.tables.borrow().adjustments.get(&self.id) {
421424
None => {}
@@ -437,6 +440,15 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
437440
kind: ExprKind::UnsafeFnPointer { source: expr.to_ref() },
438441
};
439442
}
443+
Some(&ty::adjustment::AdjustMutToConstPointer) => {
444+
let adjusted_ty = cx.tcx.expr_ty_adjusted(self);
445+
expr = Expr {
446+
temp_lifetime: temp_lifetime,
447+
ty: adjusted_ty,
448+
span: self.span,
449+
kind: ExprKind::Cast { source: expr.to_ref() },
450+
};
451+
}
440452
Some(&ty::adjustment::AdjustDerefRef(ref adj)) => {
441453
for i in 0..adj.autoderefs {
442454
let i = i as u32;

src/librustc_passes/consts.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,8 @@ fn check_adjustments<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &hir::Exp
768768
match v.tcx.tables.borrow().adjustments.get(&e.id) {
769769
None |
770770
Some(&ty::adjustment::AdjustReifyFnPointer) |
771-
Some(&ty::adjustment::AdjustUnsafeFnPointer) => {}
771+
Some(&ty::adjustment::AdjustUnsafeFnPointer) |
772+
Some(&ty::adjustment::AdjustMutToConstPointer) => {}
772773

773774
Some(&ty::adjustment::AdjustDerefRef(
774775
ty::adjustment::AutoDerefRef { autoderefs, .. }

src/librustc_trans/trans/consts.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use trans::type_of;
4040
use trans::Disr;
4141
use middle::subst::Substs;
4242
use middle::ty::adjustment::{AdjustDerefRef, AdjustReifyFnPointer};
43-
use middle::ty::adjustment::AdjustUnsafeFnPointer;
43+
use middle::ty::adjustment::{AdjustUnsafeFnPointer, AdjustMutToConstPointer};
4444
use middle::ty::{self, Ty};
4545
use middle::ty::cast::{CastTy,IntTy};
4646
use util::nodemap::NodeMap;
@@ -354,7 +354,7 @@ pub fn const_expr<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
354354
// FIXME(#19925) once fn item types are
355355
// zero-sized, we'll need to do something here
356356
}
357-
Some(AdjustUnsafeFnPointer) => {
357+
Some(AdjustUnsafeFnPointer) | Some(AdjustMutToConstPointer) => {
358358
// purely a type-level thing
359359
}
360360
Some(AdjustDerefRef(adj)) => {

src/librustc_trans/trans/expr.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ use trans::tvec;
7171
use trans::type_of;
7272
use trans::Disr;
7373
use middle::ty::adjustment::{AdjustDerefRef, AdjustReifyFnPointer};
74-
use middle::ty::adjustment::{AdjustUnsafeFnPointer, CustomCoerceUnsized};
74+
use middle::ty::adjustment::{AdjustUnsafeFnPointer, AdjustMutToConstPointer};
75+
use middle::ty::adjustment::CustomCoerceUnsized;
7576
use middle::ty::{self, Ty};
7677
use middle::ty::MethodCall;
7778
use middle::ty::cast::{CastKind, CastTy};
@@ -354,7 +355,7 @@ fn adjustment_required<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
354355
// zero-sized, we'll need to return true here
355356
false
356357
}
357-
AdjustUnsafeFnPointer => {
358+
AdjustUnsafeFnPointer | AdjustMutToConstPointer => {
358359
// purely a type-level thing
359360
false
360361
}
@@ -391,7 +392,7 @@ fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
391392
// FIXME(#19925) once fn item types are
392393
// zero-sized, we'll need to do something here
393394
}
394-
AdjustUnsafeFnPointer => {
395+
AdjustUnsafeFnPointer | AdjustMutToConstPointer => {
395396
// purely a type-level thing
396397
}
397398
AdjustDerefRef(ref adj) => {

src/librustc_typeck/check/coercion.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use middle::traits::{self, ObligationCause};
6767
use middle::traits::{predicate_for_trait_def, report_selection_error};
6868
use middle::ty::adjustment::{AutoAdjustment, AutoDerefRef, AdjustDerefRef};
6969
use middle::ty::adjustment::{AutoPtr, AutoUnsafe, AdjustReifyFnPointer};
70-
use middle::ty::adjustment::{AdjustUnsafeFnPointer};
70+
use middle::ty::adjustment::{AdjustUnsafeFnPointer, AdjustMutToConstPointer};
7171
use middle::ty::{self, LvaluePreference, TypeAndMut, Ty};
7272
use middle::ty::fold::TypeFoldable;
7373
use middle::ty::error::TypeError;
@@ -427,6 +427,8 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
427427
autoref: Some(AutoUnsafe(mutbl_b)),
428428
unsize: None
429429
})))
430+
} else if mt_a.mutbl != mutbl_b {
431+
Ok(Some(AdjustMutToConstPointer))
430432
} else {
431433
Ok(None)
432434
}

src/librustc_typeck/check/writeback.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
305305
adjustment::AdjustReifyFnPointer
306306
}
307307

308+
adjustment::AdjustMutToConstPointer => {
309+
adjustment::AdjustMutToConstPointer
310+
}
311+
308312
adjustment::AdjustUnsafeFnPointer => {
309313
adjustment::AdjustUnsafeFnPointer
310314
}

0 commit comments

Comments
 (0)