Skip to content

Commit f001795

Browse files
committed
don't alloc error string if no error emitted
1 parent 1d60108 commit f001795

File tree

1 file changed

+33
-32
lines changed
  • compiler/rustc_typeck/src/astconv

1 file changed

+33
-32
lines changed

compiler/rustc_typeck/src/astconv/mod.rs

+33-32
Original file line numberDiff line numberDiff line change
@@ -2111,14 +2111,24 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
21112111
extend: impl Fn(&mut DiagnosticBuilder<'tcx, ErrorGuaranteed>),
21122112
) -> bool {
21132113
let args = segments.clone().flat_map(|segment| segment.args().args);
2114-
let types_and_spans: Vec<_> = segments
2115-
.clone()
2116-
.flat_map(|segment| {
2117-
segment.res.and_then(|res| {
2118-
if segment.args().args.is_empty() {
2119-
None
2120-
} else {
2121-
Some((
2114+
2115+
let (lt, ty, ct, inf) =
2116+
args.clone().fold((false, false, false, false), |(lt, ty, ct, inf), arg| match arg {
2117+
hir::GenericArg::Lifetime(_) => (true, ty, ct, inf),
2118+
hir::GenericArg::Type(_) => (lt, true, ct, inf),
2119+
hir::GenericArg::Const(_) => (lt, ty, true, inf),
2120+
hir::GenericArg::Infer(_) => (lt, ty, ct, true),
2121+
});
2122+
let mut emitted = false;
2123+
if lt || ty || ct || inf {
2124+
let types_and_spans: Vec<_> = segments
2125+
.clone()
2126+
.flat_map(|segment| {
2127+
segment.res.and_then(|res| {
2128+
if segment.args().args.is_empty() {
2129+
None
2130+
} else {
2131+
Some((
21222132
match res {
21232133
Res::PrimTy(ty) => format!("{} `{}`", res.descr(), ty.name()),
21242134
Res::Def(_, def_id)
@@ -2130,32 +2140,23 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
21302140
},
21312141
segment.ident.span,
21322142
))
2133-
}
2143+
}
2144+
})
21342145
})
2135-
})
2136-
.collect();
2137-
let this_type = match &types_and_spans[..] {
2138-
[.., _, (last, _)] => format!(
2139-
"{} and {last}",
2140-
types_and_spans[..types_and_spans.len() - 1]
2141-
.iter()
2142-
.map(|(x, _)| x.as_str())
2143-
.intersperse(&", ")
2144-
.collect::<String>()
2145-
),
2146-
[(only, _)] => only.to_string(),
2147-
[] => "this type".to_string(),
2148-
};
2146+
.collect();
2147+
let this_type = match &types_and_spans[..] {
2148+
[.., _, (last, _)] => format!(
2149+
"{} and {last}",
2150+
types_and_spans[..types_and_spans.len() - 1]
2151+
.iter()
2152+
.map(|(x, _)| x.as_str())
2153+
.intersperse(&", ")
2154+
.collect::<String>()
2155+
),
2156+
[(only, _)] => only.to_string(),
2157+
[] => "this type".to_string(),
2158+
};
21492159

2150-
let (lt, ty, ct, inf) =
2151-
args.clone().fold((false, false, false, false), |(lt, ty, ct, inf), arg| match arg {
2152-
hir::GenericArg::Lifetime(_) => (true, ty, ct, inf),
2153-
hir::GenericArg::Type(_) => (lt, true, ct, inf),
2154-
hir::GenericArg::Const(_) => (lt, ty, true, inf),
2155-
hir::GenericArg::Infer(_) => (lt, ty, ct, true),
2156-
});
2157-
let mut emitted = false;
2158-
if lt || ty || ct || inf {
21592160
let arg_spans: Vec<Span> = args.map(|arg| arg.span()).collect();
21602161

21612162
let mut kinds = Vec::with_capacity(4);

0 commit comments

Comments
 (0)