From c786b68dd3ecf96e202f50ba600292f54b35f2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Fri, 7 Jun 2013 18:06:38 +0200 Subject: [PATCH 1/4] Add a test that causes an ICE currently --- src/test/compile-fail/unconstrained-ref.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/compile-fail/unconstrained-ref.rs diff --git a/src/test/compile-fail/unconstrained-ref.rs b/src/test/compile-fail/unconstrained-ref.rs new file mode 100644 index 000000000000..80bd83caf325 --- /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 +} From f3f9db133aae35956f2fb91ce4d017260f5f7828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Fri, 7 Jun 2013 18:08:06 +0200 Subject: [PATCH 2/4] rustc: Fix an ICE "Autoderef but type not derefable" Related to #5062 (same error message), but that test case causes a different ICE than mentioned there (even without this fix). --- src/librustc/middle/ty.rs | 20 +++++++++++--------- src/librustc/middle/typeck/check/regionck.rs | 6 ++++++ 2 files changed, 17 insertions(+), 9 deletions(-) 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); From c74f39782f868e235868126aec7485d23848d2e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Fri, 7 Jun 2013 20:07:58 +0200 Subject: [PATCH 3/4] Add test for #5062 --- src/test/compile-fail/unconstrained-none.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/compile-fail/unconstrained-none.rs diff --git a/src/test/compile-fail/unconstrained-none.rs b/src/test/compile-fail/unconstrained-none.rs new file mode 100644 index 000000000000..7993df80b8d1 --- /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 +} From a99ba1180d16394427fcd0fa74ce6dfff96d5566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Fri, 7 Jun 2013 20:08:47 +0200 Subject: [PATCH 4/4] rustc::regionck: fix ICE when getting signature of ty_err Fixes #5062 --- src/librustc/middle/typeck/check/regionck.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index 2eb646a0b9b4..9cfa0187ab65 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