Auto merge of #73025 - Dylan-DPC:rollup-a1uzj5u, r=Dylan-DPC
Rollup of 5 pull requests Successful merges: - #72260 (Spell out `Self` in async function return) - #72996 (Remove unsused `NodeId` related APIs in hir map) - #73010 (Update RELEASES.md) - #73017 (Use assert_eq for liballoc test) - #73019 (add test for #72960) Failed merges: r? @ghost
This commit is contained in:
commit
e4124750c3
|
@ -107,8 +107,8 @@ Compatibility Notes
|
||||||
previously a warning.
|
previously a warning.
|
||||||
- [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as`
|
- [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as`
|
||||||
operator has been defined as a saturating operation.][71269] This was previously
|
operator has been defined as a saturating operation.][71269] This was previously
|
||||||
undefined behaviour, you can use the `{f64, f32}::to_int_unchecked` methods to
|
undefined behaviour, but you can use the `{f64, f32}::to_int_unchecked` methods to
|
||||||
continue using the current behaviour which may desirable in rare performance
|
continue using the current behaviour, which may be desirable in rare performance
|
||||||
sensitive situations.
|
sensitive situations.
|
||||||
|
|
||||||
Internal Only
|
Internal Only
|
||||||
|
|
|
@ -16,7 +16,7 @@ impl Drop for DropCounter<'_> {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_small_vec_struct() {
|
fn test_small_vec_struct() {
|
||||||
assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
|
assert_eq!(size_of::<Vec<u8>>(), size_of::<usize>() * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -437,6 +437,7 @@ E0751: include_str!("./error_codes/E0751.md"),
|
||||||
E0752: include_str!("./error_codes/E0752.md"),
|
E0752: include_str!("./error_codes/E0752.md"),
|
||||||
E0753: include_str!("./error_codes/E0753.md"),
|
E0753: include_str!("./error_codes/E0753.md"),
|
||||||
E0754: include_str!("./error_codes/E0754.md"),
|
E0754: include_str!("./error_codes/E0754.md"),
|
||||||
|
E0760: include_str!("./error_codes/E0760.md"),
|
||||||
;
|
;
|
||||||
// E0006, // merged with E0005
|
// E0006, // merged with E0005
|
||||||
// E0008, // cannot bind by-move into a pattern guard
|
// E0008, // cannot bind by-move into a pattern guard
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
`async fn`/`impl trait` return type cannot contain a projection
|
||||||
|
or `Self` that references lifetimes from a parent scope.
|
||||||
|
|
||||||
|
Erroneous code example:
|
||||||
|
|
||||||
|
```compile_fail,E0760,edition2018
|
||||||
|
struct S<'a>(&'a i32);
|
||||||
|
|
||||||
|
impl<'a> S<'a> {
|
||||||
|
async fn new(i: &'a i32) -> Self {
|
||||||
|
S(&22)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix this error we need to spell out `Self` to `S<'a>`:
|
||||||
|
|
||||||
|
```edition2018
|
||||||
|
struct S<'a>(&'a i32);
|
||||||
|
|
||||||
|
impl<'a> S<'a> {
|
||||||
|
async fn new(i: &'a i32) -> S<'a> {
|
||||||
|
S(&22)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will be allowed at some point in the future,
|
||||||
|
but the implementation is not yet complete.
|
||||||
|
See the [issue-61949] for this limitation.
|
||||||
|
|
||||||
|
[issue-61949]: https://github.com/rust-lang/rust/issues/61949
|
|
@ -364,6 +364,12 @@ impl Definitions {
|
||||||
self.node_id_to_hir_id[node_id]
|
self.node_id_to_hir_id[node_id]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn opt_hir_id_to_local_def_id(&self, hir_id: hir::HirId) -> Option<LocalDefId> {
|
||||||
|
let node_id = self.hir_id_to_node_id(hir_id);
|
||||||
|
self.opt_local_def_id(node_id)
|
||||||
|
}
|
||||||
|
|
||||||
/// Retrieves the span of the given `DefId` if `DefId` is in the local crate.
|
/// Retrieves the span of the given `DefId` if `DefId` is in the local crate.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn opt_span(&self, def_id: DefId) -> Option<Span> {
|
pub fn opt_span(&self, def_id: DefId) -> Option<Span> {
|
||||||
|
|
|
@ -3,7 +3,7 @@ use self::collector::NodeCollector;
|
||||||
use crate::hir::{Owner, OwnerNodes};
|
use crate::hir::{Owner, OwnerNodes};
|
||||||
use crate::ty::query::Providers;
|
use crate::ty::query::Providers;
|
||||||
use crate::ty::TyCtxt;
|
use crate::ty::TyCtxt;
|
||||||
use rustc_ast::ast::{self, NodeId};
|
use rustc_ast::ast::{self};
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||||
|
@ -157,18 +157,6 @@ impl<'hir> Map<'hir> {
|
||||||
self.tcx.definitions.def_path(def_id)
|
self.tcx.definitions.def_path(def_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn local_def_id_from_node_id(&self, node: NodeId) -> LocalDefId {
|
|
||||||
self.opt_local_def_id_from_node_id(node).unwrap_or_else(|| {
|
|
||||||
let hir_id = self.node_id_to_hir_id(node);
|
|
||||||
bug!(
|
|
||||||
"local_def_id_from_node_id: no entry for `{}`, which has a map of `{:?}`",
|
|
||||||
node,
|
|
||||||
self.find_entry(hir_id)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn local_def_id(&self, hir_id: HirId) -> LocalDefId {
|
pub fn local_def_id(&self, hir_id: HirId) -> LocalDefId {
|
||||||
self.opt_local_def_id(hir_id).unwrap_or_else(|| {
|
self.opt_local_def_id(hir_id).unwrap_or_else(|| {
|
||||||
|
@ -182,13 +170,7 @@ impl<'hir> Map<'hir> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn opt_local_def_id(&self, hir_id: HirId) -> Option<LocalDefId> {
|
pub fn opt_local_def_id(&self, hir_id: HirId) -> Option<LocalDefId> {
|
||||||
let node_id = self.hir_id_to_node_id(hir_id);
|
self.tcx.definitions.opt_hir_id_to_local_def_id(hir_id)
|
||||||
self.opt_local_def_id_from_node_id(node_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn opt_local_def_id_from_node_id(&self, node: NodeId) -> Option<LocalDefId> {
|
|
||||||
self.tcx.definitions.opt_local_def_id(node)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -196,21 +178,6 @@ impl<'hir> Map<'hir> {
|
||||||
self.tcx.definitions.as_local_hir_id(def_id)
|
self.tcx.definitions.as_local_hir_id(def_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn hir_id_to_node_id(&self, hir_id: HirId) -> NodeId {
|
|
||||||
self.tcx.definitions.hir_id_to_node_id(hir_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn node_id_to_hir_id(&self, node_id: NodeId) -> HirId {
|
|
||||||
self.tcx.definitions.node_id_to_hir_id(node_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn opt_node_id_to_hir_id(&self, node_id: NodeId) -> Option<HirId> {
|
|
||||||
self.tcx.definitions.opt_node_id_to_hir_id(node_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn local_def_id_to_hir_id(&self, def_id: LocalDefId) -> HirId {
|
pub fn local_def_id_to_hir_id(&self, def_id: LocalDefId) -> HirId {
|
||||||
self.tcx.definitions.local_def_id_to_hir_id(def_id)
|
self.tcx.definitions.local_def_id_to_hir_id(def_id)
|
||||||
|
|
|
@ -1623,12 +1623,17 @@ fn check_opaque_for_inheriting_lifetimes(tcx: TyCtxt<'tcx>, def_id: LocalDefId,
|
||||||
struct ProhibitOpaqueVisitor<'tcx> {
|
struct ProhibitOpaqueVisitor<'tcx> {
|
||||||
opaque_identity_ty: Ty<'tcx>,
|
opaque_identity_ty: Ty<'tcx>,
|
||||||
generics: &'tcx ty::Generics,
|
generics: &'tcx ty::Generics,
|
||||||
|
ty: Option<Ty<'tcx>>,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> {
|
impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> {
|
||||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
|
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
|
||||||
debug!("check_opaque_for_inheriting_lifetimes: (visit_ty) t={:?}", t);
|
debug!("check_opaque_for_inheriting_lifetimes: (visit_ty) t={:?}", t);
|
||||||
if t == self.opaque_identity_ty { false } else { t.super_visit_with(self) }
|
if t != self.opaque_identity_ty && t.super_visit_with(self) {
|
||||||
|
self.ty = Some(t);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
|
fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
|
||||||
|
@ -1651,46 +1656,61 @@ fn check_opaque_for_inheriting_lifetimes(tcx: TyCtxt<'tcx>, def_id: LocalDefId,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let prohibit_opaque = match item.kind {
|
if let ItemKind::OpaqueTy(hir::OpaqueTy {
|
||||||
ItemKind::OpaqueTy(hir::OpaqueTy {
|
origin: hir::OpaqueTyOrigin::AsyncFn | hir::OpaqueTyOrigin::FnReturn,
|
||||||
origin: hir::OpaqueTyOrigin::AsyncFn | hir::OpaqueTyOrigin::FnReturn,
|
..
|
||||||
..
|
}) = item.kind
|
||||||
}) => {
|
{
|
||||||
let mut visitor = ProhibitOpaqueVisitor {
|
let mut visitor = ProhibitOpaqueVisitor {
|
||||||
opaque_identity_ty: tcx.mk_opaque(
|
opaque_identity_ty: tcx.mk_opaque(
|
||||||
def_id.to_def_id(),
|
def_id.to_def_id(),
|
||||||
InternalSubsts::identity_for_item(tcx, def_id.to_def_id()),
|
InternalSubsts::identity_for_item(tcx, def_id.to_def_id()),
|
||||||
),
|
),
|
||||||
generics: tcx.generics_of(def_id),
|
generics: tcx.generics_of(def_id),
|
||||||
};
|
ty: None,
|
||||||
debug!("check_opaque_for_inheriting_lifetimes: visitor={:?}", visitor);
|
|
||||||
|
|
||||||
tcx.predicates_of(def_id)
|
|
||||||
.predicates
|
|
||||||
.iter()
|
|
||||||
.any(|(predicate, _)| predicate.visit_with(&mut visitor))
|
|
||||||
}
|
|
||||||
_ => false,
|
|
||||||
};
|
|
||||||
|
|
||||||
debug!("check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}", prohibit_opaque);
|
|
||||||
if prohibit_opaque {
|
|
||||||
let is_async = match item.kind {
|
|
||||||
ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
|
|
||||||
hir::OpaqueTyOrigin::AsyncFn => true,
|
|
||||||
_ => false,
|
|
||||||
},
|
|
||||||
_ => unreachable!(),
|
|
||||||
};
|
};
|
||||||
|
let prohibit_opaque = tcx
|
||||||
tcx.sess.span_err(
|
.predicates_of(def_id)
|
||||||
span,
|
.predicates
|
||||||
&format!(
|
.iter()
|
||||||
"`{}` return type cannot contain a projection or `Self` that references lifetimes from \
|
.any(|(predicate, _)| predicate.visit_with(&mut visitor));
|
||||||
a parent scope",
|
debug!(
|
||||||
if is_async { "async fn" } else { "impl Trait" },
|
"check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}, visitor={:?}",
|
||||||
),
|
prohibit_opaque, visitor
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if prohibit_opaque {
|
||||||
|
let is_async = match item.kind {
|
||||||
|
ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
|
||||||
|
hir::OpaqueTyOrigin::AsyncFn => true,
|
||||||
|
_ => false,
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut err = struct_span_err!(
|
||||||
|
tcx.sess,
|
||||||
|
span,
|
||||||
|
E0760,
|
||||||
|
"`{}` return type cannot contain a projection or `Self` that references lifetimes from \
|
||||||
|
a parent scope",
|
||||||
|
if is_async { "async fn" } else { "impl Trait" },
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(span) {
|
||||||
|
if snippet == "Self" {
|
||||||
|
if let Some(ty) = visitor.ty {
|
||||||
|
err.span_suggestion(
|
||||||
|
span,
|
||||||
|
"consider spelling out the type instead",
|
||||||
|
format!("{:?}", ty),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err.emit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
// compile-flags: -Zsave-analysis
|
||||||
// only-x86_64
|
// only-x86_64
|
||||||
|
// Also test for #72960
|
||||||
|
|
||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: invalid register `invalid`: unknown register
|
error: invalid register `invalid`: unknown register
|
||||||
--> $DIR/issue-72570.rs:7:18
|
--> $DIR/issue-72570.rs:9:18
|
||||||
|
|
|
|
||||||
LL | asm!("", in("invalid") "".len());
|
LL | asm!("", in("invalid") "".len());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
error: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
error[E0760]: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
||||||
--> $DIR/issue-61949-self-return-type.rs:11:40
|
--> $DIR/issue-61949-self-return-type.rs:11:40
|
||||||
|
|
|
|
||||||
LL | pub async fn new(_bar: &'a i32) -> Self {
|
LL | pub async fn new(_bar: &'a i32) -> Self {
|
||||||
| ^^^^
|
| ^^^^ help: consider spelling out the type instead: `Foo<'a>`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0760`.
|
||||||
|
|
|
@ -21,7 +21,7 @@ help: consider constraining the associated type `<T as impl_trait::Trait>::Assoc
|
||||||
LL | fn foo_fail<T: Trait<Assoc = ()>>() -> impl FooLike<Output=T::Assoc> {
|
LL | fn foo_fail<T: Trait<Assoc = ()>>() -> impl FooLike<Output=T::Assoc> {
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
error: `impl Trait` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
error[E0760]: `impl Trait` return type cannot contain a projection or `Self` that references lifetimes from a parent scope
|
||||||
--> $DIR/bound-normalization-fail.rs:43:41
|
--> $DIR/bound-normalization-fail.rs:43:41
|
||||||
|
|
|
|
||||||
LL | fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
|
LL | fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output=T::Assoc> {
|
||||||
|
@ -43,4 +43,5 @@ LL | fn foo2_fail<'a, T: Trait<'a, Assoc = ()>>() -> impl FooLike<Output=T::
|
||||||
|
|
||||||
error: aborting due to 3 previous errors; 1 warning emitted
|
error: aborting due to 3 previous errors; 1 warning emitted
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0271`.
|
Some errors have detailed explanations: E0271, E0760.
|
||||||
|
For more information about an error, try `rustc --explain E0271`.
|
||||||
|
|
Loading…
Reference in New Issue