Auto merge of #116804 - matthiaskrgr:rollup-m2qm8ul, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #114157 (Enable triagebot no-merges check) - #116257 (Suggest trait bounds for used associated type on type param) - #116430 (vendoring in tarball sources) - #116709 (Update minifier version to 0.2.3) - #116786 (Update my mailmap entry) - #116790 (opt-dist: disable unused features for tabled crate) - #116802 (Remove `DefiningAnchor::Bubble` from opaque wf check) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
a76ec181fb
4
.mailmap
4
.mailmap
@ -346,7 +346,9 @@ Lindsey Kuper <lindsey@composition.al> <lindsey@rockstargirl.org>
|
||||
Lindsey Kuper <lindsey@composition.al> <lkuper@mozilla.com>
|
||||
Liu Dingming <liudingming@bytedance.com>
|
||||
Loo Maclin <loo.maclin@protonmail.com>
|
||||
Loïc BRANSTETT <lolo.branstett@numericable.fr>
|
||||
Urgau <urgau@numericable.fr>
|
||||
Urgau <urgau@numericable.fr> <lolo.branstett@numericable.fr>
|
||||
Urgau <urgau@numericable.fr> <3616612+Urgau@users.noreply.github.com>
|
||||
Lucy <luxx4x@protonmail.com>
|
||||
Lukas H. <lukaramu@users.noreply.github.com>
|
||||
Lukas Lueg <lukas.lueg@gmail.com>
|
||||
|
42
Cargo.lock
42
Cargo.lock
@ -2418,9 +2418,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "minifier"
|
||||
version = "0.2.2"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8eb022374af2f446981254e6bf9efb6e2c9e1a53176d395fca02792fd4435729"
|
||||
checksum = "5394aa376422b4b2b6c02fd9cfcb657e4ec544ae98e43d7d5d785fd0d042fd6d"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
@ -2970,30 +2970,6 @@ dependencies = [
|
||||
"pad",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||
dependencies = [
|
||||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error-attr"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-hack"
|
||||
version = "0.5.20+deprecated"
|
||||
@ -5252,23 +5228,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4d38d39c754ae037a9bc3ca1580a985db7371cd14f1229172d1db9093feb6739"
|
||||
dependencies = [
|
||||
"papergrid",
|
||||
"tabled_derive",
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tabled_derive"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99f688a08b54f4f02f0a3c382aefdb7884d3d69609f785bd253dc033243e3fe4"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tar"
|
||||
version = "0.4.38"
|
||||
|
@ -1,5 +1,6 @@
|
||||
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_hir::OpaqueTyOrigin;
|
||||
use rustc_infer::infer::InferCtxt;
|
||||
@ -308,20 +309,19 @@ fn check_opaque_type_well_formed<'tcx>(
|
||||
return Ok(definition_ty);
|
||||
};
|
||||
let param_env = tcx.param_env(def_id);
|
||||
// HACK This bubble is required for this tests to pass:
|
||||
// nested-return-type2-tait2.rs
|
||||
// nested-return-type2-tait3.rs
|
||||
|
||||
let mut parent_def_id = def_id;
|
||||
while tcx.def_kind(parent_def_id) == DefKind::OpaqueTy {
|
||||
parent_def_id = tcx.local_parent(parent_def_id);
|
||||
}
|
||||
|
||||
// FIXME(-Ztrait-solver=next): We probably should use `DefiningAnchor::Error`
|
||||
// and prepopulate this `InferCtxt` with known opaque values, rather than
|
||||
// using the `Bind` anchor here. For now it's fine.
|
||||
let infcx = tcx
|
||||
.infer_ctxt()
|
||||
.with_next_trait_solver(next_trait_solver)
|
||||
.with_opaque_type_inference(if next_trait_solver {
|
||||
DefiningAnchor::Bind(def_id)
|
||||
} else {
|
||||
DefiningAnchor::Bubble
|
||||
})
|
||||
.with_opaque_type_inference(DefiningAnchor::Bind(parent_def_id))
|
||||
.build();
|
||||
let ocx = ObligationCtxt::new(&infcx);
|
||||
let identity_args = GenericArgs::identity_for_item(tcx, def_id);
|
||||
|
@ -284,6 +284,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
||||
self.one_bound_for_assoc_type(
|
||||
|| traits::supertraits(tcx, trait_ref),
|
||||
trait_ref.skip_binder().print_only_trait_name(),
|
||||
None,
|
||||
binding.item_name,
|
||||
path_span,
|
||||
match binding.kind {
|
||||
|
@ -6,10 +6,9 @@ use crate::errors::{
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability, Diagnostic, ErrorGuaranteed};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_infer::traits::FulfillmentError;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TyCtxt};
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
use rustc_span::symbol::{sym, Ident};
|
||||
@ -102,6 +101,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
&self,
|
||||
all_candidates: impl Fn() -> I,
|
||||
ty_param_name: &str,
|
||||
ty_param_def_id: Option<LocalDefId>,
|
||||
assoc_name: Ident,
|
||||
span: Span,
|
||||
) -> ErrorGuaranteed
|
||||
@ -190,13 +190,61 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
})
|
||||
.collect::<Vec<_>>()[..]
|
||||
{
|
||||
let trait_name = self.tcx().def_path_str(*best_trait);
|
||||
let an = if suggested_name != assoc_name.name { "a similarly named" } else { "an" };
|
||||
err.span_label(
|
||||
assoc_name.span,
|
||||
format!(
|
||||
"there is a similarly named associated type `{suggested_name}` in the trait `{}`",
|
||||
self.tcx().def_path_str(*best_trait)
|
||||
"there is {an} associated type `{suggested_name}` in the \
|
||||
trait `{trait_name}`",
|
||||
),
|
||||
);
|
||||
let hir = self.tcx().hir();
|
||||
if let Some(def_id) = ty_param_def_id
|
||||
&& let parent = hir.get_parent_item(hir.local_def_id_to_hir_id(def_id))
|
||||
&& let Some(generics) = hir.get_generics(parent.def_id)
|
||||
{
|
||||
if generics.bounds_for_param(def_id)
|
||||
.flat_map(|pred| pred.bounds.iter())
|
||||
.any(|b| match b {
|
||||
hir::GenericBound::Trait(t, ..) => {
|
||||
t.trait_ref.trait_def_id().as_ref() == Some(best_trait)
|
||||
}
|
||||
_ => false,
|
||||
})
|
||||
{
|
||||
// The type param already has a bound for `trait_name`, we just need to
|
||||
// change the associated type.
|
||||
err.span_suggestion_verbose(
|
||||
assoc_name.span,
|
||||
format!(
|
||||
"change the associated type name to use `{suggested_name}` from \
|
||||
`{trait_name}`",
|
||||
),
|
||||
suggested_name.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
} else if suggest_constraining_type_param(
|
||||
self.tcx(),
|
||||
generics,
|
||||
&mut err,
|
||||
&ty_param_name,
|
||||
&trait_name,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
&& suggested_name != assoc_name.name
|
||||
{
|
||||
// We suggested constraining a type parameter, but the associated type on it
|
||||
// was also not an exact match, so we also suggest changing it.
|
||||
err.span_suggestion_verbose(
|
||||
assoc_name.span,
|
||||
"and also change the associated type name",
|
||||
suggested_name.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
return err.emit();
|
||||
}
|
||||
}
|
||||
|
@ -1062,6 +1062,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
)
|
||||
},
|
||||
param_name,
|
||||
Some(ty_param_def_id),
|
||||
assoc_name,
|
||||
span,
|
||||
None,
|
||||
@ -1075,6 +1076,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
&self,
|
||||
all_candidates: impl Fn() -> I,
|
||||
ty_param_name: impl Display,
|
||||
ty_param_def_id: Option<LocalDefId>,
|
||||
assoc_name: Ident,
|
||||
span: Span,
|
||||
is_equality: Option<ty::Term<'tcx>>,
|
||||
@ -1096,6 +1098,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
let reported = self.complain_about_assoc_type_not_found(
|
||||
all_candidates,
|
||||
&ty_param_name.to_string(),
|
||||
ty_param_def_id,
|
||||
assoc_name,
|
||||
span,
|
||||
);
|
||||
@ -1143,30 +1146,26 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
err.span_label(
|
||||
bound_span,
|
||||
format!(
|
||||
"ambiguous `{}` from `{}`",
|
||||
assoc_name,
|
||||
"ambiguous `{assoc_name}` from `{}`",
|
||||
bound.print_only_trait_path(),
|
||||
),
|
||||
);
|
||||
if let Some(constraint) = &is_equality {
|
||||
where_bounds.push(format!(
|
||||
" T: {trait}::{assoc} = {constraint}",
|
||||
" T: {trait}::{assoc_name} = {constraint}",
|
||||
trait=bound.print_only_trait_path(),
|
||||
assoc=assoc_name,
|
||||
constraint=constraint,
|
||||
));
|
||||
} else {
|
||||
err.span_suggestion_verbose(
|
||||
span.with_hi(assoc_name.span.lo()),
|
||||
"use fully qualified syntax to disambiguate",
|
||||
format!("<{} as {}>::", ty_param_name, bound.print_only_trait_path()),
|
||||
format!("<{ty_param_name} as {}>::", bound.print_only_trait_path()),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
err.note(format!(
|
||||
"associated type `{}` could derive from `{}`",
|
||||
ty_param_name,
|
||||
"associated type `{ty_param_name}` could derive from `{}`",
|
||||
bound.print_only_trait_path(),
|
||||
));
|
||||
}
|
||||
@ -1174,8 +1173,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
if !where_bounds.is_empty() {
|
||||
err.help(format!(
|
||||
"consider introducing a new type parameter `T` and adding `where` constraints:\
|
||||
\n where\n T: {},\n{}",
|
||||
ty_param_name,
|
||||
\n where\n T: {ty_param_name},\n{}",
|
||||
where_bounds.join(",\n"),
|
||||
));
|
||||
}
|
||||
@ -1397,6 +1395,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
)
|
||||
},
|
||||
kw::SelfUpper,
|
||||
None,
|
||||
assoc_ident,
|
||||
span,
|
||||
None,
|
||||
|
@ -364,7 +364,7 @@ fn predicate_constraint(generics: &hir::Generics<'_>, pred: ty::Predicate<'_>) -
|
||||
/// Type parameter needs more bounds. The trivial case is `T` `where T: Bound`, but
|
||||
/// it can also be an `impl Trait` param that needs to be decomposed to a type
|
||||
/// param for cleaner code.
|
||||
fn suggest_restriction<'tcx>(
|
||||
pub fn suggest_restriction<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
item_id: LocalDefId,
|
||||
hir_generics: &hir::Generics<'tcx>,
|
||||
|
@ -22,7 +22,6 @@ fn configure_with_args(cmd: &[String], host: &[&str], target: &[&str]) -> Config
|
||||
..Config::parse(&["check".to_owned()])
|
||||
});
|
||||
submodule_build.update_submodule(Path::new("src/doc/book"));
|
||||
submodule_build.update_submodule(Path::new("src/tools/rust-analyzer"));
|
||||
config.submodules = Some(false);
|
||||
|
||||
config.ninja_in_file = false;
|
||||
|
@ -1002,11 +1002,15 @@ impl Step for PlainSourceTarball {
|
||||
channel::write_commit_info_file(&plain_dst_src, info);
|
||||
}
|
||||
|
||||
// If we're building from git sources, we need to vendor a complete distribution.
|
||||
if builder.rust_info().is_managed_git_subrepository() {
|
||||
// Ensure we have the submodules checked out.
|
||||
builder.update_submodule(Path::new("src/tools/cargo"));
|
||||
builder.update_submodule(Path::new("src/tools/rust-analyzer"));
|
||||
// If we're building from git or tarball sources, we need to vendor
|
||||
// a complete distribution.
|
||||
if builder.rust_info().is_managed_git_subrepository()
|
||||
|| builder.rust_info().is_from_tarball()
|
||||
{
|
||||
if builder.rust_info().is_managed_git_subrepository() {
|
||||
// Ensure we have the submodules checked out.
|
||||
builder.update_submodule(Path::new("src/tools/cargo"));
|
||||
}
|
||||
|
||||
// Vendor all Cargo dependencies
|
||||
let mut cmd = Command::new(&builder.initial_cargo);
|
||||
|
@ -10,7 +10,7 @@ path = "lib.rs"
|
||||
arrayvec = { version = "0.7", default-features = false }
|
||||
askama = { version = "0.12", default-features = false, features = ["config"] }
|
||||
itertools = "0.10.1"
|
||||
minifier = "0.2.2"
|
||||
minifier = "0.2.3"
|
||||
once_cell = "1.10.0"
|
||||
regex = "1"
|
||||
rustdoc-json-types = { path = "../rustdoc-json-types" }
|
||||
|
@ -23,4 +23,4 @@ glob = "0.3"
|
||||
tempfile = "3.5"
|
||||
derive_builder = "0.12"
|
||||
clap = { version = "4", features = ["derive"] }
|
||||
tabled = "0.13"
|
||||
tabled = { version = "0.13", default-features = false, features = ["std"] }
|
||||
|
@ -2,7 +2,12 @@ error[E0220]: associated type `Assoc` not found for `V`
|
||||
--> $DIR/issue-96287.rs:7:33
|
||||
|
|
||||
LL | pub type Foo<V> = impl Trait<V::Assoc>;
|
||||
| ^^^^^ there is a similarly named associated type `Assoc` in the trait `TraitWithAssoc`
|
||||
| ^^^^^ there is an associated type `Assoc` in the trait `TraitWithAssoc`
|
||||
|
|
||||
help: consider restricting type parameter `V`
|
||||
|
|
||||
LL | pub type Foo<V: TraitWithAssoc> = impl Trait<V::Assoc>;
|
||||
| ++++++++++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
// edition:2021
|
||||
//[rpit] check-pass
|
||||
// check-pass
|
||||
// revisions: tait rpit
|
||||
|
||||
struct Pending {}
|
||||
@ -23,7 +23,7 @@ impl Pending {
|
||||
|
||||
#[cfg(tait)]
|
||||
fn read_fut(&mut self) -> OpeningReadFuture<'_> {
|
||||
self.read() //[tait]~ ERROR: cannot satisfy `impl AsyncRead + 'a == PendingReader<'a>`
|
||||
self.read()
|
||||
}
|
||||
|
||||
#[cfg(rpit)]
|
||||
|
@ -1,9 +0,0 @@
|
||||
error[E0284]: type annotations needed: cannot satisfy `impl AsyncRead + 'a == PendingReader<'a>`
|
||||
--> $DIR/async_scope_creep.rs:26:9
|
||||
|
|
||||
LL | self.read()
|
||||
| ^^^^^^^^^^^ cannot satisfy `impl AsyncRead + 'a == PendingReader<'a>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0284`.
|
@ -1,3 +1,5 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
trait Duh {}
|
||||
@ -17,6 +19,7 @@ impl<R: Duh, F: FnMut() -> R> Trait for F {
|
||||
|
||||
type Sendable = impl Send;
|
||||
type Traitable = impl Trait<Assoc = Sendable>;
|
||||
//~^ WARN opaque type `Traitable` does not satisfy its associated type bounds
|
||||
|
||||
// The `impl Send` here is then later compared against the inference var
|
||||
// created, causing the inference var to be set to `impl Send` instead of
|
||||
@ -25,7 +28,6 @@ type Traitable = impl Trait<Assoc = Sendable>;
|
||||
// type does not implement `Duh`, even if its hidden type does. So we error out.
|
||||
fn foo() -> Traitable {
|
||||
|| 42
|
||||
//~^ ERROR `Sendable: Duh` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -1,18 +1,13 @@
|
||||
error[E0277]: the trait bound `Sendable: Duh` is not satisfied
|
||||
--> $DIR/nested-return-type2-tait2.rs:27:5
|
||||
warning: opaque type `Traitable` does not satisfy its associated type bounds
|
||||
--> $DIR/nested-return-type2-tait2.rs:21:29
|
||||
|
|
||||
LL | || 42
|
||||
| ^^^^^ the trait `Duh` is not implemented for `Sendable`
|
||||
LL | type Assoc: Duh;
|
||||
| --- this associated type bound is unsatisfied for `Sendable`
|
||||
...
|
||||
LL | type Traitable = impl Trait<Assoc = Sendable>;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: the trait `Duh` is implemented for `i32`
|
||||
note: required for `{closure@$DIR/nested-return-type2-tait2.rs:27:5: 27:7}` to implement `Trait`
|
||||
--> $DIR/nested-return-type2-tait2.rs:14:31
|
||||
|
|
||||
LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
|
||||
| --- ^^^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: `#[warn(opaque_hidden_inferred_bound)]` on by default
|
||||
|
||||
error: aborting due to previous error
|
||||
warning: 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
@ -1,3 +1,5 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
trait Duh {}
|
||||
@ -16,6 +18,7 @@ impl<R: Duh, F: FnMut() -> R> Trait for F {
|
||||
}
|
||||
|
||||
type Traitable = impl Trait<Assoc = impl Send>;
|
||||
//~^ WARN opaque type `Traitable` does not satisfy its associated type bounds
|
||||
|
||||
// The `impl Send` here is then later compared against the inference var
|
||||
// created, causing the inference var to be set to `impl Send` instead of
|
||||
@ -24,7 +27,6 @@ type Traitable = impl Trait<Assoc = impl Send>;
|
||||
// type does not implement `Duh`, even if its hidden type does. So we error out.
|
||||
fn foo() -> Traitable {
|
||||
|| 42
|
||||
//~^ ERROR `impl Send: Duh` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -1,18 +1,17 @@
|
||||
error[E0277]: the trait bound `impl Send: Duh` is not satisfied
|
||||
--> $DIR/nested-return-type2-tait3.rs:26:5
|
||||
warning: opaque type `Traitable` does not satisfy its associated type bounds
|
||||
--> $DIR/nested-return-type2-tait3.rs:20:29
|
||||
|
|
||||
LL | || 42
|
||||
| ^^^^^ the trait `Duh` is not implemented for `impl Send`
|
||||
LL | type Assoc: Duh;
|
||||
| --- this associated type bound is unsatisfied for `impl Send`
|
||||
...
|
||||
LL | type Traitable = impl Trait<Assoc = impl Send>;
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: the trait `Duh` is implemented for `i32`
|
||||
note: required for `{closure@$DIR/nested-return-type2-tait3.rs:26:5: 26:7}` to implement `Trait`
|
||||
--> $DIR/nested-return-type2-tait3.rs:14:31
|
||||
= note: `#[warn(opaque_hidden_inferred_bound)]` on by default
|
||||
help: add this bound
|
||||
|
|
||||
LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
|
||||
| --- ^^^^^ ^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
LL | type Traitable = impl Trait<Assoc = impl Send + Duh>;
|
||||
| +++++
|
||||
|
||||
error: aborting due to previous error
|
||||
warning: 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
21
tests/ui/resolve/issue-55673.fixed
Normal file
21
tests/ui/resolve/issue-55673.fixed
Normal file
@ -0,0 +1,21 @@
|
||||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
trait Foo {
|
||||
type Bar;
|
||||
}
|
||||
|
||||
fn foo<T: Foo>()
|
||||
where
|
||||
T::Bar: std::fmt::Debug,
|
||||
//~^ ERROR associated type `Baa` not found for `T`
|
||||
{
|
||||
}
|
||||
|
||||
fn bar<T>()
|
||||
where
|
||||
T::Bar: std::fmt::Debug, T: Foo
|
||||
//~^ ERROR associated type `Baa` not found for `T`
|
||||
{
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,3 +1,5 @@
|
||||
// run-rustfix
|
||||
#![allow(dead_code)]
|
||||
trait Foo {
|
||||
type Bar;
|
||||
}
|
||||
@ -9,4 +11,11 @@ where
|
||||
{
|
||||
}
|
||||
|
||||
fn bar<T>()
|
||||
where
|
||||
T::Baa: std::fmt::Debug,
|
||||
//~^ ERROR associated type `Baa` not found for `T`
|
||||
{
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,9 +1,29 @@
|
||||
error[E0220]: associated type `Baa` not found for `T`
|
||||
--> $DIR/issue-55673.rs:7:8
|
||||
--> $DIR/issue-55673.rs:9:8
|
||||
|
|
||||
LL | T::Baa: std::fmt::Debug,
|
||||
| ^^^ there is a similarly named associated type `Bar` in the trait `Foo`
|
||||
|
|
||||
help: change the associated type name to use `Bar` from `Foo`
|
||||
|
|
||||
LL | T::Bar: std::fmt::Debug,
|
||||
| ~~~
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0220]: associated type `Baa` not found for `T`
|
||||
--> $DIR/issue-55673.rs:16:8
|
||||
|
|
||||
LL | T::Baa: std::fmt::Debug,
|
||||
| ^^^ there is a similarly named associated type `Bar` in the trait `Foo`
|
||||
|
|
||||
help: consider further restricting type parameter `T`
|
||||
|
|
||||
LL | T::Baa: std::fmt::Debug, T: Foo
|
||||
| ~~~~~~~~
|
||||
help: and also change the associated type name
|
||||
|
|
||||
LL | T::Bar: std::fmt::Debug,
|
||||
| ~~~
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0220`.
|
||||
|
@ -2,13 +2,13 @@ error[E0220]: associated type `Res` not found for `Self`
|
||||
--> $DIR/issue-59029-1.rs:5:52
|
||||
|
|
||||
LL | trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>;
|
||||
| ^^^ there is a similarly named associated type `Res` in the trait `Svc`
|
||||
| ^^^ there is an associated type `Res` in the trait `Svc`
|
||||
|
||||
error[E0220]: associated type `Res` not found for `Self`
|
||||
--> $DIR/issue-59029-1.rs:5:52
|
||||
|
|
||||
LL | trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>;
|
||||
| ^^^ there is a similarly named associated type `Res` in the trait `Svc`
|
||||
| ^^^ there is an associated type `Res` in the trait `Svc`
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
|
19
tests/ui/type-alias-impl-trait/not_well_formed.fixed
Normal file
19
tests/ui/type-alias-impl-trait/not_well_formed.fixed
Normal file
@ -0,0 +1,19 @@
|
||||
// run-rustfix
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
trait TraitWithAssoc {
|
||||
type Assoc;
|
||||
}
|
||||
|
||||
type Foo<V: TraitWithAssoc> = impl Trait<V::Assoc>; //~ associated type `Assoc` not found for `V`
|
||||
|
||||
trait Trait<U> {}
|
||||
|
||||
impl<W> Trait<W> for () {}
|
||||
|
||||
fn foo_desugared<T: TraitWithAssoc>(_: T) -> Foo<T> {
|
||||
()
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
// run-rustfix
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
|
@ -1,8 +1,13 @@
|
||||
error[E0220]: associated type `Assoc` not found for `V`
|
||||
--> $DIR/not_well_formed.rs:9:29
|
||||
--> $DIR/not_well_formed.rs:11:29
|
||||
|
|
||||
LL | type Foo<V> = impl Trait<V::Assoc>;
|
||||
| ^^^^^ there is a similarly named associated type `Assoc` in the trait `TraitWithAssoc`
|
||||
| ^^^^^ there is an associated type `Assoc` in the trait `TraitWithAssoc`
|
||||
|
|
||||
help: consider restricting type parameter `V`
|
||||
|
|
||||
LL | type Foo<V: TraitWithAssoc> = impl Trait<V::Assoc>;
|
||||
| ++++++++++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -414,6 +414,10 @@ message_on_add = """\
|
||||
Issue #{number} "{title}" has been added.
|
||||
"""
|
||||
|
||||
[no-merges]
|
||||
exclude_titles = ["Rollup of", "subtree update"]
|
||||
labels = ["has-merge-commits", "S-waiting-on-author"]
|
||||
|
||||
[github-releases]
|
||||
format = "rustc"
|
||||
project-name = "Rust"
|
||||
|
Loading…
x
Reference in New Issue
Block a user