Remove logic in one_bound in astconv that prefers non-const bounds
This commit is contained in:
parent
e44b11f695
commit
760673e97d
@ -1032,7 +1032,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
self.trait_defines_associated_item_named(r.def_id(), assoc_kind, assoc_name)
|
||||
});
|
||||
|
||||
let Some(mut bound) = matching_candidates.next() else {
|
||||
let Some(bound) = matching_candidates.next() else {
|
||||
let reported = self.complain_about_assoc_item_not_found(
|
||||
all_candidates,
|
||||
&ty_param_name.to_string(),
|
||||
@ -1046,38 +1046,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
};
|
||||
debug!(?bound);
|
||||
|
||||
// look for a candidate that is not the same as our first bound, disregarding
|
||||
// whether the bound is const.
|
||||
let mut next_cand = matching_candidates.next();
|
||||
while let Some(mut bound2) = next_cand {
|
||||
debug!(?bound2);
|
||||
if bound2.bound_vars() != bound.bound_vars() {
|
||||
break;
|
||||
}
|
||||
|
||||
let generics = tcx.generics_of(bound.def_id());
|
||||
let Some(host_index) = generics.host_effect_index else { break };
|
||||
|
||||
// always return the bound that contains the host param.
|
||||
if let ty::ConstKind::Param(_) = bound2.skip_binder().args.const_at(host_index).kind() {
|
||||
(bound, bound2) = (bound2, bound);
|
||||
}
|
||||
|
||||
let unconsted_args = bound
|
||||
.skip_binder()
|
||||
.args
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(n, arg)| if host_index == n { tcx.consts.true_.into() } else { arg });
|
||||
|
||||
if unconsted_args.eq(bound2.skip_binder().args.iter()) {
|
||||
next_cand = matching_candidates.next();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(bound2) = next_cand {
|
||||
if let Some(bound2) = matching_candidates.next() {
|
||||
debug!(?bound2);
|
||||
|
||||
let assoc_kind_str = assoc_kind_str(assoc_kind);
|
||||
|
@ -1,4 +1,6 @@
|
||||
// known-bug: #110395
|
||||
// Broken until we have `&T: const Deref` impl in stdlib
|
||||
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(
|
||||
associated_type_bounds,
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0277]: can't compare `()` with `()`
|
||||
--> $DIR/const-impl-trait.rs:35:17
|
||||
--> $DIR/const-impl-trait.rs:37:17
|
||||
|
|
||||
LL | assert!(cmp(&()));
|
||||
| --- ^^^ no implementation for `() == ()`
|
||||
@ -9,23 +9,20 @@ LL | assert!(cmp(&()));
|
||||
= help: the trait `const PartialEq` is not implemented for `()`
|
||||
= help: the trait `PartialEq` is implemented for `()`
|
||||
note: required by a bound in `cmp`
|
||||
--> $DIR/const-impl-trait.rs:12:23
|
||||
--> $DIR/const-impl-trait.rs:14:23
|
||||
|
|
||||
LL | const fn cmp(a: &impl ~const PartialEq) -> bool {
|
||||
| ^^^^^^^^^^^^^^^^ required by this bound in `cmp`
|
||||
|
||||
error[E0277]: can't compare `&impl ~const PartialEq` with `&impl ~const PartialEq`
|
||||
--> $DIR/const-impl-trait.rs:13:7
|
||||
error[E0369]: binary operation `==` cannot be applied to type `&impl ~const PartialEq`
|
||||
--> $DIR/const-impl-trait.rs:15:7
|
||||
|
|
||||
LL | a == a
|
||||
| ^^ no implementation for `&impl ~const PartialEq == &impl ~const PartialEq`
|
||||
|
|
||||
= help: the trait `~const PartialEq<&impl ~const PartialEq>` is not implemented for `&impl ~const PartialEq`
|
||||
help: consider dereferencing both sides of the expression
|
||||
|
|
||||
LL | *a == *a
|
||||
| + +
|
||||
| - ^^ - &impl ~const PartialEq
|
||||
| |
|
||||
| &impl ~const PartialEq
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Some errors have detailed explanations: E0277, E0369.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
Loading…
x
Reference in New Issue
Block a user