Auto merge of #113968 - matthiaskrgr:rollup-7vdfcba, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #112508 (Tweak spans for self arg, fix borrow suggestion for signature mismatch) - #113901 (Get rid of subst-relate incompleteness in new solver) - #113948 (Fix rustc-args passing issue in bootstrap) - #113950 (Remove Scope::Elision from bound-vars resolution.) - #113957 (Add regression test for issue #113941 - naive layout isn't refined) - #113959 (Migrate GUI colors test to original CSS color format) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
a6fbd1c58d
24 changed files with 217 additions and 110 deletions
|
@ -2353,7 +2353,12 @@ impl Param {
|
||||||
/// Builds a `Param` object from `ExplicitSelf`.
|
/// Builds a `Param` object from `ExplicitSelf`.
|
||||||
pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
|
pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
|
||||||
let span = eself.span.to(eself_ident.span);
|
let span = eself.span.to(eself_ident.span);
|
||||||
let infer_ty = P(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span, tokens: None });
|
let infer_ty = P(Ty {
|
||||||
|
id: DUMMY_NODE_ID,
|
||||||
|
kind: TyKind::ImplicitSelf,
|
||||||
|
span: eself_ident.span,
|
||||||
|
tokens: None,
|
||||||
|
});
|
||||||
let (mutbl, ty) = match eself.node {
|
let (mutbl, ty) = match eself.node {
|
||||||
SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
|
SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
|
||||||
SelfKind::Value(mutbl) => (mutbl, infer_ty),
|
SelfKind::Value(mutbl) => (mutbl, infer_ty),
|
||||||
|
|
|
@ -137,12 +137,6 @@ enum Scope<'a> {
|
||||||
s: ScopeRef<'a>,
|
s: ScopeRef<'a>,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// A scope which either determines unspecified lifetimes or errors
|
|
||||||
/// on them (e.g., due to ambiguity).
|
|
||||||
Elision {
|
|
||||||
s: ScopeRef<'a>,
|
|
||||||
},
|
|
||||||
|
|
||||||
/// Use a specific lifetime (if `Some`) or leave it unset (to be
|
/// Use a specific lifetime (if `Some`) or leave it unset (to be
|
||||||
/// inferred in a function body or potentially error outside one),
|
/// inferred in a function body or potentially error outside one),
|
||||||
/// for the default choice of lifetime in a trait object type.
|
/// for the default choice of lifetime in a trait object type.
|
||||||
|
@ -211,7 +205,6 @@ impl<'a> fmt::Debug for TruncatedScopeDebug<'a> {
|
||||||
Scope::Body { id, s: _ } => {
|
Scope::Body { id, s: _ } => {
|
||||||
f.debug_struct("Body").field("id", id).field("s", &"..").finish()
|
f.debug_struct("Body").field("id", id).field("s", &"..").finish()
|
||||||
}
|
}
|
||||||
Scope::Elision { s: _ } => f.debug_struct("Elision").field("s", &"..").finish(),
|
|
||||||
Scope::ObjectLifetimeDefault { lifetime, s: _ } => f
|
Scope::ObjectLifetimeDefault { lifetime, s: _ } => f
|
||||||
.debug_struct("ObjectLifetimeDefault")
|
.debug_struct("ObjectLifetimeDefault")
|
||||||
.field("lifetime", lifetime)
|
.field("lifetime", lifetime)
|
||||||
|
@ -325,9 +318,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
break (vec![], BinderScopeType::Normal);
|
break (vec![], BinderScopeType::Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope::Elision { s, .. }
|
Scope::ObjectLifetimeDefault { s, .. } | Scope::AnonConstBoundary { s } => {
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
|
||||||
| Scope::AnonConstBoundary { s } => {
|
|
||||||
scope = s;
|
scope = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,16 +517,12 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
||||||
| hir::ItemKind::Macro(..)
|
| hir::ItemKind::Macro(..)
|
||||||
| hir::ItemKind::Mod(..)
|
| hir::ItemKind::Mod(..)
|
||||||
| hir::ItemKind::ForeignMod { .. }
|
| hir::ItemKind::ForeignMod { .. }
|
||||||
|
| hir::ItemKind::Static(..)
|
||||||
|
| hir::ItemKind::Const(..)
|
||||||
| hir::ItemKind::GlobalAsm(..) => {
|
| hir::ItemKind::GlobalAsm(..) => {
|
||||||
// These sorts of items have no lifetime parameters at all.
|
// These sorts of items have no lifetime parameters at all.
|
||||||
intravisit::walk_item(self, item);
|
intravisit::walk_item(self, item);
|
||||||
}
|
}
|
||||||
hir::ItemKind::Static(..) | hir::ItemKind::Const(..) => {
|
|
||||||
// No lifetime parameters, but implied 'static.
|
|
||||||
self.with(Scope::Elision { s: self.scope }, |this| {
|
|
||||||
intravisit::walk_item(this, item)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
hir::ItemKind::OpaqueTy(hir::OpaqueTy {
|
hir::ItemKind::OpaqueTy(hir::OpaqueTy {
|
||||||
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
origin: hir::OpaqueTyOrigin::TyAlias { .. },
|
||||||
..
|
..
|
||||||
|
@ -727,12 +714,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
||||||
// Elided lifetimes are not allowed in non-return
|
// Elided lifetimes are not allowed in non-return
|
||||||
// position impl Trait
|
// position impl Trait
|
||||||
let scope = Scope::TraitRefBoundary { s: self.scope };
|
let scope = Scope::TraitRefBoundary { s: self.scope };
|
||||||
self.with(scope, |this| {
|
self.with(scope, |this| intravisit::walk_item(this, opaque_ty));
|
||||||
let scope = Scope::Elision { s: this.scope };
|
|
||||||
this.with(scope, |this| {
|
|
||||||
intravisit::walk_item(this, opaque_ty);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1293,8 +1275,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
scope = s;
|
scope = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope::Elision { s, .. }
|
Scope::ObjectLifetimeDefault { s, .. }
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
|
||||||
| Scope::Supertrait { s, .. }
|
| Scope::Supertrait { s, .. }
|
||||||
| Scope::TraitRefBoundary { s, .. }
|
| Scope::TraitRefBoundary { s, .. }
|
||||||
| Scope::AnonConstBoundary { s } => {
|
| Scope::AnonConstBoundary { s } => {
|
||||||
|
@ -1357,7 +1338,6 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
Scope::Root { .. } => break,
|
Scope::Root { .. } => break,
|
||||||
Scope::Binder { s, .. }
|
Scope::Binder { s, .. }
|
||||||
| Scope::Body { s, .. }
|
| Scope::Body { s, .. }
|
||||||
| Scope::Elision { s, .. }
|
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
| Scope::ObjectLifetimeDefault { s, .. }
|
||||||
| Scope::Supertrait { s, .. }
|
| Scope::Supertrait { s, .. }
|
||||||
| Scope::TraitRefBoundary { s, .. }
|
| Scope::TraitRefBoundary { s, .. }
|
||||||
|
@ -1409,8 +1389,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
scope = s;
|
scope = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope::Elision { s, .. }
|
Scope::ObjectLifetimeDefault { s, .. }
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
|
||||||
| Scope::Supertrait { s, .. }
|
| Scope::Supertrait { s, .. }
|
||||||
| Scope::TraitRefBoundary { s, .. } => {
|
| Scope::TraitRefBoundary { s, .. } => {
|
||||||
scope = s;
|
scope = s;
|
||||||
|
@ -1483,7 +1462,6 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
Scope::Root { .. } => break,
|
Scope::Root { .. } => break,
|
||||||
Scope::Binder { s, .. }
|
Scope::Binder { s, .. }
|
||||||
| Scope::Body { s, .. }
|
| Scope::Body { s, .. }
|
||||||
| Scope::Elision { s, .. }
|
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
| Scope::ObjectLifetimeDefault { s, .. }
|
||||||
| Scope::Supertrait { s, .. }
|
| Scope::Supertrait { s, .. }
|
||||||
| Scope::TraitRefBoundary { s, .. }
|
| Scope::TraitRefBoundary { s, .. }
|
||||||
|
@ -1564,7 +1542,6 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
Scope::Body { .. } => break true,
|
Scope::Body { .. } => break true,
|
||||||
|
|
||||||
Scope::Binder { s, .. }
|
Scope::Binder { s, .. }
|
||||||
| Scope::Elision { s, .. }
|
|
||||||
| Scope::ObjectLifetimeDefault { s, .. }
|
| Scope::ObjectLifetimeDefault { s, .. }
|
||||||
| Scope::Supertrait { s, .. }
|
| Scope::Supertrait { s, .. }
|
||||||
| Scope::TraitRefBoundary { s, .. }
|
| Scope::TraitRefBoundary { s, .. }
|
||||||
|
@ -1832,14 +1809,20 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
output: Option<&'tcx hir::Ty<'tcx>>,
|
output: Option<&'tcx hir::Ty<'tcx>>,
|
||||||
in_closure: bool,
|
in_closure: bool,
|
||||||
) {
|
) {
|
||||||
self.with(Scope::Elision { s: self.scope }, |this| {
|
self.with(
|
||||||
for input in inputs {
|
Scope::ObjectLifetimeDefault {
|
||||||
this.visit_ty(input);
|
lifetime: Some(ResolvedArg::StaticLifetime),
|
||||||
}
|
s: self.scope,
|
||||||
if !in_closure && let Some(output) = output {
|
},
|
||||||
this.visit_ty(output);
|
|this| {
|
||||||
}
|
for input in inputs {
|
||||||
});
|
this.visit_ty(input);
|
||||||
|
}
|
||||||
|
if !in_closure && let Some(output) = output {
|
||||||
|
this.visit_ty(output);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
if in_closure && let Some(output) = output {
|
if in_closure && let Some(output) = output {
|
||||||
self.visit_ty(output);
|
self.visit_ty(output);
|
||||||
}
|
}
|
||||||
|
@ -1859,7 +1842,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
|
||||||
scope = s;
|
scope = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope::Root { .. } | Scope::Elision { .. } => break ResolvedArg::StaticLifetime,
|
Scope::Root { .. } => break ResolvedArg::StaticLifetime,
|
||||||
|
|
||||||
Scope::Body { .. } | Scope::ObjectLifetimeDefault { lifetime: None, .. } => return,
|
Scope::Body { .. } | Scope::ObjectLifetimeDefault { lifetime: None, .. } => return,
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
trait_selection_adjust_signature_borrow = consider adjusting the signature so it borrows its {$len ->
|
||||||
|
[one] argument
|
||||||
|
*[other] arguments
|
||||||
|
}
|
||||||
|
|
||||||
|
trait_selection_adjust_signature_remove_borrow = consider adjusting the signature so it does not borrow its {$len ->
|
||||||
|
[one] argument
|
||||||
|
*[other] arguments
|
||||||
|
}
|
||||||
|
|
||||||
trait_selection_dump_vtable_entries = vtable entries for `{$trait_ref}`: {$entries}
|
trait_selection_dump_vtable_entries = vtable entries for `{$trait_ref}`: {$entries}
|
||||||
|
|
||||||
trait_selection_empty_on_clause_in_rustc_on_unimplemented = empty `on`-clause in `#[rustc_on_unimplemented]`
|
trait_selection_empty_on_clause_in_rustc_on_unimplemented = empty `on`-clause in `#[rustc_on_unimplemented]`
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
use crate::fluent_generated as fluent;
|
use crate::fluent_generated as fluent;
|
||||||
use rustc_errors::{ErrorGuaranteed, Handler, IntoDiagnostic};
|
use rustc_errors::{
|
||||||
|
AddToDiagnostic, Applicability, Diagnostic, ErrorGuaranteed, Handler, IntoDiagnostic,
|
||||||
|
SubdiagnosticMessage,
|
||||||
|
};
|
||||||
use rustc_macros::Diagnostic;
|
use rustc_macros::Diagnostic;
|
||||||
use rustc_middle::ty::{self, PolyTraitRef, Ty};
|
use rustc_middle::ty::{self, PolyTraitRef, Ty};
|
||||||
use rustc_span::{Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
|
@ -97,3 +100,34 @@ pub struct InherentProjectionNormalizationOverflow {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
pub ty: String,
|
pub ty: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum AdjustSignatureBorrow {
|
||||||
|
Borrow { to_borrow: Vec<(Span, String)> },
|
||||||
|
RemoveBorrow { remove_borrow: Vec<(Span, String)> },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddToDiagnostic for AdjustSignatureBorrow {
|
||||||
|
fn add_to_diagnostic_with<F>(self, diag: &mut Diagnostic, _: F)
|
||||||
|
where
|
||||||
|
F: Fn(&mut Diagnostic, SubdiagnosticMessage) -> SubdiagnosticMessage,
|
||||||
|
{
|
||||||
|
match self {
|
||||||
|
AdjustSignatureBorrow::Borrow { to_borrow } => {
|
||||||
|
diag.set_arg("len", to_borrow.len());
|
||||||
|
diag.multipart_suggestion_verbose(
|
||||||
|
fluent::trait_selection_adjust_signature_borrow,
|
||||||
|
to_borrow,
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
AdjustSignatureBorrow::RemoveBorrow { remove_borrow } => {
|
||||||
|
diag.set_arg("len", remove_borrow.len());
|
||||||
|
diag.multipart_suggestion_verbose(
|
||||||
|
fluent::trait_selection_adjust_signature_remove_borrow,
|
||||||
|
remove_borrow,
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -66,24 +66,27 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||||
Invert::Yes,
|
Invert::Yes,
|
||||||
));
|
));
|
||||||
// Relate via args
|
// Relate via args
|
||||||
let subst_relate_response = self
|
candidates.extend(
|
||||||
.assemble_subst_relate_candidate(param_env, alias_lhs, alias_rhs, direction);
|
self.assemble_subst_relate_candidate(
|
||||||
candidates.extend(subst_relate_response);
|
param_env, alias_lhs, alias_rhs, direction,
|
||||||
|
),
|
||||||
|
);
|
||||||
debug!(?candidates);
|
debug!(?candidates);
|
||||||
|
|
||||||
if let Some(merged) = self.try_merge_responses(&candidates) {
|
if let Some(merged) = self.try_merge_responses(&candidates) {
|
||||||
Ok(merged)
|
Ok(merged)
|
||||||
} else {
|
} else {
|
||||||
// When relating two aliases and we have ambiguity, we prefer
|
// When relating two aliases and we have ambiguity, if both
|
||||||
// relating the generic arguments of the aliases over normalizing
|
// aliases can be normalized to something, we prefer
|
||||||
// them. This is necessary for inference during typeck.
|
// "bidirectionally normalizing" both of them within the same
|
||||||
|
// candidate.
|
||||||
|
//
|
||||||
|
// See <https://github.com/rust-lang/trait-system-refactor-initiative/issues/25>.
|
||||||
//
|
//
|
||||||
// As this is incomplete, we must not do so during coherence.
|
// As this is incomplete, we must not do so during coherence.
|
||||||
match self.solver_mode() {
|
match self.solver_mode() {
|
||||||
SolverMode::Normal => {
|
SolverMode::Normal => {
|
||||||
if let Ok(subst_relate_response) = subst_relate_response {
|
if let Ok(bidirectional_normalizes_to_response) = self
|
||||||
Ok(subst_relate_response)
|
|
||||||
} else if let Ok(bidirectional_normalizes_to_response) = self
|
|
||||||
.assemble_bidirectional_normalizes_to_candidate(
|
.assemble_bidirectional_normalizes_to_candidate(
|
||||||
param_env, lhs, rhs, direction,
|
param_env, lhs, rhs, direction,
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,6 +5,7 @@ use super::{
|
||||||
PredicateObligation,
|
PredicateObligation,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::errors;
|
||||||
use crate::infer::InferCtxt;
|
use crate::infer::InferCtxt;
|
||||||
use crate::traits::{NormalizeExt, ObligationCtxt};
|
use crate::traits::{NormalizeExt, ObligationCtxt};
|
||||||
|
|
||||||
|
@ -4031,6 +4032,10 @@ fn hint_missing_borrow<'tcx>(
|
||||||
found_node: Node<'_>,
|
found_node: Node<'_>,
|
||||||
err: &mut Diagnostic,
|
err: &mut Diagnostic,
|
||||||
) {
|
) {
|
||||||
|
if matches!(found_node, Node::TraitItem(..)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let found_args = match found.kind() {
|
let found_args = match found.kind() {
|
||||||
ty::FnPtr(f) => infcx.instantiate_binder_with_placeholders(*f).inputs().iter(),
|
ty::FnPtr(f) => infcx.instantiate_binder_with_placeholders(*f).inputs().iter(),
|
||||||
kind => {
|
kind => {
|
||||||
|
@ -4102,19 +4107,11 @@ fn hint_missing_borrow<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
if !to_borrow.is_empty() {
|
if !to_borrow.is_empty() {
|
||||||
err.multipart_suggestion_verbose(
|
err.subdiagnostic(errors::AdjustSignatureBorrow::Borrow { to_borrow });
|
||||||
"consider borrowing the argument",
|
|
||||||
to_borrow,
|
|
||||||
Applicability::MaybeIncorrect,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !remove_borrow.is_empty() {
|
if !remove_borrow.is_empty() {
|
||||||
err.multipart_suggestion_verbose(
|
err.subdiagnostic(errors::AdjustSignatureBorrow::RemoveBorrow { remove_borrow });
|
||||||
"do not borrow the argument",
|
|
||||||
remove_borrow,
|
|
||||||
Applicability::MaybeIncorrect,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2043,6 +2043,13 @@ impl<'a> Builder<'a> {
|
||||||
rustflags.arg("-Zinline-mir");
|
rustflags.arg("-Zinline-mir");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set rustc args passed from command line
|
||||||
|
let rustc_args =
|
||||||
|
self.config.cmd.rustc_args().iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
||||||
|
if !rustc_args.is_empty() {
|
||||||
|
cargo.env("RUSTFLAGS", &rustc_args.join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
Cargo { command: cargo, rustflags, rustdocflags, allow_features }
|
Cargo { command: cargo, rustflags, rustdocflags, allow_features }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ define-function: (
|
||||||
block {
|
block {
|
||||||
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.WithGenerics.html"
|
go-to: "file://" + |DOC_PATH| + "/test_docs/struct.WithGenerics.html"
|
||||||
show-text: true
|
show-text: true
|
||||||
|
|
||||||
set-local-storage: {"rustdoc-theme": |theme|, "rustdoc-use-system-theme": "false"}
|
set-local-storage: {"rustdoc-theme": |theme|, "rustdoc-use-system-theme": "false"}
|
||||||
reload:
|
reload:
|
||||||
assert-css: (".item-decl .code-attribute", {"color": |attr_color|}, ALL)
|
assert-css: (".item-decl .code-attribute", {"color": |attr_color|}, ALL)
|
||||||
|
@ -40,41 +41,41 @@ call-function: (
|
||||||
"check-colors",
|
"check-colors",
|
||||||
{
|
{
|
||||||
"theme": "ayu",
|
"theme": "ayu",
|
||||||
"attr_color": "rgb(153, 153, 153)",
|
"attr_color": "#999",
|
||||||
"trait_color": "rgb(57, 175, 215)",
|
"trait_color": "#39afd7",
|
||||||
"struct_color": "rgb(255, 160, 165)",
|
"struct_color": "#ffa0a5",
|
||||||
"enum_color": "rgb(255, 160, 165)",
|
"enum_color": "#ffa0a5",
|
||||||
"primitive_color": "rgb(255, 160, 165)",
|
"primitive_color": "#ffa0a5",
|
||||||
"constant_color": "rgb(57, 175, 215)",
|
"constant_color": "#39afd7",
|
||||||
"fn_color": "rgb(253, 214, 135)",
|
"fn_color": "#fdd687",
|
||||||
"assoc_type_color": "rgb(57, 175, 215)",
|
"assoc_type_color": "#39afd7",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
call-function: (
|
call-function: (
|
||||||
"check-colors",
|
"check-colors",
|
||||||
{
|
{
|
||||||
"theme": "dark",
|
"theme": "dark",
|
||||||
"attr_color": "rgb(153, 153, 153)",
|
"attr_color": "#999",
|
||||||
"trait_color": "rgb(183, 140, 242)",
|
"trait_color": "#b78cf2",
|
||||||
"struct_color": "rgb(45, 191, 184)",
|
"struct_color": "#2dbfb8",
|
||||||
"enum_color": "rgb(45, 191, 184)",
|
"enum_color": "#2dbfb8",
|
||||||
"primitive_color": "rgb(45, 191, 184)",
|
"primitive_color": "#2dbfb8",
|
||||||
"constant_color": "rgb(210, 153, 29)",
|
"constant_color": "#d2991d",
|
||||||
"fn_color": "rgb(43, 171, 99)",
|
"fn_color": "#2bab63",
|
||||||
"assoc_type_color": "rgb(210, 153, 29)",
|
"assoc_type_color": "#d2991d",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
call-function: (
|
call-function: (
|
||||||
"check-colors",
|
"check-colors",
|
||||||
{
|
{
|
||||||
"theme": "light",
|
"theme": "light",
|
||||||
"attr_color": "rgb(153, 153, 153)",
|
"attr_color": "#999",
|
||||||
"trait_color": "rgb(110, 79, 201)",
|
"trait_color": "#6e4fc9",
|
||||||
"struct_color": "rgb(173, 55, 138)",
|
"struct_color": "#ad378a",
|
||||||
"enum_color": "rgb(173, 55, 138)",
|
"enum_color": "#ad378a",
|
||||||
"primitive_color": "rgb(173, 55, 138)",
|
"primitive_color": "#ad378a",
|
||||||
"constant_color": "rgb(56, 115, 173)",
|
"constant_color": "#3873ad",
|
||||||
"fn_color": "rgb(173, 124, 55)",
|
"fn_color": "#ad7c37",
|
||||||
"assoc_type_color": "rgb(56, 115, 173)",
|
"assoc_type_color": "#3873ad",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -13,7 +13,7 @@ note: required by a bound in `f1`
|
||||||
|
|
|
|
||||||
LL | fn f1<F>(_: F) where F: Fn(&(), &()) {}
|
LL | fn f1<F>(_: F) where F: Fn(&(), &()) {}
|
||||||
| ^^^^^^^^^^^^ required by this bound in `f1`
|
| ^^^^^^^^^^^^ required by this bound in `f1`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | f1(|_: &(), _: &()| {});
|
LL | f1(|_: &(), _: &()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -33,7 +33,7 @@ note: required by a bound in `f2`
|
||||||
|
|
|
|
||||||
LL | fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
|
LL | fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f2`
|
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f2`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | f2(|_: &(), _: &()| {});
|
LL | f2(|_: &(), _: &()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -53,7 +53,7 @@ note: required by a bound in `f3`
|
||||||
|
|
|
|
||||||
LL | fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
|
LL | fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
|
||||||
| ^^^^^^^^^^^^^^^ required by this bound in `f3`
|
| ^^^^^^^^^^^^^^^ required by this bound in `f3`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | f3(|_: &(), _: &()| {});
|
LL | f3(|_: &(), _: &()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -73,7 +73,7 @@ note: required by a bound in `f4`
|
||||||
|
|
|
|
||||||
LL | fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
|
LL | fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f4`
|
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f4`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | f4(|_: &(), _: &()| {});
|
LL | f4(|_: &(), _: &()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -93,7 +93,7 @@ note: required by a bound in `f5`
|
||||||
|
|
|
|
||||||
LL | fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
|
LL | fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f5`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f5`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | f5(|_: &(), _: &()| {});
|
LL | f5(|_: &(), _: &()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -113,7 +113,7 @@ note: required by a bound in `g1`
|
||||||
|
|
|
|
||||||
LL | fn g1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>) {}
|
LL | fn g1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g1`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g1`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | g1(|_: &(), _: ()| {});
|
LL | g1(|_: &(), _: ()| {});
|
||||||
| +
|
| +
|
||||||
|
@ -133,7 +133,7 @@ note: required by a bound in `g2`
|
||||||
|
|
|
|
||||||
LL | fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
|
LL | fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
|
||||||
| ^^^^^^^^^^^^^^^^ required by this bound in `g2`
|
| ^^^^^^^^^^^^^^^^ required by this bound in `g2`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | g2(|_: &(), _: ()| {});
|
LL | g2(|_: &(), _: ()| {});
|
||||||
| +
|
| +
|
||||||
|
@ -153,7 +153,7 @@ note: required by a bound in `g3`
|
||||||
|
|
|
|
||||||
LL | fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<dyn Fn(&())>) {}
|
LL | fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<dyn Fn(&())>) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g3`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g3`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | g3(|_: &(), _: ()| {});
|
LL | g3(|_: &(), _: ()| {});
|
||||||
| +
|
| +
|
||||||
|
@ -173,7 +173,7 @@ note: required by a bound in `g4`
|
||||||
|
|
|
|
||||||
LL | fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
|
LL | fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g4`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g4`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | g4(|_: &(), _: ()| {});
|
LL | g4(|_: &(), _: ()| {});
|
||||||
| +
|
| +
|
||||||
|
@ -193,7 +193,7 @@ note: required by a bound in `h1`
|
||||||
|
|
|
|
||||||
LL | fn h1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>, &(), fn(&(), &())) {}
|
LL | fn h1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>, &(), fn(&(), &())) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h1`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h1`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | h1(|_: &(), _: (), _: &(), _: ()| {});
|
LL | h1(|_: &(), _: (), _: &(), _: ()| {});
|
||||||
| + +
|
| + +
|
||||||
|
@ -213,7 +213,7 @@ note: required by a bound in `h2`
|
||||||
|
|
|
|
||||||
LL | fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<dyn Fn(&())>, &'t0 (), fn(&(), &())) {}
|
LL | fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<dyn Fn(&())>, &'t0 (), fn(&(), &())) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h2`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h2`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its arguments
|
||||||
|
|
|
|
||||||
LL | h2(|_: &(), _: (), _: &(), _: ()| {});
|
LL | h2(|_: &(), _: (), _: &(), _: ()| {});
|
||||||
| + +
|
| + +
|
||||||
|
|
|
@ -18,7 +18,7 @@ note: required by a bound in `foo`
|
||||||
|
|
|
|
||||||
LL | fn foo<F: Fn(&char) -> bool + Fn(char) -> bool>(f: F) {
|
LL | fn foo<F: Fn(&char) -> bool + Fn(char) -> bool>(f: F) {
|
||||||
| ^^^^^^^^^^^^^^^^ required by this bound in `foo`
|
| ^^^^^^^^^^^^^^^^ required by this bound in `foo`
|
||||||
help: do not borrow the argument
|
help: consider adjusting the signature so it does not borrow its argument
|
||||||
|
|
|
|
||||||
LL | foo(move |char| v);
|
LL | foo(move |char| v);
|
||||||
| ~~~~
|
| ~~~~
|
||||||
|
|
|
@ -15,10 +15,10 @@ LL | [T; 1]: Copy, T: std::marker::Copy // But `[T; 1]: Copy` does not imply
|
||||||
| ~~~~~~~~~~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/explicit-drop-bounds.rs:32:13
|
--> $DIR/explicit-drop-bounds.rs:32:18
|
||||||
|
|
|
|
||||||
LL | fn drop(&mut self) {}
|
LL | fn drop(&mut self) {}
|
||||||
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
|
|
|
||||||
note: required by a bound in `DropMe`
|
note: required by a bound in `DropMe`
|
||||||
--> $DIR/explicit-drop-bounds.rs:7:18
|
--> $DIR/explicit-drop-bounds.rs:7:18
|
||||||
|
|
|
@ -15,10 +15,10 @@ LL | impl<T: std::marker::Copy> Drop for DropMe<T>
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
|
|
||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/explicit-drop-bounds.rs:40:13
|
--> $DIR/explicit-drop-bounds.rs:40:18
|
||||||
|
|
|
|
||||||
LL | fn drop(&mut self) {}
|
LL | fn drop(&mut self) {}
|
||||||
| ^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
|
|
|
||||||
note: required by a bound in `DropMe`
|
note: required by a bound in `DropMe`
|
||||||
--> $DIR/explicit-drop-bounds.rs:7:18
|
--> $DIR/explicit-drop-bounds.rs:7:18
|
||||||
|
|
13
tests/ui/layout/issue-113941.rs
Normal file
13
tests/ui/layout/issue-113941.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// build-pass
|
||||||
|
// revisions: normal randomize-layout
|
||||||
|
// [randomize-layout]compile-flags: -Zrandomize-layout
|
||||||
|
|
||||||
|
enum Void {}
|
||||||
|
|
||||||
|
pub struct Struct([*const (); 0], Void);
|
||||||
|
|
||||||
|
pub enum Enum {
|
||||||
|
Variant(Struct),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -10,7 +10,7 @@ LL | let _ = (-10..=10).find(|x: i32| x.signum() == 0);
|
||||||
found closure signature `fn(i32) -> _`
|
found closure signature `fn(i32) -> _`
|
||||||
note: required by a bound in `find`
|
note: required by a bound in `find`
|
||||||
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | let _ = (-10..=10).find(|x: &i32| x.signum() == 0);
|
LL | let _ = (-10..=10).find(|x: &i32| x.signum() == 0);
|
||||||
| +
|
| +
|
||||||
|
@ -27,7 +27,7 @@ LL | let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0);
|
||||||
found closure signature `for<'a, 'b, 'c> fn(&'a &'b &'c i32) -> _`
|
found closure signature `for<'a, 'b, 'c> fn(&'a &'b &'c i32) -> _`
|
||||||
note: required by a bound in `find`
|
note: required by a bound in `find`
|
||||||
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
||||||
help: do not borrow the argument
|
help: consider adjusting the signature so it does not borrow its argument
|
||||||
|
|
|
|
||||||
LL - let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0);
|
LL - let _ = (-10..=10).find(|x: &&&i32| x.signum() == 0);
|
||||||
LL + let _ = (-10..=10).find(|x: &i32| x.signum() == 0);
|
LL + let _ = (-10..=10).find(|x: &i32| x.signum() == 0);
|
||||||
|
|
|
@ -10,7 +10,7 @@ LL | a.iter().map(|_: (u32, u32)| 45);
|
||||||
found closure signature `fn((u32, u32)) -> _`
|
found closure signature `fn((u32, u32)) -> _`
|
||||||
note: required by a bound in `map`
|
note: required by a bound in `map`
|
||||||
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | a.iter().map(|_: &(u32, u32)| 45);
|
LL | a.iter().map(|_: &(u32, u32)| 45);
|
||||||
| +
|
| +
|
||||||
|
|
|
@ -10,7 +10,7 @@ LL | once::<&str>("str").fuse().filter(|a: &str| true).count();
|
||||||
found closure signature `for<'a> fn(&'a str) -> _`
|
found closure signature `for<'a> fn(&'a str) -> _`
|
||||||
note: required by a bound in `filter`
|
note: required by a bound in `filter`
|
||||||
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | once::<&str>("str").fuse().filter(|a: &&str| true).count();
|
LL | once::<&str>("str").fuse().filter(|a: &&str| true).count();
|
||||||
| +
|
| +
|
||||||
|
|
|
@ -13,7 +13,7 @@ LL | let _has_inference_vars: Option<i32> = Some(0).map(deref_int);
|
||||||
found function signature `for<'a> fn(&'a i32) -> _`
|
found function signature `for<'a> fn(&'a i32) -> _`
|
||||||
note: required by a bound in `Option::<T>::map`
|
note: required by a bound in `Option::<T>::map`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
help: do not borrow the argument
|
help: consider adjusting the signature so it does not borrow its argument
|
||||||
|
|
|
|
||||||
LL - fn deref_int(a: &i32) -> i32 {
|
LL - fn deref_int(a: &i32) -> i32 {
|
||||||
LL + fn deref_int(a: i32) -> i32 {
|
LL + fn deref_int(a: i32) -> i32 {
|
||||||
|
|
|
@ -17,7 +17,7 @@ fn generic<T>(_: T) -> Option<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_ref<T>(_: T) -> Option<()> {
|
fn generic_ref<T>(_: T) -> Option<()> {
|
||||||
//~^ HELP do not borrow the argument
|
//~^ HELP consider adjusting the signature so it does not borrow its argument
|
||||||
Some(())
|
Some(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ fn generic<T>(_: T) -> Option<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generic_ref<T>(_: &T) -> Option<()> {
|
fn generic_ref<T>(_: &T) -> Option<()> {
|
||||||
//~^ HELP do not borrow the argument
|
//~^ HELP consider adjusting the signature so it does not borrow its argument
|
||||||
Some(())
|
Some(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ LL | let _ = produces_string().and_then(generic_ref);
|
||||||
found function signature `for<'a> fn(&'a _) -> _`
|
found function signature `for<'a> fn(&'a _) -> _`
|
||||||
note: required by a bound in `Option::<T>::and_then`
|
note: required by a bound in `Option::<T>::and_then`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
help: do not borrow the argument
|
help: consider adjusting the signature so it does not borrow its argument
|
||||||
|
|
|
|
||||||
LL - fn generic_ref<T>(_: &T) -> Option<()> {
|
LL - fn generic_ref<T>(_: &T) -> Option<()> {
|
||||||
LL + fn generic_ref<T>(_: T) -> Option<()> {
|
LL + fn generic_ref<T>(_: T) -> Option<()> {
|
||||||
|
|
|
@ -11,10 +11,10 @@ LL | impl<B: ?Sized + std::clone::Clone> Display for Cow<'_, B> {
|
||||||
| +++++++++++++++++++
|
| +++++++++++++++++++
|
||||||
|
|
||||||
error[E0277]: the trait bound `B: Clone` is not satisfied
|
error[E0277]: the trait bound `B: Clone` is not satisfied
|
||||||
--> $DIR/issue-79224.rs:20:12
|
--> $DIR/issue-79224.rs:20:13
|
||||||
|
|
|
|
||||||
LL | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
LL | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
| ^^^^^ the trait `Clone` is not implemented for `B`
|
| ^^^^ the trait `Clone` is not implemented for `B`
|
||||||
|
|
|
|
||||||
= note: required for `B` to implement `ToOwned`
|
= note: required for `B` to implement `ToOwned`
|
||||||
help: consider further restricting this bound
|
help: consider further restricting this bound
|
||||||
|
|
|
@ -16,7 +16,7 @@ note: required by a bound in `Trader::<'a>::set_closure`
|
||||||
|
|
|
|
||||||
LL | pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) {
|
LL | pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) {
|
||||||
| ^^^^^^^^^^^^^^^ required by this bound in `Trader::<'a>::set_closure`
|
| ^^^^^^^^^^^^^^^ required by this bound in `Trader::<'a>::set_closure`
|
||||||
help: consider borrowing the argument
|
help: consider adjusting the signature so it borrows its argument
|
||||||
|
|
|
|
||||||
LL | let closure = |trader : &mut Trader| {
|
LL | let closure = |trader : &mut Trader| {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
17
tests/ui/typeck/mismatched-map-under-self.rs
Normal file
17
tests/ui/typeck/mismatched-map-under-self.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
pub trait Insertable {
|
||||||
|
type Values;
|
||||||
|
|
||||||
|
fn values(&self) -> Self::Values;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Insertable for Option<T> {
|
||||||
|
type Values = ();
|
||||||
|
|
||||||
|
fn values(self) -> Self::Values {
|
||||||
|
//~^ ERROR method `values` has an incompatible type for trait
|
||||||
|
self.map(Insertable::values).unwrap_or_default()
|
||||||
|
//~^ ERROR type mismatch in function arguments
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
37
tests/ui/typeck/mismatched-map-under-self.stderr
Normal file
37
tests/ui/typeck/mismatched-map-under-self.stderr
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
error[E0053]: method `values` has an incompatible type for trait
|
||||||
|
--> $DIR/mismatched-map-under-self.rs:10:15
|
||||||
|
|
|
||||||
|
LL | fn values(self) -> Self::Values {
|
||||||
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| expected `&Option<T>`, found `Option<T>`
|
||||||
|
| help: change the self-receiver type to match the trait: `&self`
|
||||||
|
|
|
||||||
|
note: type in trait
|
||||||
|
--> $DIR/mismatched-map-under-self.rs:4:15
|
||||||
|
|
|
||||||
|
LL | fn values(&self) -> Self::Values;
|
||||||
|
| ^^^^^
|
||||||
|
= note: expected signature `fn(&Option<T>)`
|
||||||
|
found signature `fn(Option<T>)`
|
||||||
|
|
||||||
|
error[E0631]: type mismatch in function arguments
|
||||||
|
--> $DIR/mismatched-map-under-self.rs:12:18
|
||||||
|
|
|
||||||
|
LL | fn values(&self) -> Self::Values;
|
||||||
|
| --------------------------------- found signature defined here
|
||||||
|
...
|
||||||
|
LL | self.map(Insertable::values).unwrap_or_default()
|
||||||
|
| --- ^^^^^^^^^^^^^^^^^^ expected due to this
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= note: expected function signature `fn(T) -> _`
|
||||||
|
found function signature `for<'a> fn(&'a _) -> _`
|
||||||
|
note: required by a bound in `Option::<T>::map`
|
||||||
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0053, E0631.
|
||||||
|
For more information about an error, try `rustc --explain E0053`.
|
Loading…
Add table
Add a link
Reference in a new issue