diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 8e2691c8a27a..f32df13ad2a3 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -3042,15 +3042,17 @@ pub fn adjust_ty(cx: ctxt, Some(@AutoDerefRef(ref adj)) => { let mut adjusted_ty = unadjusted_ty; - for uint::range(0, adj.autoderefs) |i| { - match ty::deref(cx, adjusted_ty, true) { - Some(mt) => { adjusted_ty = mt.ty; } - None => { - cx.sess.span_bug( - span, - fmt!("The %uth autoderef failed: %s", - i, ty_to_str(cx, - adjusted_ty))); + if (!ty::type_is_error(adjusted_ty)) { + for uint::range(0, adj.autoderefs) |i| { + match ty::deref(cx, adjusted_ty, true) { + Some(mt) => { adjusted_ty = mt.ty; } + None => { + cx.sess.span_bug( + span, + fmt!("The %uth autoderef failed: %s", + i, ty_to_str(cx, + adjusted_ty))); + } } } } diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index 58749b92ddcd..2eb646a0b9b4 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -1108,6 +1108,12 @@ pub mod guarantor { -> ExprCategorizationType { let mut ct = ct; let tcx = rcx.fcx.ccx.tcx; + + if (ty::type_is_error(ct.ty)) { + ct.cat.pointer = NotPointer; + return ct; + } + for uint::range(0, autoderefs) |_| { ct.cat.guarantor = guarantor_of_deref(&ct.cat);