1
Fork 0

Silence follow up errors if astconv already errored

This commit is contained in:
Oli Scherer 2024-01-10 10:31:06 +00:00
parent 252ac15286
commit af7f8f9811
21 changed files with 56 additions and 164 deletions

View file

@ -390,6 +390,12 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
infer_args, infer_args,
); );
if let Err(err) = &arg_count.correct
&& let Some(reported) = err.reported
{
self.set_tainted_by_errors(reported);
}
// Skip processing if type has no generic parameters. // Skip processing if type has no generic parameters.
// Traits always have `Self` as a generic parameter, which means they will not return early // Traits always have `Self` as a generic parameter, which means they will not return early
// here and so associated type bindings will be handled regardless of whether there are any // here and so associated type bindings will be handled regardless of whether there are any
@ -568,6 +574,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
span, span,
modifier: constness.as_str(), modifier: constness.as_str(),
}); });
self.set_tainted_by_errors(e);
arg_count.correct = arg_count.correct =
Err(GenericArgCountMismatch { reported: Some(e), invalid_args: vec![] }); Err(GenericArgCountMismatch { reported: Some(e), invalid_args: vec![] });
} }

View file

@ -35,6 +35,7 @@ use rustc_target::spec::abi;
use rustc_trait_selection::infer::InferCtxtExt; use rustc_trait_selection::infer::InferCtxtExt;
use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName; use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName;
use rustc_trait_selection::traits::ObligationCtxt; use rustc_trait_selection::traits::ObligationCtxt;
use std::cell::Cell;
use std::iter; use std::iter;
use std::ops::Bound; use std::ops::Bound;
@ -119,6 +120,7 @@ pub fn provide(providers: &mut Providers) {
pub struct ItemCtxt<'tcx> { pub struct ItemCtxt<'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
item_def_id: LocalDefId, item_def_id: LocalDefId,
tainted_by_errors: Cell<Option<ErrorGuaranteed>>,
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -343,7 +345,7 @@ fn bad_placeholder<'tcx>(
impl<'tcx> ItemCtxt<'tcx> { impl<'tcx> ItemCtxt<'tcx> {
pub fn new(tcx: TyCtxt<'tcx>, item_def_id: LocalDefId) -> ItemCtxt<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, item_def_id: LocalDefId) -> ItemCtxt<'tcx> {
ItemCtxt { tcx, item_def_id } ItemCtxt { tcx, item_def_id, tainted_by_errors: Cell::new(None) }
} }
pub fn to_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> { pub fn to_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> {
@ -357,6 +359,13 @@ impl<'tcx> ItemCtxt<'tcx> {
pub fn node(&self) -> hir::Node<'tcx> { pub fn node(&self) -> hir::Node<'tcx> {
self.tcx.hir_node(self.hir_id()) self.tcx.hir_node(self.hir_id())
} }
fn check_tainted_by_errors(&self) -> Result<(), ErrorGuaranteed> {
match self.tainted_by_errors.get() {
Some(err) => Err(err),
None => Ok(()),
}
}
} }
impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> { impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
@ -492,8 +501,8 @@ impl<'tcx> AstConv<'tcx> for ItemCtxt<'tcx> {
ty.ty_adt_def() ty.ty_adt_def()
} }
fn set_tainted_by_errors(&self, _: ErrorGuaranteed) { fn set_tainted_by_errors(&self, err: ErrorGuaranteed) {
// There's no obvious place to track this, so just let it go. self.tainted_by_errors.set(Some(err));
} }
fn record_ty(&self, _hir_id: hir::HirId, _ty: Ty<'tcx>, _span: Span) { fn record_ty(&self, _hir_id: hir::HirId, _ty: Ty<'tcx>, _span: Span) {

View file

@ -513,7 +513,11 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty
bug!("unexpected sort of node in type_of(): {:?}", x); bug!("unexpected sort of node in type_of(): {:?}", x);
} }
}; };
ty::EarlyBinder::bind(output) if let Err(e) = icx.check_tainted_by_errors() {
ty::EarlyBinder::bind(Ty::new_error(tcx, e))
} else {
ty::EarlyBinder::bind(output)
}
} }
pub(super) fn type_of_opaque( pub(super) fn type_of_opaque(

View file

@ -30,7 +30,7 @@ LL | type Item = &[T];
= help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
error[E0223]: ambiguous associated type error[E0223]: ambiguous associated type
--> $DIR/issue-109071.rs:16:22 --> $DIR/issue-109071.rs:15:22
| |
LL | fn T() -> Option<Self::Item> {} LL | fn T() -> Option<Self::Item> {}
| ^^^^^^^^^^ | ^^^^^^^^^^

View file

@ -9,13 +9,11 @@ impl<T> Windows { //~ ERROR: missing generics for struct `Windows`
//[no_gate]~^ ERROR: inherent associated types are unstable //[no_gate]~^ ERROR: inherent associated types are unstable
fn next() -> Option<Self::Item> {} fn next() -> Option<Self::Item> {}
//[with_gate]~^ ERROR type annotations needed
} }
impl<T> Windows<T> { impl<T> Windows<T> {
fn T() -> Option<Self::Item> {} fn T() -> Option<Self::Item> {}
//[no_gate]~^ ERROR: ambiguous associated type //~^ ERROR: ambiguous associated type
//[with_gate]~^^ ERROR type annotations needed
} }
fn main() {} fn main() {}

View file

@ -20,19 +20,20 @@ help: add missing generic argument
LL | impl<T> Windows<T> { LL | impl<T> Windows<T> {
| +++ | +++
error[E0282]: type annotations needed error[E0223]: ambiguous associated type
--> $DIR/issue-109071.rs:11:18 --> $DIR/issue-109071.rs:15:22
|
LL | fn next() -> Option<Self::Item> {}
| ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`
error[E0282]: type annotations needed
--> $DIR/issue-109071.rs:16:15
| |
LL | fn T() -> Option<Self::Item> {} LL | fn T() -> Option<Self::Item> {}
| ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T` | ^^^^^^^^^^
|
help: use fully-qualified syntax
|
LL | fn T() -> Option<<Windows<T> as IntoAsyncIterator>::Item> {}
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LL | fn T() -> Option<<Windows<T> as IntoIterator>::Item> {}
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 4 previous errors error: aborting due to 3 previous errors
Some errors have detailed explanations: E0107, E0282, E0637. Some errors have detailed explanations: E0107, E0223, E0637.
For more information about an error, try `rustc --explain E0107`. For more information about an error, try `rustc --explain E0107`.

View file

@ -7,7 +7,7 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:23:40 --> $DIR/issue-71381.rs:22:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`

View file

@ -7,29 +7,13 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:23:40 --> $DIR/issue-71381.rs:22:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error: using function pointers as const generic parameters is forbidden error: aborting due to 2 previous errors
--> $DIR/issue-71381.rs:14:61
|
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&self) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: the only supported types are integers, `bool` and `char`
error: using function pointers as const generic parameters is forbidden
--> $DIR/issue-71381.rs:23:19
|
LL | const FN: unsafe extern "C" fn(Args),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: the only supported types are integers, `bool` and `char`
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0770`. For more information about this error, try `rustc --explain E0770`.

View file

@ -12,8 +12,7 @@ unsafe extern "C" fn pass(args: PassArg) {
impl Test { impl Test {
pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&self) { pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&self) {
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden //~^ ERROR: the type of const parameters must not depend on other generic parameters
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
self.0 = Self::trampiline::<Args, IDX, FN> as _ self.0 = Self::trampiline::<Args, IDX, FN> as _
} }
@ -21,8 +20,7 @@ impl Test {
Args: Sized, Args: Sized,
const IDX: usize, const IDX: usize,
const FN: unsafe extern "C" fn(Args), const FN: unsafe extern "C" fn(Args),
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden //~^ ERROR: the type of const parameters must not depend on other generic parameters
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
>( >(
args: Args, args: Args,
) { ) {

View file

@ -6,14 +6,6 @@ LL | fn func<A, const F: fn(inner: A)>(outer: A) {
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error: using function pointers as const generic parameters is forbidden error: aborting due to 1 previous error
--> $DIR/issue-71611.rs:5:21
|
LL | fn func<A, const F: fn(inner: A)>(outer: A) {
| ^^^^^^^^^^^^
|
= note: the only supported types are integers, `bool` and `char`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0770`. For more information about this error, try `rustc --explain E0770`.

View file

@ -3,8 +3,7 @@
#![cfg_attr(full, allow(incomplete_features))] #![cfg_attr(full, allow(incomplete_features))]
fn func<A, const F: fn(inner: A)>(outer: A) { fn func<A, const F: fn(inner: A)>(outer: A) {
//[min]~^ ERROR: using function pointers as const generic parameters is forbidden //~^ ERROR: the type of const parameters must not depend on other generic parameters
//~^^ ERROR: the type of const parameters must not depend on other generic parameters
F(outer); F(outer);
} }

View file

@ -9,9 +9,6 @@ impl Provider for () {
struct Holder<B> { struct Holder<B> {
inner: Box<dyn Provider<A = B>>, inner: Box<dyn Provider<A = B>>,
//~^ ERROR: missing generics for associated type //~^ ERROR: missing generics for associated type
//~| ERROR: missing generics for associated type
//~| ERROR: missing generics for associated type
//~| ERROR: the trait `Provider` cannot be made into an object
} }
fn main() { fn main() {

View file

@ -14,57 +14,6 @@ help: add missing lifetime argument
LL | inner: Box<dyn Provider<A<'a> = B>>, LL | inner: Box<dyn Provider<A<'a> = B>>,
| ++++ | ++++
error[E0107]: missing generics for associated type `Provider::A` error: aborting due to 1 previous error
--> $DIR/issue-71176.rs:10:27
|
LL | inner: Box<dyn Provider<A = B>>,
| ^ expected 1 lifetime argument
|
note: associated type defined here, with 1 lifetime parameter: `'a`
--> $DIR/issue-71176.rs:2:10
|
LL | type A<'a>;
| ^ --
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
help: add missing lifetime argument
|
LL | inner: Box<dyn Provider<A<'a> = B>>,
| ++++
error[E0107]: missing generics for associated type `Provider::A` For more information about this error, try `rustc --explain E0107`.
--> $DIR/issue-71176.rs:10:27
|
LL | inner: Box<dyn Provider<A = B>>,
| ^ expected 1 lifetime argument
|
note: associated type defined here, with 1 lifetime parameter: `'a`
--> $DIR/issue-71176.rs:2:10
|
LL | type A<'a>;
| ^ --
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
help: add missing lifetime argument
|
LL | inner: Box<dyn Provider<A<'a> = B>>,
| ++++
error[E0038]: the trait `Provider` cannot be made into an object
--> $DIR/issue-71176.rs:10:14
|
LL | inner: Box<dyn Provider<A = B>>,
| ^^^^^^^^^^^^^^^^^^^ `Provider` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/issue-71176.rs:2:10
|
LL | trait Provider {
| -------- this trait cannot be made into an object...
LL | type A<'a>;
| ^ ...because it contains the generic associated type `A`
= help: consider moving `A` to another trait
= help: only type `()` implements the trait, consider using it directly instead
error: aborting due to 4 previous errors
Some errors have detailed explanations: E0038, E0107.
For more information about an error, try `rustc --explain E0038`.

View file

@ -5,7 +5,6 @@ fn foo<T>() {
impl<T> Drop for Foo<T> { impl<T> Drop for Foo<T> {
//~^ ERROR struct takes 0 generic arguments but 1 generic argument //~^ ERROR struct takes 0 generic arguments but 1 generic argument
//~| ERROR `T` is not constrained
fn drop(&mut self) {} fn drop(&mut self) {}
} }
} }

View file

@ -22,13 +22,7 @@ note: struct defined here, with 0 generic parameters
LL | struct Foo { LL | struct Foo {
| ^^^ | ^^^
error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates error: aborting due to 2 previous errors
--> $DIR/issue-3214.rs:6:10
|
LL | impl<T> Drop for Foo<T> {
| ^ unconstrained type parameter
error: aborting due to 3 previous errors Some errors have detailed explanations: E0107, E0401.
Some errors have detailed explanations: E0107, E0207, E0401.
For more information about an error, try `rustc --explain E0107`. For more information about an error, try `rustc --explain E0107`.

View file

@ -8,8 +8,6 @@ static FOO: (dyn AsRef<OsStr>, u8) = ("hello", 42);
const BAR: (&Path, [u8], usize) = ("hello", [], 42); const BAR: (&Path, [u8], usize) = ("hello", [], 42);
//~^ ERROR cannot find type `Path` in this scope //~^ ERROR cannot find type `Path` in this scope
//~| ERROR the size for values of type `[u8]` cannot be known at compilation time
//~| ERROR mismatched types
static BAZ: ([u8], usize) = ([], 0); static BAZ: ([u8], usize) = ([], 0);
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time

View file

@ -21,25 +21,7 @@ LL + use std::path::Path;
| |
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/issue-84108.rs:9:12 --> $DIR/issue-84108.rs:12:13
|
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
| ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `[u8]`
= note: only the last element of a tuple may have a dynamically sized type
error[E0308]: mismatched types
--> $DIR/issue-84108.rs:9:45
|
LL | const BAR: (&Path, [u8], usize) = ("hello", [], 42);
| ^^ expected `[u8]`, found `[_; 0]`
|
= note: expected slice `[u8]`
found array `[_; 0]`
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
--> $DIR/issue-84108.rs:14:13
| |
LL | static BAZ: ([u8], usize) = ([], 0); LL | static BAZ: ([u8], usize) = ([], 0);
| ^^^^^^^^^^^^^ doesn't have a size known at compile-time | ^^^^^^^^^^^^^ doesn't have a size known at compile-time
@ -48,7 +30,7 @@ LL | static BAZ: ([u8], usize) = ([], 0);
= note: only the last element of a tuple may have a dynamically sized type = note: only the last element of a tuple may have a dynamically sized type
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/issue-84108.rs:14:30 --> $DIR/issue-84108.rs:12:30
| |
LL | static BAZ: ([u8], usize) = ([], 0); LL | static BAZ: ([u8], usize) = ([], 0);
| ^^ expected `[u8]`, found `[_; 0]` | ^^ expected `[u8]`, found `[_; 0]`
@ -56,7 +38,7 @@ LL | static BAZ: ([u8], usize) = ([], 0);
= note: expected slice `[u8]` = note: expected slice `[u8]`
found array `[_; 0]` found array `[_; 0]`
error: aborting due to 6 previous errors error: aborting due to 4 previous errors
Some errors have detailed explanations: E0277, E0308, E0412. Some errors have detailed explanations: E0277, E0308, E0412.
For more information about an error, try `rustc --explain E0277`. For more information about an error, try `rustc --explain E0277`.

View file

@ -5,4 +5,3 @@ struct Apple((Apple, Option(Banana ? Citron)));
//~| ERROR expected one of `)` or `,`, found `Citron` //~| ERROR expected one of `)` or `,`, found `Citron`
//~| ERROR cannot find type `Citron` in this scope [E0412] //~| ERROR cannot find type `Citron` in this scope [E0412]
//~| ERROR parenthesized type parameters may only be used with a `Fn` trait [E0214] //~| ERROR parenthesized type parameters may only be used with a `Fn` trait [E0214]
//~| ERROR recursive type `Apple` has infinite size [E0072]

View file

@ -34,18 +34,7 @@ help: use angle brackets instead
LL | struct Apple((Apple, Option<Banana ? Citron>)); LL | struct Apple((Apple, Option<Banana ? Citron>));
| ~ ~ | ~ ~
error[E0072]: recursive type `Apple` has infinite size error: aborting due to 4 previous errors
--> $DIR/issue-103748-ICE-wrong-braces.rs:3:1
|
LL | struct Apple((Apple, Option(Banana ? Citron)));
| ^^^^^^^^^^^^ ----- recursive without indirection
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
|
LL | struct Apple((Box<Apple>, Option(Banana ? Citron)));
| ++++ +
error: aborting due to 5 previous errors Some errors have detailed explanations: E0214, E0412.
For more information about an error, try `rustc --explain E0214`.
Some errors have detailed explanations: E0072, E0214, E0412.
For more information about an error, try `rustc --explain E0072`.

View file

@ -39,7 +39,6 @@ impl<T: Trait<u32, String>> Struct<T> {}
trait YetAnotherTrait {} trait YetAnotherTrait {}
impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {} impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
//~^ ERROR struct takes 1 generic argument but 2 generic arguments were supplied //~^ ERROR struct takes 1 generic argument but 2 generic arguments were supplied
//~| ERROR `U` is not constrained
fn main() { fn main() {

View file

@ -116,13 +116,7 @@ error[E0207]: the type parameter `S` is not constrained by the impl trait, self
LL | impl<T, S> Trait<T, S> for () {} LL | impl<T, S> Trait<T, S> for () {}
| ^ unconstrained type parameter | ^ unconstrained type parameter
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates error: aborting due to 9 previous errors
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:40:35
|
LL | impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
| ^ unconstrained type parameter
error: aborting due to 10 previous errors
Some errors have detailed explanations: E0107, E0207. Some errors have detailed explanations: E0107, E0207.
For more information about an error, try `rustc --explain E0107`. For more information about an error, try `rustc --explain E0107`.