Rollup merge of #125906 - compiler-errors:simplify-method-error-args, r=fmease
Remove a bunch of redundant args from `report_method_error` Rebased on top of #125397 because I had originally asked there (https://github.com/rust-lang/rust/pull/125397#discussion_r1610124799) for this change to be made, but I just chose to do it myself. r? fmease
This commit is contained in:
commit
78d9a7e107
8 changed files with 68 additions and 66 deletions
|
@ -13,7 +13,6 @@ use crate::errors::{
|
||||||
YieldExprOutsideOfCoroutine,
|
YieldExprOutsideOfCoroutine,
|
||||||
};
|
};
|
||||||
use crate::fatally_break_rust;
|
use crate::fatally_break_rust;
|
||||||
use crate::method::SelfSource;
|
|
||||||
use crate::type_error_struct;
|
use crate::type_error_struct;
|
||||||
use crate::CoroutineTypes;
|
use crate::CoroutineTypes;
|
||||||
use crate::Expectation::{self, ExpectCastableToType, ExpectHasType, NoExpectation};
|
use crate::Expectation::{self, ExpectCastableToType, ExpectHasType, NoExpectation};
|
||||||
|
@ -223,7 +222,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let ty = ensure_sufficient_stack(|| match &expr.kind {
|
let ty = ensure_sufficient_stack(|| match &expr.kind {
|
||||||
hir::ExprKind::Path(
|
hir::ExprKind::Path(
|
||||||
qpath @ (hir::QPath::Resolved(..) | hir::QPath::TypeRelative(..)),
|
qpath @ (hir::QPath::Resolved(..) | hir::QPath::TypeRelative(..)),
|
||||||
) => self.check_expr_path(qpath, expr, args, call),
|
) => self.check_expr_path(qpath, expr, Some(args), call),
|
||||||
_ => self.check_expr_kind(expr, expected),
|
_ => self.check_expr_kind(expr, expected),
|
||||||
});
|
});
|
||||||
let ty = self.resolve_vars_if_possible(ty);
|
let ty = self.resolve_vars_if_possible(ty);
|
||||||
|
@ -290,7 +289,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
ExprKind::Path(QPath::LangItem(lang_item, _)) => {
|
ExprKind::Path(QPath::LangItem(lang_item, _)) => {
|
||||||
self.check_lang_item_path(lang_item, expr)
|
self.check_lang_item_path(lang_item, expr)
|
||||||
}
|
}
|
||||||
ExprKind::Path(ref qpath) => self.check_expr_path(qpath, expr, &[], None),
|
ExprKind::Path(ref qpath) => self.check_expr_path(qpath, expr, None, None),
|
||||||
ExprKind::InlineAsm(asm) => {
|
ExprKind::InlineAsm(asm) => {
|
||||||
// We defer some asm checks as we may not have resolved the input and output types yet (they may still be infer vars).
|
// We defer some asm checks as we may not have resolved the input and output types yet (they may still be infer vars).
|
||||||
self.deferred_asm_checks.borrow_mut().push((asm, expr.hir_id));
|
self.deferred_asm_checks.borrow_mut().push((asm, expr.hir_id));
|
||||||
|
@ -502,12 +501,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
qpath: &'tcx hir::QPath<'tcx>,
|
qpath: &'tcx hir::QPath<'tcx>,
|
||||||
expr: &'tcx hir::Expr<'tcx>,
|
expr: &'tcx hir::Expr<'tcx>,
|
||||||
args: &'tcx [hir::Expr<'tcx>],
|
args: Option<&'tcx [hir::Expr<'tcx>]>,
|
||||||
call: Option<&'tcx hir::Expr<'tcx>>,
|
call: Option<&'tcx hir::Expr<'tcx>>,
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
let (res, opt_ty, segs) =
|
let (res, opt_ty, segs) =
|
||||||
self.resolve_ty_and_res_fully_qualified_call(qpath, expr.hir_id, expr.span, Some(args));
|
self.resolve_ty_and_res_fully_qualified_call(qpath, expr.hir_id, expr.span);
|
||||||
let ty = match res {
|
let ty = match res {
|
||||||
Res::Err => {
|
Res::Err => {
|
||||||
self.suggest_assoc_method_call(segs);
|
self.suggest_assoc_method_call(segs);
|
||||||
|
@ -564,7 +563,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
// We just want to check sizedness, so instead of introducing
|
// We just want to check sizedness, so instead of introducing
|
||||||
// placeholder lifetimes with probing, we just replace higher lifetimes
|
// placeholder lifetimes with probing, we just replace higher lifetimes
|
||||||
// with fresh vars.
|
// with fresh vars.
|
||||||
let span = args.get(i).map(|a| a.span).unwrap_or(expr.span);
|
let span = args.and_then(|args| args.get(i)).map_or(expr.span, |arg| arg.span);
|
||||||
let input = self.instantiate_binder_with_fresh_vars(
|
let input = self.instantiate_binder_with_fresh_vars(
|
||||||
span,
|
span,
|
||||||
infer::BoundRegionConversionTime::FnCall,
|
infer::BoundRegionConversionTime::FnCall,
|
||||||
|
@ -1331,9 +1330,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let rcvr_t = self.check_expr(rcvr);
|
let rcvr_t = self.check_expr(rcvr);
|
||||||
// no need to check for bot/err -- callee does that
|
// no need to check for bot/err -- callee does that
|
||||||
let rcvr_t = self.structurally_resolve_type(rcvr.span, rcvr_t);
|
let rcvr_t = self.structurally_resolve_type(rcvr.span, rcvr_t);
|
||||||
let span = segment.ident.span;
|
|
||||||
|
|
||||||
let method = match self.lookup_method(rcvr_t, segment, span, expr, rcvr, args) {
|
let method = match self.lookup_method(rcvr_t, segment, segment.ident.span, expr, rcvr, args)
|
||||||
|
{
|
||||||
Ok(method) => {
|
Ok(method) => {
|
||||||
// We could add a "consider `foo::<params>`" suggestion here, but I wasn't able to
|
// We could add a "consider `foo::<params>`" suggestion here, but I wasn't able to
|
||||||
// trigger this codepath causing `structurally_resolve_type` to emit an error.
|
// trigger this codepath causing `structurally_resolve_type` to emit an error.
|
||||||
|
@ -1342,18 +1341,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
if segment.ident.name != kw::Empty {
|
if segment.ident.name != kw::Empty {
|
||||||
if let Some(err) = self.report_method_error(
|
if let Some(err) =
|
||||||
span,
|
self.report_method_error(expr.hir_id, rcvr_t, error, expected, false)
|
||||||
Some(rcvr),
|
{
|
||||||
rcvr_t,
|
|
||||||
segment.ident,
|
|
||||||
expr.hir_id,
|
|
||||||
SelfSource::MethodCall(rcvr),
|
|
||||||
error,
|
|
||||||
Some(args),
|
|
||||||
expected,
|
|
||||||
false,
|
|
||||||
) {
|
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1362,7 +1352,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Call the generic checker.
|
// Call the generic checker.
|
||||||
self.check_method_argument_types(span, expr, method, args, DontTupleArguments, expected)
|
self.check_method_argument_types(
|
||||||
|
segment.ident.span,
|
||||||
|
expr,
|
||||||
|
method,
|
||||||
|
args,
|
||||||
|
DontTupleArguments,
|
||||||
|
expected,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_expr_cast(
|
fn check_expr_cast(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::callee::{self, DeferredCallResolution};
|
use crate::callee::{self, DeferredCallResolution};
|
||||||
use crate::errors::{self, CtorIsPrivate};
|
use crate::errors::{self, CtorIsPrivate};
|
||||||
use crate::method::{self, MethodCallee, SelfSource};
|
use crate::method::{self, MethodCallee};
|
||||||
use crate::rvalue_scopes;
|
use crate::rvalue_scopes;
|
||||||
use crate::{BreakableCtxt, Diverges, Expectation, FnCtxt, LoweredTy};
|
use crate::{BreakableCtxt, Diverges, Expectation, FnCtxt, LoweredTy};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
|
@ -735,7 +735,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
qpath: &'tcx QPath<'tcx>,
|
qpath: &'tcx QPath<'tcx>,
|
||||||
hir_id: HirId,
|
hir_id: HirId,
|
||||||
span: Span,
|
span: Span,
|
||||||
args: Option<&'tcx [hir::Expr<'tcx>]>,
|
|
||||||
) -> (Res, Option<LoweredTy<'tcx>>, &'tcx [hir::PathSegment<'tcx>]) {
|
) -> (Res, Option<LoweredTy<'tcx>>, &'tcx [hir::PathSegment<'tcx>]) {
|
||||||
debug!(
|
debug!(
|
||||||
"resolve_ty_and_res_fully_qualified_call: qpath={:?} hir_id={:?} span={:?}",
|
"resolve_ty_and_res_fully_qualified_call: qpath={:?} hir_id={:?} span={:?}",
|
||||||
|
@ -828,14 +827,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
if item_name.name != kw::Empty {
|
if item_name.name != kw::Empty {
|
||||||
if let Some(e) = self.report_method_error(
|
if let Some(e) = self.report_method_error(
|
||||||
span,
|
|
||||||
None,
|
|
||||||
ty.normalized,
|
|
||||||
item_name,
|
|
||||||
hir_id,
|
hir_id,
|
||||||
SelfSource::QPath(qself),
|
ty.normalized,
|
||||||
error,
|
error,
|
||||||
args,
|
|
||||||
Expectation::NoExpectation,
|
Expectation::NoExpectation,
|
||||||
trait_missing_method && span.edition().at_least_rust_2021(), // emits missing method for trait only after edition 2021
|
trait_missing_method && span.edition().at_least_rust_2021(), // emits missing method for trait only after edition 2021
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -7,7 +7,6 @@ mod prelude_edition_lints;
|
||||||
pub mod probe;
|
pub mod probe;
|
||||||
mod suggest;
|
mod suggest;
|
||||||
|
|
||||||
pub use self::suggest::SelfSource;
|
|
||||||
pub use self::MethodError::*;
|
pub use self::MethodError::*;
|
||||||
|
|
||||||
use crate::FnCtxt;
|
use crate::FnCtxt;
|
||||||
|
|
|
@ -16,11 +16,11 @@ use rustc_data_structures::unord::UnordSet;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
codes::*, pluralize, struct_span_code_err, Applicability, Diag, MultiSpan, StashKey,
|
codes::*, pluralize, struct_span_code_err, Applicability, Diag, MultiSpan, StashKey,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::PathSegment;
|
use rustc_hir::PathSegment;
|
||||||
|
use rustc_hir::{self as hir, HirId};
|
||||||
use rustc_hir::{ExprKind, Node, QPath};
|
use rustc_hir::{ExprKind, Node, QPath};
|
||||||
use rustc_infer::infer::{self, RegionVariableOrigin};
|
use rustc_infer::infer::{self, RegionVariableOrigin};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
|
@ -187,37 +187,56 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
#[instrument(level = "debug", skip(self))]
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub fn report_method_error(
|
pub fn report_method_error(
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
call_id: HirId,
|
||||||
rcvr_opt: Option<&'tcx hir::Expr<'tcx>>,
|
|
||||||
rcvr_ty: Ty<'tcx>,
|
rcvr_ty: Ty<'tcx>,
|
||||||
item_name: Ident,
|
|
||||||
expr_id: hir::HirId,
|
|
||||||
source: SelfSource<'tcx>,
|
|
||||||
error: MethodError<'tcx>,
|
error: MethodError<'tcx>,
|
||||||
args: Option<&'tcx [hir::Expr<'tcx>]>,
|
|
||||||
expected: Expectation<'tcx>,
|
expected: Expectation<'tcx>,
|
||||||
trait_missing_method: bool,
|
trait_missing_method: bool,
|
||||||
) -> Option<Diag<'_>> {
|
) -> Option<Diag<'_>> {
|
||||||
|
let (span, sugg_span, source, item_name, args) = match self.tcx.hir_node(call_id) {
|
||||||
|
hir::Node::Expr(&hir::Expr {
|
||||||
|
kind: hir::ExprKind::MethodCall(segment, rcvr, args, _),
|
||||||
|
span,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
(segment.ident.span, span, SelfSource::MethodCall(rcvr), segment.ident, Some(args))
|
||||||
|
}
|
||||||
|
hir::Node::Expr(&hir::Expr {
|
||||||
|
kind: hir::ExprKind::Path(QPath::TypeRelative(rcvr, segment)),
|
||||||
|
span,
|
||||||
|
..
|
||||||
|
})
|
||||||
|
| hir::Node::Pat(&hir::Pat {
|
||||||
|
kind:
|
||||||
|
hir::PatKind::Path(QPath::TypeRelative(rcvr, segment))
|
||||||
|
| hir::PatKind::Struct(QPath::TypeRelative(rcvr, segment), ..)
|
||||||
|
| hir::PatKind::TupleStruct(QPath::TypeRelative(rcvr, segment), ..),
|
||||||
|
span,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
let args = match self.tcx.parent_hir_node(call_id) {
|
||||||
|
hir::Node::Expr(&hir::Expr {
|
||||||
|
kind: hir::ExprKind::Call(callee, args), ..
|
||||||
|
}) if callee.hir_id == call_id => Some(args),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
(segment.ident.span, span, SelfSource::QPath(rcvr), segment.ident, args)
|
||||||
|
}
|
||||||
|
node => unreachable!("{node:?}"),
|
||||||
|
};
|
||||||
|
|
||||||
// Avoid suggestions when we don't know what's going on.
|
// Avoid suggestions when we don't know what's going on.
|
||||||
if rcvr_ty.references_error() {
|
if rcvr_ty.references_error() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let sugg_span = if let SelfSource::MethodCall(expr) = source {
|
|
||||||
// Given `foo.bar(baz)`, `expr` is `bar`, but we want to point to the whole thing.
|
|
||||||
self.tcx.hir().expect_expr(self.tcx.parent_hir_id(expr.hir_id)).span
|
|
||||||
} else {
|
|
||||||
span
|
|
||||||
};
|
|
||||||
|
|
||||||
match error {
|
match error {
|
||||||
MethodError::NoMatch(mut no_match_data) => {
|
MethodError::NoMatch(mut no_match_data) => {
|
||||||
return self.report_no_match_method_error(
|
return self.report_no_match_method_error(
|
||||||
span,
|
span,
|
||||||
rcvr_opt,
|
|
||||||
rcvr_ty,
|
rcvr_ty,
|
||||||
item_name,
|
item_name,
|
||||||
expr_id,
|
call_id,
|
||||||
source,
|
source,
|
||||||
args,
|
args,
|
||||||
sugg_span,
|
sugg_span,
|
||||||
|
@ -362,7 +381,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
pub fn suggest_use_shadowed_binding_with_method(
|
pub fn suggest_use_shadowed_binding_with_method(
|
||||||
&self,
|
&self,
|
||||||
rcvr_opt: Option<&'tcx hir::Expr<'tcx>>,
|
self_source: SelfSource<'tcx>,
|
||||||
method_name: Ident,
|
method_name: Ident,
|
||||||
ty_str_reported: &str,
|
ty_str_reported: &str,
|
||||||
err: &mut Diag<'_>,
|
err: &mut Diag<'_>,
|
||||||
|
@ -502,7 +521,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(rcvr) = rcvr_opt
|
if let SelfSource::MethodCall(rcvr) = self_source
|
||||||
&& let hir::ExprKind::Path(QPath::Resolved(_, path)) = rcvr.kind
|
&& let hir::ExprKind::Path(QPath::Resolved(_, path)) = rcvr.kind
|
||||||
&& let hir::def::Res::Local(recv_id) = path.res
|
&& let hir::def::Res::Local(recv_id) = path.res
|
||||||
&& let Some(segment) = path.segments.first()
|
&& let Some(segment) = path.segments.first()
|
||||||
|
@ -548,7 +567,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
pub fn report_no_match_method_error(
|
pub fn report_no_match_method_error(
|
||||||
&self,
|
&self,
|
||||||
mut span: Span,
|
mut span: Span,
|
||||||
rcvr_opt: Option<&'tcx hir::Expr<'tcx>>,
|
|
||||||
rcvr_ty: Ty<'tcx>,
|
rcvr_ty: Ty<'tcx>,
|
||||||
item_name: Ident,
|
item_name: Ident,
|
||||||
expr_id: hir::HirId,
|
expr_id: hir::HirId,
|
||||||
|
@ -658,7 +676,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
if is_method {
|
if is_method {
|
||||||
self.suggest_use_shadowed_binding_with_method(
|
self.suggest_use_shadowed_binding_with_method(
|
||||||
rcvr_opt,
|
source,
|
||||||
item_name,
|
item_name,
|
||||||
&ty_str_reported,
|
&ty_str_reported,
|
||||||
&mut err,
|
&mut err,
|
||||||
|
|
|
@ -223,9 +223,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let PatInfo { binding_mode, max_ref_mutbl, top_info: ti, current_depth, .. } = pat_info;
|
let PatInfo { binding_mode, max_ref_mutbl, top_info: ti, current_depth, .. } = pat_info;
|
||||||
|
|
||||||
let path_res = match &pat.kind {
|
let path_res = match &pat.kind {
|
||||||
PatKind::Path(qpath) => Some(
|
PatKind::Path(qpath) => {
|
||||||
self.resolve_ty_and_res_fully_qualified_call(qpath, pat.hir_id, pat.span, None),
|
Some(self.resolve_ty_and_res_fully_qualified_call(qpath, pat.hir_id, pat.span))
|
||||||
),
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
let adjust_mode = self.calc_adjust_mode(pat, path_res.map(|(res, ..)| res));
|
let adjust_mode = self.calc_adjust_mode(pat, path_res.map(|(res, ..)| res));
|
||||||
|
@ -1184,7 +1184,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
// Resolve the path and check the definition for errors.
|
// Resolve the path and check the definition for errors.
|
||||||
let (res, opt_ty, segments) =
|
let (res, opt_ty, segments) =
|
||||||
self.resolve_ty_and_res_fully_qualified_call(qpath, pat.hir_id, pat.span, None);
|
self.resolve_ty_and_res_fully_qualified_call(qpath, pat.hir_id, pat.span);
|
||||||
if res == Res::Err {
|
if res == Res::Err {
|
||||||
let e = tcx.dcx().span_delayed_bug(pat.span, "`Res::Err` but no error emitted");
|
let e = tcx.dcx().span_delayed_bug(pat.span, "`Res::Err` but no error emitted");
|
||||||
self.set_tainted_by_errors(e);
|
self.set_tainted_by_errors(e);
|
||||||
|
|
|
@ -52,7 +52,7 @@ error[E0599]: no function or associated item named `bitor` found for trait objec
|
||||||
LL | let g = BitXor::bitor;
|
LL | let g = BitXor::bitor;
|
||||||
| ^^^^^ function or associated item not found in `dyn BitXor<_>`
|
| ^^^^^ function or associated item not found in `dyn BitXor<_>`
|
||||||
|
|
|
|
||||||
help: there is a method `bitxor` with a similar name, but with different arguments
|
help: there is a method `bitxor` with a similar name
|
||||||
--> $SRC_DIR/core/src/ops/bit.rs:LL:COL
|
--> $SRC_DIR/core/src/ops/bit.rs:LL:COL
|
||||||
|
|
||||||
error: aborting due to 4 previous errors; 2 warnings emitted
|
error: aborting due to 4 previous errors; 2 warnings emitted
|
||||||
|
|
|
@ -15,13 +15,6 @@ LL | Box::z
|
||||||
LL | mac!();
|
LL | mac!();
|
||||||
| ------ in this macro invocation
|
| ------ in this macro invocation
|
||||||
|
|
|
|
||||||
note: if you're trying to build a new `Box<_, _>` consider using one of the following associated functions:
|
|
||||||
Box::<T>::new
|
|
||||||
Box::<T>::new_uninit
|
|
||||||
Box::<T>::new_zeroed
|
|
||||||
Box::<T>::try_new
|
|
||||||
and 18 others
|
|
||||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
|
||||||
= note: this error originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
|
@ -126,14 +126,15 @@ LL | S::B;
|
||||||
| ^ associated item not found in `S`
|
| ^ associated item not found in `S`
|
||||||
|
|
|
|
||||||
= help: items from traits can only be used if the trait is in scope
|
= help: items from traits can only be used if the trait is in scope
|
||||||
|
help: there is a method `b` with a similar name
|
||||||
|
--> $DIR/item-privacy.rs:11:9
|
||||||
|
|
|
||||||
|
LL | fn b(&self) { }
|
||||||
|
| ^^^^^^^^^^^
|
||||||
help: trait `B` which provides `B` is implemented but not in scope; perhaps you want to import it
|
help: trait `B` which provides `B` is implemented but not in scope; perhaps you want to import it
|
||||||
|
|
|
|
||||||
LL + use assoc_const::B;
|
LL + use assoc_const::B;
|
||||||
|
|
|
|
||||||
help: there is a method `b` with a similar name
|
|
||||||
|
|
|
||||||
LL | S::b;
|
|
||||||
| ~
|
|
||||||
|
|
||||||
error[E0624]: associated constant `A` is private
|
error[E0624]: associated constant `A` is private
|
||||||
--> $DIR/item-privacy.rs:101:14
|
--> $DIR/item-privacy.rs:101:14
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue