Skip to content

Commit

Permalink
Rollup merge of #120213 - compiler-errors:dont-make-non-lifetime-bind…
Browse files Browse the repository at this point in the history
…ers-in-rtn, r=fmease

Don't actually make bound ty/const for RTN

Avoid creating an unnecessary non-lifetime binder when we do RTN on a method that has ty/const params.

Fixes #120208

r? oli-obk
  • Loading branch information
matthiaskrgr authored Jan 22, 2024
2 parents 2346647 + 802d16c commit ba542c8
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 25 deletions.
34 changes: 9 additions & 25 deletions compiler/rustc_hir_analysis/src/astconv/bounds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
}

let projection_ty = if let ty::AssocKind::Fn = assoc_kind {
let mut emitted_bad_param_err = false;
let mut emitted_bad_param_err = None;
// If we have an method return type bound, then we need to substitute
// the method's early bound params with suitable late-bound params.
let mut num_bound_vars = candidate.bound_vars().len();
Expand All @@ -346,46 +346,30 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
)
.into(),
ty::GenericParamDefKind::Type { .. } => {
if !emitted_bad_param_err {
let guar = *emitted_bad_param_err.get_or_insert_with(|| {
tcx.dcx().emit_err(
crate::errors::ReturnTypeNotationIllegalParam::Type {
span: path_span,
param_span: tcx.def_span(param.def_id),
},
);
emitted_bad_param_err = true;
}
Ty::new_bound(
tcx,
ty::INNERMOST,
ty::BoundTy {
var: ty::BoundVar::from_usize(num_bound_vars),
kind: ty::BoundTyKind::Param(param.def_id, param.name),
},
)
.into()
)
});
Ty::new_error(tcx, guar).into()
}
ty::GenericParamDefKind::Const { .. } => {
if !emitted_bad_param_err {
let guar = *emitted_bad_param_err.get_or_insert_with(|| {
tcx.dcx().emit_err(
crate::errors::ReturnTypeNotationIllegalParam::Const {
span: path_span,
param_span: tcx.def_span(param.def_id),
},
);
emitted_bad_param_err = true;
}
)
});
let ty = tcx
.type_of(param.def_id)
.no_bound_vars()
.expect("ct params cannot have early bound vars");
ty::Const::new_bound(
tcx,
ty::INNERMOST,
ty::BoundVar::from_usize(num_bound_vars),
ty,
)
.into()
ty::Const::new_error(tcx, guar, ty).into()
}
};
num_bound_vars += 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// edition: 2021

#![feature(return_type_notation)]
//~^ WARN the feature `return_type_notation` is incomplete

trait HealthCheck {
async fn check<const N: usize>() -> bool;
}

async fn do_health_check_par<HC>(hc: HC)
where
HC: HealthCheck<check(): Send> + Send + 'static,
//~^ ERROR return type notation is not allowed for functions that have const parameters
{
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
warning: the feature `return_type_notation` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/issue-120208-higher-ranked-const.rs:3:12
|
LL | #![feature(return_type_notation)]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #109417 <https://github.com/rust-lang/rust/issues/109417> for more information
= note: `#[warn(incomplete_features)]` on by default

error: return type notation is not allowed for functions that have const parameters
--> $DIR/issue-120208-higher-ranked-const.rs:12:21
|
LL | async fn check<const N: usize>() -> bool;
| -------------- const parameter declared here
...
LL | HC: HealthCheck<check(): Send> + Send + 'static,
| ^^^^^^^^^^^^^

error: aborting due to 1 previous error; 1 warning emitted

0 comments on commit ba542c8

Please sign in to comment.