diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 8e2691c8a27a1..f32df13ad2a36 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 58749b92ddcd4..9cfa0187ab658 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -460,6 +460,10 @@ fn constrain_call(rcx: @mut Rcx, debug!("constrain_call(call_expr=%s, implicitly_ref_args=%?)", call_expr.repr(tcx), implicitly_ref_args); let callee_ty = rcx.resolve_node_type(callee_id); + if ty::type_is_error(callee_ty) { + // Bail, as function type is unknown + return; + } let fn_sig = ty::ty_fn_sig(callee_ty); // `callee_region` is the scope representing the time in which the @@ -1108,6 +1112,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); diff --git a/src/test/compile-fail/unconstrained-none.rs b/src/test/compile-fail/unconstrained-none.rs new file mode 100644 index 0000000000000..7993df80b8d1b --- /dev/null +++ b/src/test/compile-fail/unconstrained-none.rs @@ -0,0 +1,15 @@ +// Copyright 2013 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. + +// Issue #5062 + +fn main() { + fmt!("%?", None); //~ ERROR cannot determine a type for this expression: unconstrained type +} diff --git a/src/test/compile-fail/unconstrained-ref.rs b/src/test/compile-fail/unconstrained-ref.rs new file mode 100644 index 0000000000000..80bd83caf3250 --- /dev/null +++ b/src/test/compile-fail/unconstrained-ref.rs @@ -0,0 +1,17 @@ +// Copyright 2012 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. + +struct S<'self, T> { + o: &'self Option +} + +fn main() { + S { o: &None }; //~ ERROR cannot determine a type for this expression: unconstrained type +}