mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-06 04:08:40 +00:00
Rollup merge of #95751 - compiler-errors:ambig-int, r=jackh726
Don't report numeric inference ambiguity when we have previous errors Fixes #95648
This commit is contained in:
commit
d4e0ddf7c8
@ -36,6 +36,7 @@ use rustc_span::symbol::{kw, sym};
|
|||||||
use rustc_span::{ExpnKind, Span, DUMMY_SP};
|
use rustc_span::{ExpnKind, Span, DUMMY_SP};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
|
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||||
use crate::traits::query::normalize::AtExt as _;
|
use crate::traits::query::normalize::AtExt as _;
|
||||||
@ -2226,9 +2227,10 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
|
|||||||
post.dedup();
|
post.dedup();
|
||||||
|
|
||||||
if self.is_tainted_by_errors()
|
if self.is_tainted_by_errors()
|
||||||
&& crate_names.len() == 1
|
&& (crate_names.len() == 1
|
||||||
&& ["`core`", "`alloc`", "`std`"].contains(&crate_names[0].as_str())
|
&& spans.len() == 0
|
||||||
&& spans.len() == 0
|
&& ["`core`", "`alloc`", "`std`"].contains(&crate_names[0].as_str())
|
||||||
|
|| predicate.visit_with(&mut HasNumericInferVisitor).is_break())
|
||||||
{
|
{
|
||||||
// Avoid complaining about other inference issues for expressions like
|
// Avoid complaining about other inference issues for expressions like
|
||||||
// `42 >> 1`, where the types are still `{integer}`, but we want to
|
// `42 >> 1`, where the types are still `{integer}`, but we want to
|
||||||
@ -2666,3 +2668,17 @@ impl ArgKind {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct HasNumericInferVisitor;
|
||||||
|
|
||||||
|
impl<'tcx> ty::TypeVisitor<'tcx> for HasNumericInferVisitor {
|
||||||
|
type BreakTy = ();
|
||||||
|
|
||||||
|
fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
||||||
|
if matches!(ty.kind(), ty::Infer(ty::FloatVar(_) | ty::IntVar(_))) {
|
||||||
|
ControlFlow::Break(())
|
||||||
|
} else {
|
||||||
|
ControlFlow::CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
16
src/test/ui/traits/no-fallback-multiple-impls.rs
Normal file
16
src/test/ui/traits/no-fallback-multiple-impls.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
trait Fallback {
|
||||||
|
fn foo(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Fallback for i32 {}
|
||||||
|
|
||||||
|
impl Fallback for u64 {}
|
||||||
|
|
||||||
|
impl Fallback for usize {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
missing();
|
||||||
|
//~^ ERROR cannot find function `missing` in this scope
|
||||||
|
0.foo();
|
||||||
|
// But then we shouldn't report an inference ambiguity here...
|
||||||
|
}
|
9
src/test/ui/traits/no-fallback-multiple-impls.stderr
Normal file
9
src/test/ui/traits/no-fallback-multiple-impls.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0425]: cannot find function `missing` in this scope
|
||||||
|
--> $DIR/no-fallback-multiple-impls.rs:12:5
|
||||||
|
|
|
||||||
|
LL | missing();
|
||||||
|
| ^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0425`.
|
@ -6,9 +6,9 @@ impl bar for i32 { fn dup(&self) -> i32 { *self } fn blah<X>(&self) {} }
|
|||||||
impl bar for u32 { fn dup(&self) -> u32 { *self } fn blah<X>(&self) {} }
|
impl bar for u32 { fn dup(&self) -> u32 { *self } fn blah<X>(&self) {} }
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
10.dup::<i32>(); //~ ERROR type annotations needed
|
10.dup::<i32>();
|
||||||
//~^ ERROR this associated function takes 0 generic arguments but 1
|
//~^ ERROR this associated function takes 0 generic arguments but 1
|
||||||
10.blah::<i32, i32>(); //~ ERROR type annotations needed
|
10.blah::<i32, i32>();
|
||||||
//~^ ERROR this associated function takes 1 generic argument but 2
|
//~^ ERROR this associated function takes 1 generic argument but 2
|
||||||
(Box::new(10) as Box<dyn bar>).dup();
|
(Box::new(10) as Box<dyn bar>).dup();
|
||||||
//~^ ERROR E0038
|
//~^ ERROR E0038
|
||||||
|
@ -79,35 +79,7 @@ LL | trait bar { fn dup(&self) -> Self; fn blah<X>(&self); }
|
|||||||
= note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn bar>>` for `Box<{integer}>`
|
= note: required because of the requirements on the impl of `CoerceUnsized<Box<dyn bar>>` for `Box<{integer}>`
|
||||||
= note: required by cast to type `Box<dyn bar>`
|
= note: required by cast to type `Box<dyn bar>`
|
||||||
|
|
||||||
error[E0283]: type annotations needed
|
error: aborting due to 5 previous errors
|
||||||
--> $DIR/test-2.rs:9:8
|
|
||||||
|
|
|
||||||
LL | 10.dup::<i32>();
|
|
||||||
| ^^^ cannot infer type for type `{integer}`
|
|
||||||
|
|
|
||||||
note: multiple `impl`s satisfying `{integer}: bar` found
|
|
||||||
--> $DIR/test-2.rs:5:1
|
|
||||||
|
|
|
||||||
LL | impl bar for i32 { fn dup(&self) -> i32 { *self } fn blah<X>(&self) {} }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
LL | impl bar for u32 { fn dup(&self) -> u32 { *self } fn blah<X>(&self) {} }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error[E0283]: type annotations needed
|
Some errors have detailed explanations: E0038, E0107.
|
||||||
--> $DIR/test-2.rs:11:8
|
|
||||||
|
|
|
||||||
LL | 10.blah::<i32, i32>();
|
|
||||||
| ^^^^ cannot infer type for type `{integer}`
|
|
||||||
|
|
|
||||||
note: multiple `impl`s satisfying `{integer}: bar` found
|
|
||||||
--> $DIR/test-2.rs:5:1
|
|
||||||
|
|
|
||||||
LL | impl bar for i32 { fn dup(&self) -> i32 { *self } fn blah<X>(&self) {} }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
LL | impl bar for u32 { fn dup(&self) -> u32 { *self } fn blah<X>(&self) {} }
|
|
||||||
| ^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0038, E0107, E0283.
|
|
||||||
For more information about an error, try `rustc --explain E0038`.
|
For more information about an error, try `rustc --explain E0038`.
|
||||||
|
Loading…
Reference in New Issue
Block a user