diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_typeck/src/check/wfcheck.rs | 26 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/collect.rs | 10 |
2 files changed, 21 insertions, 15 deletions
diff --git a/compiler/rustc_typeck/src/check/wfcheck.rs b/compiler/rustc_typeck/src/check/wfcheck.rs index 0e063c86f2f..4838d70a831 100644 --- a/compiler/rustc_typeck/src/check/wfcheck.rs +++ b/compiler/rustc_typeck/src/check/wfcheck.rs @@ -738,15 +738,19 @@ fn check_where_clauses<'tcx, 'fcx>( } } GenericParamDefKind::Const { .. } => { - // FIXME(const_generics_defaults): Figure out if this - // is the behavior we want, see the comment further below. if is_our_default(¶m) { + // FIXME(const_generics_defaults): This + // is incorrect when dealing with unused substs, for example + // for `struct Foo<const N: usize, const M: usize = { 1 - 2 }>` + // we should eagerly error. let default_ct = tcx.const_param_default(param.def_id); - fcx.register_wf_obligation( - default_ct.into(), - tcx.def_span(param.def_id), - ObligationCauseCode::MiscObligation, - ); + if !default_ct.needs_subst() { + fcx.register_wf_obligation( + default_ct.into(), + tcx.def_span(param.def_id), + ObligationCauseCode::MiscObligation, + ); + } } } // Doesn't have defaults. @@ -783,14 +787,6 @@ fn check_where_clauses<'tcx, 'fcx>( tcx.mk_param_from_def(param) } GenericParamDefKind::Const { .. } => { - // FIXME(const_generics_defaults): I(@lcnr) feel like always - // using the const parameter is the right choice here, even - // if it needs substs. - // - // Before stabilizing this we probably want to get some tests - // where this makes a difference and figure out what's the exact - // behavior we want here. - // If the param has a default, ... if is_our_default(param) { let default_ct = tcx.const_param_default(param.def_id); diff --git a/compiler/rustc_typeck/src/collect.rs b/compiler/rustc_typeck/src/collect.rs index b0e5453b7db..583ba9392f0 100644 --- a/compiler/rustc_typeck/src/collect.rs +++ b/compiler/rustc_typeck/src/collect.rs @@ -2308,6 +2308,16 @@ fn const_evaluatable_predicates_of<'tcx>( )); } } + + fn visit_const_param_default(&mut self, _param: HirId, _ct: &'tcx hir::AnonConst) { + // Do not look into const param defaults, + // these get checked when they are actually instantiated. + // + // We do not want the following to error: + // + // struct Foo<const N: usize, const M: usize = { N + 1 }>; + // struct Bar<const N: usize>(Foo<N, 3>); + } } let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); |
