Auto merge of #120381 - fee1-dead-contrib:reconstify-add, r=compiler-errors
Reconstify `Add` r? project-const-traits I'm not happy with the ui test changes (or failures because I did not bless them and include the diffs in this PR). There is at least some bugs I need to look and try fix: 1. A third duplicated diagnostic when a consumer crate that does not have `effects` enabled has a trait selection error for an upstream const_trait trait. See tests/ui/ufcs/ufcs-qpath-self-mismatch.rs. 2. For some reason, making `Add` a const trait would stop us from suggesting `T: Add` when we try to add two `T`s without that bound. See tests/ui/suggestions/issue-97677.rs
This commit is contained in:
commit
6894f435d3
@ -98,6 +98,7 @@ impl<'tcx, T> IsSuggestable<'tcx> for T
|
|||||||
where
|
where
|
||||||
T: TypeVisitable<TyCtxt<'tcx>> + TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeVisitable<TyCtxt<'tcx>> + TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
|
#[tracing::instrument(level = "debug", skip(tcx))]
|
||||||
fn is_suggestable(self, tcx: TyCtxt<'tcx>, infer_suggestable: bool) -> bool {
|
fn is_suggestable(self, tcx: TyCtxt<'tcx>, infer_suggestable: bool) -> bool {
|
||||||
self.visit_with(&mut IsSuggestableVisitor { tcx, infer_suggestable }).is_continue()
|
self.visit_with(&mut IsSuggestableVisitor { tcx, infer_suggestable }).is_continue()
|
||||||
}
|
}
|
||||||
@ -533,6 +534,9 @@ fn visit_const(&mut self, c: Const<'tcx>) -> ControlFlow<Self::BreakTy> {
|
|||||||
match c.kind() {
|
match c.kind() {
|
||||||
ConstKind::Infer(InferConst::Var(_)) if self.infer_suggestable => {}
|
ConstKind::Infer(InferConst::Var(_)) if self.infer_suggestable => {}
|
||||||
|
|
||||||
|
// effect variables are always suggestable, because they are not visible
|
||||||
|
ConstKind::Infer(InferConst::EffectVar(_)) => {}
|
||||||
|
|
||||||
ConstKind::Infer(..)
|
ConstKind::Infer(..)
|
||||||
| ConstKind::Bound(..)
|
| ConstKind::Bound(..)
|
||||||
| ConstKind::Placeholder(..)
|
| ConstKind::Placeholder(..)
|
||||||
|
@ -73,6 +73,7 @@
|
|||||||
append_const_msg
|
append_const_msg
|
||||||
)]
|
)]
|
||||||
#[doc(alias = "+")]
|
#[doc(alias = "+")]
|
||||||
|
#[const_trait]
|
||||||
pub trait Add<Rhs = Self> {
|
pub trait Add<Rhs = Self> {
|
||||||
/// The resulting type after applying the `+` operator.
|
/// The resulting type after applying the `+` operator.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@ -94,7 +95,8 @@ pub trait Add<Rhs = Self> {
|
|||||||
macro_rules! add_impl {
|
macro_rules! add_impl {
|
||||||
($($t:ty)*) => ($(
|
($($t:ty)*) => ($(
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl Add for $t {
|
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
|
||||||
|
impl const Add for $t {
|
||||||
type Output = $t;
|
type Output = $t;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -16,6 +16,10 @@ help: consider annotating `S<T>` with `#[derive(PartialEq)]`
|
|||||||
LL + #[derive(PartialEq)]
|
LL + #[derive(PartialEq)]
|
||||||
LL | struct S<T>(T);
|
LL | struct S<T>(T);
|
||||||
|
|
|
|
||||||
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
||||||
|
LL | pub fn foo<T>(s: S<T>, t: S<T>) where S<T>: PartialEq {
|
||||||
|
| +++++++++++++++++++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -11,6 +11,19 @@ LL | <i32 as Add<u32>>::add(1, 2);
|
|||||||
<&'a i32 as Add<i32>>
|
<&'a i32 as Add<i32>>
|
||||||
<&i32 as Add<&i32>>
|
<&i32 as Add<&i32>>
|
||||||
|
|
||||||
|
error[E0277]: cannot add `u32` to `i32`
|
||||||
|
--> $DIR/ufcs-qpath-self-mismatch.rs:4:5
|
||||||
|
|
|
||||||
|
LL | <i32 as Add<u32>>::add(1, 2);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `i32 + u32`
|
||||||
|
|
|
||||||
|
= help: the trait `Add<u32>` is not implemented for `i32`
|
||||||
|
= help: the following other types implement trait `Add<Rhs>`:
|
||||||
|
<i32 as Add>
|
||||||
|
<i32 as Add<&i32>>
|
||||||
|
<&'a i32 as Add<i32>>
|
||||||
|
<&i32 as Add<&i32>>
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/ufcs-qpath-self-mismatch.rs:7:28
|
--> $DIR/ufcs-qpath-self-mismatch.rs:7:28
|
||||||
|
|
|
|
||||||
@ -55,19 +68,6 @@ help: change the type of the numeric literal from `u32` to `i32`
|
|||||||
LL | <i32 as Add<i32>>::add(1, 2i32);
|
LL | <i32 as Add<i32>>::add(1, 2i32);
|
||||||
| ~~~
|
| ~~~
|
||||||
|
|
||||||
error[E0277]: cannot add `u32` to `i32`
|
|
||||||
--> $DIR/ufcs-qpath-self-mismatch.rs:4:5
|
|
||||||
|
|
|
||||||
LL | <i32 as Add<u32>>::add(1, 2);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `i32 + u32`
|
|
||||||
|
|
|
||||||
= help: the trait `Add<u32>` is not implemented for `i32`
|
|
||||||
= help: the following other types implement trait `Add<Rhs>`:
|
|
||||||
<i32 as Add>
|
|
||||||
<i32 as Add<&i32>>
|
|
||||||
<&'a i32 as Add<i32>>
|
|
||||||
<&i32 as Add<&i32>>
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0277, E0308.
|
Some errors have detailed explanations: E0277, E0308.
|
||||||
|
Loading…
Reference in New Issue
Block a user