From f829d208a30a4a8880ffb07ce4582e30c8f8d57f Mon Sep 17 00:00:00 2001 From: Kevin Butler Date: Thu, 17 Apr 2014 01:17:23 +0100 Subject: [PATCH] Catch forward declarations in default type params at AST conversion. --- src/librustc/middle/typeck/collect.rs | 19 ++++++++++++++++++- .../generic-type-params-forward-mention.rs | 3 +-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/librustc/middle/typeck/collect.rs b/src/librustc/middle/typeck/collect.rs index 7e53445147f5..6df8da3edaa6 100644 --- a/src/librustc/middle/typeck/collect.rs +++ b/src/librustc/middle/typeck/collect.rs @@ -945,7 +945,24 @@ pub fn ty_generics(ccx: &CrateCtxt, let param_ty = ty::param_ty {idx: base_index + offset, def_id: local_def(param.id)}; let bounds = @compute_bounds(ccx, param_ty, ¶m.bounds); - let default = param.default.map(|x| ast_ty_to_ty(ccx, &ExplicitRscope, x)); + let default = param.default.map(|path| { + let ty = ast_ty_to_ty(ccx, &ExplicitRscope, path); + let cur_idx = param_ty.idx; + + ty::walk_ty(ty, |t| { + match ty::get(t).sty { + ty::ty_param(p) => if p.idx > cur_idx { + ccx.tcx.sess.span_err(path.span, + "type parameters with a default cannot use \ + forward declared identifiers") + }, + _ => {} + } + }); + + ty + }); + let def = ty::TypeParameterDef { ident: param.ident, def_id: local_def(param.id), diff --git a/src/test/compile-fail/generic-type-params-forward-mention.rs b/src/test/compile-fail/generic-type-params-forward-mention.rs index 424a92d74eec..ace53fb51a40 100644 --- a/src/test/compile-fail/generic-type-params-forward-mention.rs +++ b/src/test/compile-fail/generic-type-params-forward-mention.rs @@ -12,8 +12,7 @@ // Ensure that we get an error and not an ICE for this problematic case. struct Foo, U = bool>; - +//~^ ERROR type parameters with a default cannot use forward declared identifiers fn main() { let x: Foo; - //~^ ERROR missing type param `U` in the substitution of `std::option::Option` }