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),
// Ensure that we get an error and not an ICE for this problematic case.
struct Foo<T = Option<U>, 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<U>`
}