Rollup merge of #114746 - compiler-errors:atb-no-const, r=TaKO8Ki
Don't add associated type bound for non-types We had this fix for equality constraints (#99890), but for some reason not trait constraints 😅 Fixes #114744
This commit is contained in:
commit
e21e039a78
@ -1,6 +1,9 @@
|
|||||||
hir_analysis_ambiguous_lifetime_bound =
|
hir_analysis_ambiguous_lifetime_bound =
|
||||||
ambiguous lifetime bound, explicit lifetime bound required
|
ambiguous lifetime bound, explicit lifetime bound required
|
||||||
|
|
||||||
|
hir_analysis_assoc_bound_on_const = expected associated type, found {$descr}
|
||||||
|
.note = trait bounds not allowed on {$descr}
|
||||||
|
|
||||||
hir_analysis_assoc_type_binding_not_allowed =
|
hir_analysis_assoc_type_binding_not_allowed =
|
||||||
associated type bindings are not allowed here
|
associated type bindings are not allowed here
|
||||||
.label = associated type not allowed here
|
.label = associated type not allowed here
|
||||||
|
@ -13,7 +13,7 @@ use crate::astconv::{
|
|||||||
AstConv, ConvertedBinding, ConvertedBindingKind, OnlySelfBounds, PredicateFilter,
|
AstConv, ConvertedBinding, ConvertedBindingKind, OnlySelfBounds, PredicateFilter,
|
||||||
};
|
};
|
||||||
use crate::bounds::Bounds;
|
use crate::bounds::Bounds;
|
||||||
use crate::errors::{MultipleRelaxedDefaultBounds, ValueOfAssociatedStructAlreadySpecified};
|
use crate::errors;
|
||||||
|
|
||||||
impl<'tcx> dyn AstConv<'tcx> + '_ {
|
impl<'tcx> dyn AstConv<'tcx> + '_ {
|
||||||
/// Sets `implicitly_sized` to true on `Bounds` if necessary
|
/// Sets `implicitly_sized` to true on `Bounds` if necessary
|
||||||
@ -35,7 +35,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
if unbound.is_none() {
|
if unbound.is_none() {
|
||||||
unbound = Some(&ptr.trait_ref);
|
unbound = Some(&ptr.trait_ref);
|
||||||
} else {
|
} else {
|
||||||
tcx.sess.emit_err(MultipleRelaxedDefaultBounds { span });
|
tcx.sess.emit_err(errors::MultipleRelaxedDefaultBounds { span });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -326,7 +326,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
dup_bindings
|
dup_bindings
|
||||||
.entry(assoc_item.def_id)
|
.entry(assoc_item.def_id)
|
||||||
.and_modify(|prev_span| {
|
.and_modify(|prev_span| {
|
||||||
tcx.sess.emit_err(ValueOfAssociatedStructAlreadySpecified {
|
tcx.sess.emit_err(errors::ValueOfAssociatedStructAlreadySpecified {
|
||||||
span: binding.span,
|
span: binding.span,
|
||||||
prev_span: *prev_span,
|
prev_span: *prev_span,
|
||||||
item_name: binding.item_name,
|
item_name: binding.item_name,
|
||||||
@ -488,6 +488,8 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let assoc_item_def_id = projection_ty.skip_binder().def_id;
|
||||||
|
let def_kind = tcx.def_kind(assoc_item_def_id);
|
||||||
match binding.kind {
|
match binding.kind {
|
||||||
ConvertedBindingKind::Equality(..) if return_type_notation => {
|
ConvertedBindingKind::Equality(..) if return_type_notation => {
|
||||||
return Err(self.tcx().sess.emit_err(
|
return Err(self.tcx().sess.emit_err(
|
||||||
@ -499,11 +501,9 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
// the "projection predicate" for:
|
// the "projection predicate" for:
|
||||||
//
|
//
|
||||||
// `<T as Iterator>::Item = u32`
|
// `<T as Iterator>::Item = u32`
|
||||||
let assoc_item_def_id = projection_ty.skip_binder().def_id;
|
|
||||||
let def_kind = tcx.def_kind(assoc_item_def_id);
|
|
||||||
match (def_kind, term.unpack()) {
|
match (def_kind, term.unpack()) {
|
||||||
(hir::def::DefKind::AssocTy, ty::TermKind::Ty(_))
|
(DefKind::AssocTy, ty::TermKind::Ty(_))
|
||||||
| (hir::def::DefKind::AssocConst, ty::TermKind::Const(_)) => (),
|
| (DefKind::AssocConst, ty::TermKind::Const(_)) => (),
|
||||||
(_, _) => {
|
(_, _) => {
|
||||||
let got = if let Some(_) = term.ty() { "type" } else { "constant" };
|
let got = if let Some(_) = term.ty() { "type" } else { "constant" };
|
||||||
let expected = tcx.def_descr(assoc_item_def_id);
|
let expected = tcx.def_descr(assoc_item_def_id);
|
||||||
@ -516,7 +516,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
format!("{expected} defined here"),
|
format!("{expected} defined here"),
|
||||||
);
|
);
|
||||||
|
|
||||||
if let hir::def::DefKind::AssocConst = def_kind
|
if let DefKind::AssocConst = def_kind
|
||||||
&& let Some(t) = term.ty() && (t.is_enum() || t.references_error())
|
&& let Some(t) = term.ty() && (t.is_enum() || t.references_error())
|
||||||
&& tcx.features().associated_const_equality {
|
&& tcx.features().associated_const_equality {
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
@ -528,8 +528,8 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
}
|
}
|
||||||
let reported = err.emit();
|
let reported = err.emit();
|
||||||
term = match def_kind {
|
term = match def_kind {
|
||||||
hir::def::DefKind::AssocTy => Ty::new_error(tcx, reported).into(),
|
DefKind::AssocTy => Ty::new_error(tcx, reported).into(),
|
||||||
hir::def::DefKind::AssocConst => ty::Const::new_error(
|
DefKind::AssocConst => ty::Const::new_error(
|
||||||
tcx,
|
tcx,
|
||||||
reported,
|
reported,
|
||||||
tcx.type_of(assoc_item_def_id)
|
tcx.type_of(assoc_item_def_id)
|
||||||
@ -548,6 +548,15 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
ConvertedBindingKind::Constraint(ast_bounds) => {
|
ConvertedBindingKind::Constraint(ast_bounds) => {
|
||||||
|
match def_kind {
|
||||||
|
DefKind::AssocTy => {}
|
||||||
|
_ => {
|
||||||
|
return Err(tcx.sess.emit_err(errors::AssocBoundOnConst {
|
||||||
|
span: assoc_ident.span,
|
||||||
|
descr: tcx.def_descr(assoc_item_def_id),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
// "Desugar" a constraint like `T: Iterator<Item: Debug>` to
|
// "Desugar" a constraint like `T: Iterator<Item: Debug>` to
|
||||||
//
|
//
|
||||||
// `<T as Iterator>::Item: Debug`
|
// `<T as Iterator>::Item: Debug`
|
||||||
|
@ -918,3 +918,12 @@ pub struct UnusedAssociatedTypeBounds {
|
|||||||
#[suggestion(code = "")]
|
#[suggestion(code = "")]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(hir_analysis_assoc_bound_on_const)]
|
||||||
|
#[note]
|
||||||
|
pub struct AssocBoundOnConst {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
pub descr: &'static str,
|
||||||
|
}
|
||||||
|
10
tests/ui/associated-type-bounds/consts.rs
Normal file
10
tests/ui/associated-type-bounds/consts.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#![feature(associated_type_bounds)]
|
||||||
|
|
||||||
|
pub fn accept(_: impl Trait<K: Copy>) {}
|
||||||
|
//~^ ERROR expected associated type, found associated constant
|
||||||
|
|
||||||
|
pub trait Trait {
|
||||||
|
const K: i32;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
10
tests/ui/associated-type-bounds/consts.stderr
Normal file
10
tests/ui/associated-type-bounds/consts.stderr
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
error: expected associated type, found associated constant
|
||||||
|
--> $DIR/consts.rs:3:29
|
||||||
|
|
|
||||||
|
LL | pub fn accept(_: impl Trait<K: Copy>) {}
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: trait bounds not allowed on associated constant
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user