Auto merge of #139940 - matthiaskrgr:rollup-rd4d3fn, r=matthiaskrgr
Rollup of 9 pull requests Successful merges: - #135340 (Add `explicit_extern_abis` Feature and Enforce Explicit ABIs) - #139440 (rustc_target: RISC-V: feature addition batch 2) - #139667 (cfi: Remove #[no_sanitize(cfi)] for extern weak functions) - #139828 (Don't require rigid alias's trait to hold) - #139854 (Improve parse errors for stray lifetimes in type position) - #139889 (Clean UI tests 3 of n) - #139894 (Fix `opt-dist` CLI flag and make it work without LLD) - #139900 (stepping into impls for normalization is unproductive) - #139915 (replace some #[rustc_intrinsic] usage with use of the libcore declarations) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
15c4ccef03
79 changed files with 939 additions and 231 deletions
|
@ -543,7 +543,7 @@ parse_maybe_recover_from_bad_qpath_stage_2 =
|
|||
.suggestion = types that don't start with an identifier need to be surrounded with angle brackets in qualified paths
|
||||
|
||||
parse_maybe_recover_from_bad_type_plus =
|
||||
expected a path on the left-hand side of `+`, not `{$ty}`
|
||||
expected a path on the left-hand side of `+`
|
||||
|
||||
parse_maybe_report_ambiguous_plus =
|
||||
ambiguous `+` in a type
|
||||
|
@ -642,7 +642,9 @@ parse_mut_on_nested_ident_pattern = `mut` must be attached to each individual bi
|
|||
.suggestion = add `mut` to each binding
|
||||
parse_mut_on_non_ident_pattern = `mut` must be followed by a named binding
|
||||
.suggestion = remove the `mut` prefix
|
||||
parse_need_plus_after_trait_object_lifetime = lifetime in trait object type must be followed by `+`
|
||||
|
||||
parse_need_plus_after_trait_object_lifetime = lifetimes must be followed by `+` to form a trait object type
|
||||
.suggestion = consider adding a trait bound after the potential lifetime bound
|
||||
|
||||
parse_nested_adt = `{$kw_str}` definition cannot be nested inside `{$keyword}`
|
||||
.suggestion = consider creating a new `{$kw_str}` definition instead of nesting
|
||||
|
|
|
@ -30,7 +30,6 @@ pub(crate) struct AmbiguousPlus {
|
|||
#[derive(Diagnostic)]
|
||||
#[diag(parse_maybe_recover_from_bad_type_plus, code = E0178)]
|
||||
pub(crate) struct BadTypePlus {
|
||||
pub ty: String,
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
|
@ -2800,6 +2799,8 @@ pub(crate) struct ReturnTypesUseThinArrow {
|
|||
pub(crate) struct NeedPlusAfterTraitObjectLifetime {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
#[suggestion(code = " + /* Trait */", applicability = "has-placeholders")]
|
||||
pub suggestion: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
|
|
@ -1657,19 +1657,19 @@ impl<'a> Parser<'a> {
|
|||
|
||||
self.bump(); // `+`
|
||||
let _bounds = self.parse_generic_bounds()?;
|
||||
let sum_span = ty.span.to(self.prev_token.span);
|
||||
|
||||
let sub = match &ty.kind {
|
||||
TyKind::Ref(_lifetime, mut_ty) => {
|
||||
let lo = mut_ty.ty.span.shrink_to_lo();
|
||||
let hi = self.prev_token.span.shrink_to_hi();
|
||||
BadTypePlusSub::AddParen { suggestion: AddParen { lo, hi } }
|
||||
}
|
||||
TyKind::Ptr(..) | TyKind::BareFn(..) => BadTypePlusSub::ForgotParen { span: sum_span },
|
||||
_ => BadTypePlusSub::ExpectPath { span: sum_span },
|
||||
TyKind::Ptr(..) | TyKind::BareFn(..) => {
|
||||
BadTypePlusSub::ForgotParen { span: ty.span.to(self.prev_token.span) }
|
||||
}
|
||||
_ => BadTypePlusSub::ExpectPath { span: ty.span },
|
||||
};
|
||||
|
||||
self.dcx().emit_err(BadTypePlus { ty: pprust::ty_to_string(ty), span: sum_span, sub });
|
||||
self.dcx().emit_err(BadTypePlus { span: ty.span, sub });
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ use rustc_ast::{
|
|||
Pinnedness, PolyTraitRef, PreciseCapturingArg, TraitBoundModifiers, TraitObjectSyntax, Ty,
|
||||
TyKind, UnsafeBinderTy,
|
||||
};
|
||||
use rustc_errors::{Applicability, PResult};
|
||||
use rustc_errors::{Applicability, Diag, PResult};
|
||||
use rustc_span::{ErrorGuaranteed, Ident, Span, kw, sym};
|
||||
use thin_vec::{ThinVec, thin_vec};
|
||||
|
||||
|
@ -411,6 +411,9 @@ impl<'a> Parser<'a> {
|
|||
TyKind::Path(None, path) if maybe_bounds => {
|
||||
self.parse_remaining_bounds_path(ThinVec::new(), path, lo, true)
|
||||
}
|
||||
// For `('a) + …`, we know that `'a` in type position already lead to an error being
|
||||
// emitted. To reduce output, let's indirectly suppress E0178 (bad `+` in type) and
|
||||
// other irrelevant consequential errors.
|
||||
TyKind::TraitObject(bounds, TraitObjectSyntax::None)
|
||||
if maybe_bounds && bounds.len() == 1 && !trailing_plus =>
|
||||
{
|
||||
|
@ -425,12 +428,60 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
fn parse_bare_trait_object(&mut self, lo: Span, allow_plus: AllowPlus) -> PResult<'a, TyKind> {
|
||||
let lt_no_plus = self.check_lifetime() && !self.look_ahead(1, |t| t.is_like_plus());
|
||||
let bounds = self.parse_generic_bounds_common(allow_plus)?;
|
||||
if lt_no_plus {
|
||||
self.dcx().emit_err(NeedPlusAfterTraitObjectLifetime { span: lo });
|
||||
// A lifetime only begins a bare trait object type if it is followed by `+`!
|
||||
if self.token.is_lifetime() && !self.look_ahead(1, |t| t.is_like_plus()) {
|
||||
// In Rust 2021 and beyond, we assume that the user didn't intend to write a bare trait
|
||||
// object type with a leading lifetime bound since that seems very unlikely given the
|
||||
// fact that `dyn`-less trait objects are *semantically* invalid.
|
||||
if self.psess.edition.at_least_rust_2021() {
|
||||
let lt = self.expect_lifetime();
|
||||
let mut err = self.dcx().struct_span_err(lo, "expected type, found lifetime");
|
||||
err.span_label(lo, "expected type");
|
||||
return Ok(match self.maybe_recover_ref_ty_no_leading_ampersand(lt, lo, err) {
|
||||
Ok(ref_ty) => ref_ty,
|
||||
Err(err) => TyKind::Err(err.emit()),
|
||||
});
|
||||
}
|
||||
|
||||
self.dcx().emit_err(NeedPlusAfterTraitObjectLifetime {
|
||||
span: lo,
|
||||
suggestion: lo.shrink_to_hi(),
|
||||
});
|
||||
}
|
||||
Ok(TyKind::TraitObject(
|
||||
self.parse_generic_bounds_common(allow_plus)?,
|
||||
TraitObjectSyntax::None,
|
||||
))
|
||||
}
|
||||
|
||||
fn maybe_recover_ref_ty_no_leading_ampersand<'cx>(
|
||||
&mut self,
|
||||
lt: Lifetime,
|
||||
lo: Span,
|
||||
mut err: Diag<'cx>,
|
||||
) -> Result<TyKind, Diag<'cx>> {
|
||||
if !self.may_recover() {
|
||||
return Err(err);
|
||||
}
|
||||
let snapshot = self.create_snapshot_for_diagnostic();
|
||||
let mutbl = self.parse_mutability();
|
||||
match self.parse_ty_no_plus() {
|
||||
Ok(ty) => {
|
||||
err.span_suggestion_verbose(
|
||||
lo.shrink_to_lo(),
|
||||
"you might have meant to write a reference type here",
|
||||
"&",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.emit();
|
||||
Ok(TyKind::Ref(Some(lt), MutTy { ty, mutbl }))
|
||||
}
|
||||
Err(diag) => {
|
||||
diag.cancel();
|
||||
self.restore_snapshot(snapshot);
|
||||
Err(err)
|
||||
}
|
||||
}
|
||||
Ok(TyKind::TraitObject(bounds, TraitObjectSyntax::None))
|
||||
}
|
||||
|
||||
fn parse_remaining_bounds_path(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue