diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs
index 253dff6f8e75c..42e272fdafb5d 100644
--- a/compiler/rustc_abi/src/lib.rs
+++ b/compiler/rustc_abi/src/lib.rs
@@ -67,12 +67,6 @@ pub use layout::{FIRST_VARIANT, FieldIdx, LayoutCalculator, LayoutCalculatorErro
#[cfg(feature = "nightly")]
pub use layout::{Layout, TyAbiInterface, TyAndLayout};
-/// Requirements for a `StableHashingContext` to be used in this crate.
-/// This is a hack to allow using the `HashStable_Generic` derive macro
-/// instead of implementing everything in `rustc_middle`.
-#[cfg(feature = "nightly")]
-pub trait HashStableContext {}
-
#[derive(Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(
feature = "nightly",
diff --git a/compiler/rustc_ast/src/ast.rs b/compiler/rustc_ast/src/ast.rs
index 71ec1c5042fda..87633cade1b6a 100644
--- a/compiler/rustc_ast/src/ast.rs
+++ b/compiler/rustc_ast/src/ast.rs
@@ -31,7 +31,8 @@ use rustc_data_structures::tagged_ptr::Tag;
use rustc_macros::{Decodable, Encodable, HashStable_Generic, Walkable};
pub use rustc_span::AttrId;
use rustc_span::{
- ByteSymbol, DUMMY_SP, ErrorGuaranteed, Ident, Span, Spanned, Symbol, kw, respan, sym,
+ ByteSymbol, DUMMY_SP, ErrorGuaranteed, HashStableContext, Ident, Span, Spanned, Symbol, kw,
+ respan, sym,
};
use thin_vec::{ThinVec, thin_vec};
@@ -120,7 +121,7 @@ impl PartialEq<&[Symbol]> for Path {
}
}
-impl HashStable for Path {
+impl HashStable for Path {
fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
self.segments.len().hash_stable(hcx, hasher);
for segment in &self.segments {
diff --git a/compiler/rustc_ast/src/lib.rs b/compiler/rustc_ast/src/lib.rs
index ac3e77b0b5d6f..4178db1bfb09d 100644
--- a/compiler/rustc_ast/src/lib.rs
+++ b/compiler/rustc_ast/src/lib.rs
@@ -36,8 +36,3 @@ pub mod visit;
pub use self::ast::*;
pub use self::ast_traits::{AstNodeWrapper, HasAttrs, HasNodeId, HasTokens};
-
-/// Requirements for a `StableHashingContext` to be used in this crate.
-/// This is a hack to allow using the `HashStable_Generic` derive macro
-/// instead of implementing everything in `rustc_middle`.
-pub trait HashStableContext: rustc_span::HashStableContext {}
diff --git a/compiler/rustc_ast/src/tokenstream.rs b/compiler/rustc_ast/src/tokenstream.rs
index 8953391ac58bf..06bd6f03e9350 100644
--- a/compiler/rustc_ast/src/tokenstream.rs
+++ b/compiler/rustc_ast/src/tokenstream.rs
@@ -14,7 +14,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_data_structures::sync;
use rustc_macros::{Decodable, Encodable, HashStable_Generic, Walkable};
use rustc_serialize::{Decodable, Encodable};
-use rustc_span::{DUMMY_SP, Span, SpanDecoder, SpanEncoder, Symbol, sym};
+use rustc_span::{DUMMY_SP, HashStableContext, Span, SpanDecoder, SpanEncoder, Symbol, sym};
use thin_vec::ThinVec;
use crate::ast::AttrStyle;
@@ -826,7 +826,7 @@ impl FromIterator for TokenStream {
impl HashStable for TokenStream
where
- Hcx: crate::HashStableContext,
+ Hcx: HashStableContext,
{
fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
for sub_tt in self.iter() {
diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs
index e02c4ae6ea695..80d939a25701e 100644
--- a/compiler/rustc_codegen_llvm/src/context.rs
+++ b/compiler/rustc_codegen_llvm/src/context.rs
@@ -1134,11 +1134,7 @@ impl<'tcx> FnAbiOfHelpers<'tcx> for CodegenCx<'_, 'tcx> {
fn_abi_request: FnAbiRequest<'tcx>,
) -> ! {
match err {
- FnAbiError::Layout(
- LayoutError::SizeOverflow(_)
- | LayoutError::Cycle(_)
- | LayoutError::InvalidSimd { .. },
- ) => {
+ FnAbiError::Layout(LayoutError::SizeOverflow(_) | LayoutError::InvalidSimd { .. }) => {
self.tcx.dcx().emit_fatal(Spanned { span, node: err });
}
_ => match fn_abi_request {
diff --git a/compiler/rustc_const_eval/src/interpret/eval_context.rs b/compiler/rustc_const_eval/src/interpret/eval_context.rs
index 0bfe012bfe7a4..04f0e7099d840 100644
--- a/compiler/rustc_const_eval/src/interpret/eval_context.rs
+++ b/compiler/rustc_const_eval/src/interpret/eval_context.rs
@@ -107,8 +107,7 @@ impl<'tcx, M: Machine<'tcx>> LayoutOfHelpers<'tcx> for InterpCx<'tcx, M> {
| LayoutError::SizeOverflow(_)
| LayoutError::InvalidSimd { .. }
| LayoutError::TooGeneric(_)
- | LayoutError::ReferencesError(_)
- | LayoutError::Cycle(_) => {}
+ | LayoutError::ReferencesError(_) => {}
}
err_inval!(Layout(err))
}
diff --git a/compiler/rustc_hir/src/def.rs b/compiler/rustc_hir/src/def.rs
index 78bd709dd4844..cae8bb89233b2 100644
--- a/compiler/rustc_hir/src/def.rs
+++ b/compiler/rustc_hir/src/def.rs
@@ -8,9 +8,9 @@ use rustc_data_structures::stable_hasher::ToStableHashKey;
use rustc_data_structures::unord::UnordMap;
use rustc_error_messages::{DiagArgValue, IntoDiagArg};
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
-use rustc_span::Symbol;
use rustc_span::def_id::{DefId, LocalDefId};
use rustc_span::hygiene::MacroKind;
+use rustc_span::{HashStableContext, Symbol};
use crate::definitions::DefPathData;
use crate::hir;
@@ -712,7 +712,7 @@ impl IntoDiagArg for Namespace {
}
}
-impl ToStableHashKey for Namespace {
+impl ToStableHashKey for Namespace {
type KeyType = Namespace;
#[inline]
diff --git a/compiler/rustc_hir/src/lib.rs b/compiler/rustc_hir/src/lib.rs
index 9c2fec8677854..c2d9f879cd601 100644
--- a/compiler/rustc_hir/src/lib.rs
+++ b/compiler/rustc_hir/src/lib.rs
@@ -43,7 +43,6 @@ pub use hir::*;
pub use lang_items::{LangItem, LanguageItems};
pub use rustc_ast::attr::version::*;
pub use stability::*;
-pub use stable_hash_impls::HashStableContext;
pub use target::{MethodKind, Target};
arena_types!(rustc_arena::declare_arena);
diff --git a/compiler/rustc_hir/src/stable_hash_impls.rs b/compiler/rustc_hir/src/stable_hash_impls.rs
index 58649a694880b..a157fc0ccbb0c 100644
--- a/compiler/rustc_hir/src/stable_hash_impls.rs
+++ b/compiler/rustc_hir/src/stable_hash_impls.rs
@@ -1,4 +1,5 @@
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
+use rustc_span::HashStableContext;
use rustc_span::def_id::DefPathHash;
use crate::HashIgnoredAttrId;
@@ -8,53 +9,48 @@ use crate::hir::{
use crate::hir_id::ItemLocalId;
use crate::lints::DelayedLints;
-/// Requirements for a `StableHashingContext` to be used in this crate.
-/// This is a hack to allow using the `HashStable_Generic` derive macro
-/// instead of implementing everything in `rustc_middle`.
-pub trait HashStableContext: rustc_ast::HashStableContext + rustc_abi::HashStableContext {}
-
-impl ToStableHashKey for BodyId {
+impl ToStableHashKey for BodyId {
type KeyType = (DefPathHash, ItemLocalId);
#[inline]
- fn to_stable_hash_key(&self, hcx: &HirCtx) -> (DefPathHash, ItemLocalId) {
+ fn to_stable_hash_key(&self, hcx: &Hcx) -> (DefPathHash, ItemLocalId) {
let BodyId { hir_id } = *self;
hir_id.to_stable_hash_key(hcx)
}
}
-impl ToStableHashKey for ItemId {
+impl ToStableHashKey for ItemId {
type KeyType = DefPathHash;
#[inline]
- fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash {
+ fn to_stable_hash_key(&self, hcx: &Hcx) -> DefPathHash {
self.owner_id.def_id.to_stable_hash_key(hcx)
}
}
-impl ToStableHashKey for TraitItemId {
+impl ToStableHashKey for TraitItemId {
type KeyType = DefPathHash;
#[inline]
- fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash {
+ fn to_stable_hash_key(&self, hcx: &Hcx) -> DefPathHash {
self.owner_id.def_id.to_stable_hash_key(hcx)
}
}
-impl ToStableHashKey for ImplItemId {
+impl ToStableHashKey for ImplItemId {
type KeyType = DefPathHash;
#[inline]
- fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash {
+ fn to_stable_hash_key(&self, hcx: &Hcx) -> DefPathHash {
self.owner_id.def_id.to_stable_hash_key(hcx)
}
}
-impl ToStableHashKey for ForeignItemId {
+impl ToStableHashKey for ForeignItemId {
type KeyType = DefPathHash;
#[inline]
- fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash {
+ fn to_stable_hash_key(&self, hcx: &Hcx) -> DefPathHash {
self.owner_id.def_id.to_stable_hash_key(hcx)
}
}
@@ -66,8 +62,8 @@ impl ToStableHashKey for ForeignItemId
// want to pick up on a reference changing its target, so we hash the NodeIds
// in "DefPath Mode".
-impl<'tcx, HirCtx: crate::HashStableContext> HashStable for OwnerNodes<'tcx> {
- fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
+impl<'tcx, Hcx: HashStableContext> HashStable for OwnerNodes<'tcx> {
+ fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
// We ignore the `nodes` and `bodies` fields since these refer to information included in
// `hash` which is hashed in the collector and used for the crate hash.
// `local_id_to_def_id` is also ignored because is dependent on the body, then just hashing
@@ -78,15 +74,15 @@ impl<'tcx, HirCtx: crate::HashStableContext> HashStable for OwnerNodes<'
}
}
-impl HashStable for DelayedLints {
- fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
+impl HashStable for DelayedLints {
+ fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
let DelayedLints { opt_hash, .. } = *self;
opt_hash.unwrap().hash_stable(hcx, hasher);
}
}
-impl<'tcx, HirCtx: crate::HashStableContext> HashStable for AttributeMap<'tcx> {
- fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
+impl<'tcx, Hcx: HashStableContext> HashStable for AttributeMap<'tcx> {
+ fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
// We ignore the `map` since it refers to information included in `opt_hash` which is
// hashed in the collector and used for the crate hash.
let AttributeMap { opt_hash, define_opaque: _, map: _ } = *self;
@@ -94,8 +90,8 @@ impl<'tcx, HirCtx: crate::HashStableContext> HashStable for AttributeMap
}
}
-impl HashStable for HashIgnoredAttrId {
- fn hash_stable(&self, _hcx: &mut HirCtx, _hasher: &mut StableHasher) {
+impl HashStable for HashIgnoredAttrId {
+ fn hash_stable(&self, _hcx: &mut Hcx, _hasher: &mut StableHasher) {
/* we don't hash HashIgnoredAttrId, we ignore them */
}
}
diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/cmse.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/cmse.rs
index 58c296d92c24e..a1b169c6a1661 100644
--- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/cmse.rs
+++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/cmse.rs
@@ -194,8 +194,7 @@ fn should_emit_layout_error<'tcx>(abi: ExternAbi, layout_err: &'tcx LayoutError<
| SizeOverflow(..)
| InvalidSimd { .. }
| NormalizationFailure(..)
- | ReferencesError(..)
- | Cycle(..) => {
+ | ReferencesError(..) => {
false // not our job to report these
}
}
diff --git a/compiler/rustc_hir_id/src/lib.rs b/compiler/rustc_hir_id/src/lib.rs
index ffff3f979f9e3..064ce4ed4cafe 100644
--- a/compiler/rustc_hir_id/src/lib.rs
+++ b/compiler/rustc_hir_id/src/lib.rs
@@ -8,7 +8,7 @@ use std::fmt::{self, Debug};
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableOrd, ToStableHashKey};
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
-pub use rustc_span::HashStableContext;
+use rustc_span::HashStableContext;
use rustc_span::def_id::{CRATE_DEF_ID, DefId, DefIndex, DefPathHash, LocalDefId};
#[derive(Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)]
@@ -176,7 +176,7 @@ pub const CRATE_HIR_ID: HirId =
pub const CRATE_OWNER_ID: OwnerId = OwnerId { def_id: CRATE_DEF_ID };
-impl ToStableHashKey for HirId {
+impl ToStableHashKey for HirId {
type KeyType = (DefPathHash, ItemLocalId);
#[inline]
diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs
index af1d1854fa5a0..1c86d553f9b6a 100644
--- a/compiler/rustc_lint_defs/src/lib.rs
+++ b/compiler/rustc_lint_defs/src/lib.rs
@@ -8,11 +8,11 @@ use rustc_data_structures::stable_hasher::{
HashStable, StableCompare, StableHasher, ToStableHashKey,
};
use rustc_error_messages::{DiagArgValue, IntoDiagArg};
-use rustc_hir_id::{HashStableContext, HirId, ItemLocalId};
+use rustc_hir_id::{HirId, ItemLocalId};
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
use rustc_span::def_id::DefPathHash;
pub use rustc_span::edition::Edition;
-use rustc_span::{Ident, Span, Symbol, sym};
+use rustc_span::{HashStableContext, Ident, Span, Symbol, sym};
use serde::{Deserialize, Serialize};
pub use self::Level::*;
diff --git a/compiler/rustc_macros/src/hash_stable.rs b/compiler/rustc_macros/src/hash_stable.rs
index fa67adb406ed2..adb93e375c32c 100644
--- a/compiler/rustc_macros/src/hash_stable.rs
+++ b/compiler/rustc_macros/src/hash_stable.rs
@@ -84,7 +84,7 @@ fn hash_stable_derive_with_mode(
match mode {
HashStableMode::Normal => {}
HashStableMode::Generic => {
- s.add_where_predicate(parse_quote! { __CTX: crate::HashStableContext });
+ s.add_where_predicate(parse_quote! { __CTX: ::rustc_span::HashStableContext });
}
HashStableMode::NoContext => {}
}
diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs
index ad56e462d2934..814b333cfb0f8 100644
--- a/compiler/rustc_middle/src/hir/mod.rs
+++ b/compiler/rustc_middle/src/hir/mod.rs
@@ -21,7 +21,7 @@ use rustc_hir::lints::DelayedLint;
use rustc_hir::*;
use rustc_index::IndexVec;
use rustc_macros::{Decodable, Encodable, HashStable};
-use rustc_span::{ErrorGuaranteed, ExpnId, Span};
+use rustc_span::{ErrorGuaranteed, ExpnId, HashStableContext, Span};
use crate::query::Providers;
use crate::ty::{ResolverAstLowering, TyCtxt};
@@ -77,8 +77,8 @@ impl<'hir> Crate<'hir> {
}
}
-impl HashStable for Crate<'_> {
- fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) {
+impl HashStable for Crate<'_> {
+ fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
let Crate { opt_hir_hash, .. } = self;
opt_hir_hash.unwrap().hash_stable(hcx, hasher)
}
diff --git a/compiler/rustc_middle/src/ich/hcx.rs b/compiler/rustc_middle/src/ich/hcx.rs
index 2e118dc3359fa..0e1cee2970f71 100644
--- a/compiler/rustc_middle/src/ich/hcx.rs
+++ b/compiler/rustc_middle/src/ich/hcx.rs
@@ -6,7 +6,7 @@ use rustc_hir::definitions::DefPathHash;
use rustc_session::Session;
use rustc_session::cstore::Untracked;
use rustc_span::source_map::SourceMap;
-use rustc_span::{CachingSourceMapView, DUMMY_SP, Pos, Span};
+use rustc_span::{CachingSourceMapView, DUMMY_SP, HashStableContext, Pos, Span};
// Very often, we are hashing something that does not need the `CachingSourceMapView`, so we
// initialize it lazily.
@@ -73,7 +73,7 @@ impl<'a> StableHashingContext<'a> {
}
}
-impl<'a> rustc_span::HashStableContext for StableHashingContext<'a> {
+impl<'a> HashStableContext for StableHashingContext<'a> {
/// Hashes a span in a stable way. We can't directly hash the span's `BytePos` fields (that
/// would be similar to hashing pointers, since those are just offsets into the `SourceMap`).
/// Instead, we hash the (file name, line, column) triple, which stays the same even if the
@@ -189,8 +189,3 @@ impl<'a> rustc_span::HashStableContext for StableHashingContext<'a> {
);
}
}
-
-impl<'a> rustc_abi::HashStableContext for StableHashingContext<'a> {}
-impl<'a> rustc_ast::HashStableContext for StableHashingContext<'a> {}
-impl<'a> rustc_hir::HashStableContext for StableHashingContext<'a> {}
-impl<'a> rustc_session::HashStableContext for StableHashingContext<'a> {}
diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs
index 4ca51c078bef5..46682abc823d8 100644
--- a/compiler/rustc_middle/src/ty/layout.rs
+++ b/compiler/rustc_middle/src/ty/layout.rs
@@ -260,8 +260,6 @@ pub enum LayoutError<'tcx> {
NormalizationFailure(Ty<'tcx>, NormalizationError<'tcx>),
/// A non-layout error is reported elsewhere.
ReferencesError(ErrorGuaranteed),
- /// A type has cyclic layout, i.e. the type contains itself without indirection.
- Cycle(ErrorGuaranteed),
}
impl<'tcx> fmt::Display for LayoutError<'tcx> {
@@ -286,7 +284,6 @@ impl<'tcx> fmt::Display for LayoutError<'tcx> {
t,
e.get_type_for_failure()
),
- LayoutError::Cycle(_) => write!(f, "a cycle occurred during layout computation"),
LayoutError::ReferencesError(_) => write!(f, "the type has an unknown layout"),
}
}
@@ -358,8 +355,7 @@ impl<'tcx> SizeSkeleton<'tcx> {
Err(err @ LayoutError::TooGeneric(_)) => err,
// We can't extract SizeSkeleton info from other layout errors
Err(
- e @ LayoutError::Cycle(_)
- | e @ LayoutError::Unknown(_)
+ e @ LayoutError::Unknown(_)
| e @ LayoutError::SizeOverflow(_)
| e @ LayoutError::InvalidSimd { .. }
| e @ LayoutError::NormalizationFailure(..)
diff --git a/compiler/rustc_middle/src/ty/region.rs b/compiler/rustc_middle/src/ty/region.rs
index a497501ef19d5..798b98c5def5c 100644
--- a/compiler/rustc_middle/src/ty/region.rs
+++ b/compiler/rustc_middle/src/ty/region.rs
@@ -291,7 +291,7 @@ impl<'tcx> Region<'tcx> {
}
ty::ReError(_) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
- flags = flags | TypeFlags::HAS_ERROR;
+ flags = flags | TypeFlags::HAS_RE_ERROR;
}
}
diff --git a/compiler/rustc_query_impl/src/handle_cycle_error.rs b/compiler/rustc_query_impl/src/handle_cycle_error.rs
index 5676669bf1c0e..22f8ac9837f6d 100644
--- a/compiler/rustc_query_impl/src/handle_cycle_error.rs
+++ b/compiler/rustc_query_impl/src/handle_cycle_error.rs
@@ -12,7 +12,6 @@ use rustc_middle::bug;
use rustc_middle::queries::{QueryVTables, TaggedQueryKey};
use rustc_middle::query::Cycle;
use rustc_middle::query::erase::erase_val;
-use rustc_middle::ty::layout::LayoutError;
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::def_id::{DefId, LocalDefId};
use rustc_span::{ErrorGuaranteed, Span};
@@ -203,8 +202,7 @@ fn layout_of<'tcx>(tcx: TyCtxt<'tcx>, cycle: Cycle<'tcx>) -> &'tcx ty::layout::L
|| create_cycle_error(tcx, &cycle),
);
- let guar = diag.emit();
- tcx.arena.alloc(LayoutError::Cycle(guar))
+ diag.emit().raise_fatal()
}
// item_and_field_ids should form a cycle where each field contains the
diff --git a/compiler/rustc_resolve/src/def_collector.rs b/compiler/rustc_resolve/src/def_collector.rs
index de36f01b6d0e5..0acc42a6efbe1 100644
--- a/compiler/rustc_resolve/src/def_collector.rs
+++ b/compiler/rustc_resolve/src/def_collector.rs
@@ -209,12 +209,15 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
fn visit_fn(&mut self, fn_kind: FnKind<'a>, _: &AttrVec, span: Span, _: NodeId) {
match fn_kind {
FnKind::Fn(
- _ctxt,
+ ctxt,
_vis,
Fn {
sig: FnSig { header, decl, span: _ }, ident, generics, contract, body, ..
},
- ) if let Some(coroutine_kind) = header.coroutine_kind => {
+ ) if let Some(coroutine_kind) = header.coroutine_kind
+ // Foreign ones are denied, so don't create them here.
+ && ctxt != visit::FnCtxt::Foreign =>
+ {
self.visit_ident(ident);
self.visit_fn_header(header);
self.visit_generics(generics);
diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs
index e37247d7dd837..1e95482a8c7e6 100644
--- a/compiler/rustc_session/src/config.rs
+++ b/compiler/rustc_session/src/config.rs
@@ -23,7 +23,8 @@ use rustc_macros::{BlobDecodable, Decodable, Encodable, HashStable_Generic};
use rustc_span::edition::{DEFAULT_EDITION, EDITION_NAME_LIST, Edition, LATEST_STABLE_EDITION};
use rustc_span::source_map::FilePathMapping;
use rustc_span::{
- FileName, RealFileName, RemapPathScopeComponents, SourceFileHashAlgorithm, Symbol, sym,
+ FileName, HashStableContext, RealFileName, RemapPathScopeComponents, SourceFileHashAlgorithm,
+ Symbol, sym,
};
use rustc_target::spec::{
FramePointer, LinkSelfContainedComponents, LinkerFeatures, PanicStrategy, SplitDebuginfo,
@@ -38,7 +39,7 @@ use crate::errors::FileWriteFail;
pub use crate::options::*;
use crate::search_paths::SearchPath;
use crate::utils::CanonicalizedPath;
-use crate::{EarlyDiagCtxt, HashStableContext, Session, filesearch, lint};
+use crate::{EarlyDiagCtxt, Session, filesearch, lint};
mod cfg;
mod externs;
diff --git a/compiler/rustc_session/src/lib.rs b/compiler/rustc_session/src/lib.rs
index 1741dde90f5cf..04e12f1afce68 100644
--- a/compiler/rustc_session/src/lib.rs
+++ b/compiler/rustc_session/src/lib.rs
@@ -11,30 +11,21 @@
#![recursion_limit = "256"]
// tidy-alphabetical-end
-pub mod errors;
-
-pub mod utils;
+pub use getopts;
pub use lint::{declare_lint, declare_lint_pass, declare_tool_lint, impl_lint_pass};
pub use rustc_lint_defs as lint;
-pub mod parse;
+pub use session::*;
pub mod code_stats;
+pub mod errors;
+pub mod parse;
+pub mod utils;
#[macro_use]
pub mod config;
pub mod cstore;
pub mod filesearch;
mod macros;
mod options;
+pub mod output;
pub mod search_paths;
-
mod session;
-pub use session::*;
-
-pub mod output;
-
-pub use getopts;
-
-/// Requirements for a `StableHashingContext` to be used in this crate.
-/// This is a hack to allow using the `HashStable_Generic` derive macro
-/// instead of implementing everything in `rustc_middle`.
-pub trait HashStableContext: rustc_ast::HashStableContext + rustc_hir::HashStableContext {}
diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs
index 6794ffb311e32..97de708290fb4 100644
--- a/compiler/rustc_span/src/lib.rs
+++ b/compiler/rustc_span/src/lib.rs
@@ -2796,10 +2796,10 @@ impl InnerSpan {
}
}
-/// Requirements for a `StableHashingContext` to be used in this crate.
-///
-/// This is a hack to allow using the [`HashStable_Generic`] derive macro
-/// instead of implementing everything in rustc_middle.
+/// This trait lets `HashStable` and `derive(HashStable_Generic)` be used in
+/// this crate (and other crates upstream of `rustc_middle`), while leaving
+/// certain operations to be defined in `rustc_middle` where more things are
+/// visible.
pub trait HashStableContext {
/// The main event: stable hashing of a span.
fn span_hash_stable(&mut self, span: Span, hasher: &mut StableHasher);
diff --git a/compiler/rustc_target/src/lib.rs b/compiler/rustc_target/src/lib.rs
index 1dc62cb3659cc..d46802bf45d1a 100644
--- a/compiler/rustc_target/src/lib.rs
+++ b/compiler/rustc_target/src/lib.rs
@@ -24,8 +24,6 @@ pub mod target_features;
#[cfg(test)]
mod tests;
-use rustc_abi::HashStableContext;
-
/// The name of rustc's own place to organize libraries.
///
/// Used to be `rustc`, now the default is `rustlib`.
diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs
index 3df5c9e33438a..72d3ba9629f4d 100644
--- a/compiler/rustc_trait_selection/src/traits/project.rs
+++ b/compiler/rustc_trait_selection/src/traits/project.rs
@@ -659,7 +659,9 @@ fn project<'cx, 'tcx>(
)));
}
- if let Err(guar) = obligation.predicate.error_reported() {
+ // We can still compute a projection type when there are only region errors,
+ // but type/const errors require early return.
+ if let Err(guar) = obligation.predicate.non_region_error_reported() {
return Ok(Projected::Progress(Progress::error_for_term(
selcx.tcx(),
obligation.predicate,
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs
index 1202ed2384315..1bfe6e94cc3b6 100644
--- a/compiler/rustc_transmute/src/layout/tree.rs
+++ b/compiler/rustc_transmute/src/layout/tree.rs
@@ -282,7 +282,6 @@ pub(crate) mod rustc {
| LayoutError::InvalidSimd { .. }
| LayoutError::NormalizationFailure(..) => Self::UnknownLayout,
LayoutError::SizeOverflow(..) => Self::SizeOverflow,
- LayoutError::Cycle(err) => Self::TypeError(*err),
}
}
}
diff --git a/compiler/rustc_type_ir/src/flags.rs b/compiler/rustc_type_ir/src/flags.rs
index 6962a7ab1d727..f311298119649 100644
--- a/compiler/rustc_type_ir/src/flags.rs
+++ b/compiler/rustc_type_ir/src/flags.rs
@@ -91,19 +91,24 @@ bitflags::bitflags! {
| TypeFlags::HAS_TY_INHERENT.bits()
| TypeFlags::HAS_CT_PROJECTION.bits();
+ /// Is a type or const error reachable?
+ const HAS_NON_REGION_ERROR = 1 << 15;
+ /// Is a region error reachable?
+ const HAS_RE_ERROR = 1 << 16;
/// Is an error type/lifetime/const reachable?
- const HAS_ERROR = 1 << 15;
+ const HAS_ERROR = TypeFlags::HAS_NON_REGION_ERROR.bits()
+ | TypeFlags::HAS_RE_ERROR.bits();
/// Does this have any region that "appears free" in the type?
/// Basically anything but `ReBound` and `ReErased`.
- const HAS_FREE_REGIONS = 1 << 16;
+ const HAS_FREE_REGIONS = 1 << 17;
/// Does this have any `ReBound` regions?
- const HAS_RE_BOUND = 1 << 17;
+ const HAS_RE_BOUND = 1 << 18;
/// Does this have any `Bound` types?
- const HAS_TY_BOUND = 1 << 18;
+ const HAS_TY_BOUND = 1 << 19;
/// Does this have any `ConstKind::Bound` consts?
- const HAS_CT_BOUND = 1 << 19;
+ const HAS_CT_BOUND = 1 << 20;
/// Does this have any bound variables?
/// Used to check if a global bound is safe to evaluate.
const HAS_BOUND_VARS = TypeFlags::HAS_RE_BOUND.bits()
@@ -111,7 +116,7 @@ bitflags::bitflags! {
| TypeFlags::HAS_CT_BOUND.bits();
/// Does this have any `ReErased` regions?
- const HAS_RE_ERASED = 1 << 20;
+ const HAS_RE_ERASED = 1 << 21;
/// Does this value have parameters/placeholders/inference variables which could be
/// replaced later, in a way that would change the results of `impl` specialization?
@@ -123,19 +128,19 @@ bitflags::bitflags! {
| TypeFlags::HAS_CT_INFER.bits();
/// Does this value have `InferTy::FreshTy/FreshIntTy/FreshFloatTy`?
- const HAS_TY_FRESH = 1 << 21;
+ const HAS_TY_FRESH = 1 << 22;
/// Does this value have `InferConst::Fresh`?
- const HAS_CT_FRESH = 1 << 22;
+ const HAS_CT_FRESH = 1 << 23;
/// Does this have any binders with bound vars (e.g. that need to be anonymized)?
- const HAS_BINDER_VARS = 1 << 23;
+ const HAS_BINDER_VARS = 1 << 24;
/// Does this type have any coroutines in it?
- const HAS_TY_CORO = 1 << 24;
+ const HAS_TY_CORO = 1 << 25;
/// Does this have have a `Bound(BoundVarIndexKind::Canonical, _)`?
- const HAS_CANONICAL_BOUND = 1 << 25;
+ const HAS_CANONICAL_BOUND = 1 << 26;
}
}
@@ -240,7 +245,7 @@ impl FlagComputation {
| ty::Str
| ty::Foreign(..) => {}
- ty::Error(_) => self.add_flags(TypeFlags::HAS_ERROR),
+ ty::Error(_) => self.add_flags(TypeFlags::HAS_NON_REGION_ERROR),
ty::Param(_) => {
self.add_flags(TypeFlags::HAS_TY_PARAM);
@@ -489,7 +494,7 @@ impl FlagComputation {
}
}
ty::ConstKind::Expr(e) => self.add_args(e.args().as_slice()),
- ty::ConstKind::Error(_) => self.add_flags(TypeFlags::HAS_ERROR),
+ ty::ConstKind::Error(_) => self.add_flags(TypeFlags::HAS_NON_REGION_ERROR),
}
}
diff --git a/compiler/rustc_type_ir/src/visit.rs b/compiler/rustc_type_ir/src/visit.rs
index 1ee4bff6b7a11..cfb4588965368 100644
--- a/compiler/rustc_type_ir/src/visit.rs
+++ b/compiler/rustc_type_ir/src/visit.rs
@@ -279,6 +279,8 @@ pub trait TypeVisitableExt: TypeVisitable {
fn error_reported(&self) -> Result<(), I::ErrorGuaranteed>;
+ fn non_region_error_reported(&self) -> Result<(), I::ErrorGuaranteed>;
+
fn has_non_region_param(&self) -> bool {
self.has_type_flags(TypeFlags::HAS_PARAM - TypeFlags::HAS_RE_PARAM)
}
@@ -352,6 +354,11 @@ pub trait TypeVisitableExt: TypeVisitable {
fn still_further_specializable(&self) -> bool {
self.has_type_flags(TypeFlags::STILL_FURTHER_SPECIALIZABLE)
}
+
+ /// True if a type or const error is reachable
+ fn has_non_region_error(&self) -> bool {
+ self.has_type_flags(TypeFlags::HAS_NON_REGION_ERROR)
+ }
}
impl> TypeVisitableExt for T {
@@ -376,6 +383,18 @@ impl> TypeVisitableExt for T {
Ok(())
}
}
+
+ fn non_region_error_reported(&self) -> Result<(), I::ErrorGuaranteed> {
+ if self.has_non_region_error() {
+ if let ControlFlow::Break(guar) = self.visit_with(&mut HasErrorVisitor) {
+ Err(guar)
+ } else {
+ panic!("type flags said there was an non region error, but now there is not")
+ }
+ } else {
+ Ok(())
+ }
+ }
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs
index e0750f0784458..312295154dc52 100644
--- a/library/core/src/lib.rs
+++ b/library/core/src/lib.rs
@@ -236,6 +236,8 @@ pub mod autodiff {
#[unstable(feature = "contracts", issue = "128044")]
pub mod contracts;
+#[unstable(feature = "derive_macro_global_path", issue = "154645")]
+pub use crate::macros::builtin::derive;
#[stable(feature = "cfg_select", since = "1.95.0")]
pub use crate::macros::cfg_select;
diff --git a/library/core/src/macros/mod.rs b/library/core/src/macros/mod.rs
index 7f35e94d3df30..33397e56b86c5 100644
--- a/library/core/src/macros/mod.rs
+++ b/library/core/src/macros/mod.rs
@@ -1720,7 +1720,7 @@ pub(crate) mod builtin {
///
/// See [the reference] for more info.
///
- /// [the reference]: ../../../reference/attributes/derive.html
+ /// [the reference]: ../reference/attributes/derive.html
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_builtin_macro]
pub macro derive($item:item) {
diff --git a/library/core/src/prelude/v1.rs b/library/core/src/prelude/v1.rs
index f2eb047d342bc..6122ab12ec351 100644
--- a/library/core/src/prelude/v1.rs
+++ b/library/core/src/prelude/v1.rs
@@ -120,9 +120,13 @@ pub use crate::trace_macros;
// (no public module for them to be re-exported from).
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
pub use crate::macros::builtin::{
- alloc_error_handler, bench, derive, global_allocator, test, test_case,
+ alloc_error_handler, bench, global_allocator, test, test_case,
};
+#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
+#[doc(no_inline)]
+pub use crate::macros::builtin::derive;
+
#[unstable(feature = "derive_const", issue = "118304")]
pub use crate::macros::builtin::derive_const;
diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs
index 1730742dffe93..70ccd3431a2ff 100644
--- a/library/std/src/lib.rs
+++ b/library/std/src/lib.rs
@@ -706,6 +706,8 @@ pub use core::cfg_select;
reason = "`concat_bytes` is not stable enough for use and is subject to change"
)]
pub use core::concat_bytes;
+#[unstable(feature = "derive_macro_global_path", issue = "154645")]
+pub use core::derive;
#[stable(feature = "matches_macro", since = "1.42.0")]
#[allow(deprecated, deprecated_in_future)]
pub use core::matches;
diff --git a/library/std/src/prelude/v1.rs b/library/std/src/prelude/v1.rs
index ee57e031c959c..aeefec8b9e084 100644
--- a/library/std/src/prelude/v1.rs
+++ b/library/std/src/prelude/v1.rs
@@ -115,9 +115,13 @@ pub use core::prelude::v1::trace_macros;
// (no public module for them to be re-exported from).
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
pub use core::prelude::v1::{
- alloc_error_handler, bench, derive, global_allocator, test, test_case,
+ alloc_error_handler, bench, global_allocator, test, test_case,
};
+#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
+#[doc(no_inline)]
+pub use core::prelude::v1::derive;
+
#[unstable(feature = "derive_const", issue = "118304")]
pub use core::prelude::v1::derive_const;
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index ad70fc1096691..7d40bc95ec089 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -465,6 +465,15 @@ impl Item {
.unwrap_or(false)
}
+ /// Returns true if item is an associated function with a `self` parameter.
+ pub(crate) fn has_self_param(&self) -> bool {
+ if let ItemKind::MethodItem(box Function { decl, .. }, _) = &self.inner.kind {
+ decl.receiver_type().is_some()
+ } else {
+ false
+ }
+ }
+
pub(crate) fn span(&self, tcx: TyCtxt<'_>) -> Option {
let kind = match &self.kind {
ItemKind::StrippedItem(k) => k,
diff --git a/src/librustdoc/html/render/sidebar.rs b/src/librustdoc/html/render/sidebar.rs
index a4535792ac3ce..d40c9501cabc1 100644
--- a/src/librustdoc/html/render/sidebar.rs
+++ b/src/librustdoc/html/render/sidebar.rs
@@ -433,6 +433,7 @@ fn sidebar_assoc_items<'a>(
let mut assoc_consts = Vec::new();
let mut assoc_types = Vec::new();
+ let mut assoc_fns = Vec::new();
let mut methods = Vec::new();
if let Some(v) = cache.impls.get(&did) {
let mut used_links = FxHashSet::default();
@@ -443,7 +444,12 @@ fn sidebar_assoc_items<'a>(
for impl_ in v.iter().map(|i| i.inner_impl()).filter(|i| i.trait_.is_none()) {
assoc_consts.extend(get_associated_constants(impl_, used_links_bor));
assoc_types.extend(get_associated_types(impl_, used_links_bor));
- methods.extend(get_methods(impl_, false, used_links_bor, false, cx.tcx()));
+ methods.extend(get_methods(
+ impl_,
+ GetMethodsMode::AlsoCollectAssocFns { assoc_fns: &mut assoc_fns },
+ used_links_bor,
+ cx.tcx(),
+ ));
}
// We want links' order to be reproducible so we don't use unstable sort.
assoc_consts.sort();
@@ -462,6 +468,11 @@ fn sidebar_assoc_items<'a>(
"associatedtype",
assoc_types,
),
+ LinkBlock::new(
+ Link::new("implementations", "Associated Functions"),
+ "method",
+ assoc_fns,
+ ),
LinkBlock::new(Link::new("implementations", "Methods"), "method", methods),
];
@@ -546,7 +557,15 @@ fn sidebar_deref_methods<'a>(
i.inner_impl().trait_.is_none()
&& real_target.is_doc_subtype_of(&i.inner_impl().for_, c)
})
- .flat_map(|i| get_methods(i.inner_impl(), true, used_links, deref_mut, cx.tcx()))
+ .flat_map(|i| {
+ get_methods(
+ i.inner_impl(),
+ GetMethodsMode::Deref { deref_mut },
+ used_links,
+ cx.tcx(),
+ )
+ .collect::>()
+ })
.collect::>();
if !ret.is_empty() {
let id = if let Some(target_def_id) = real_target.def_id(c) {
@@ -734,69 +753,82 @@ fn get_next_url(used_links: &mut FxHashSet, url: String) -> String {
format!("{url}-{add}")
}
+enum GetMethodsMode<'r, 'l> {
+ Deref { deref_mut: bool },
+ AlsoCollectAssocFns { assoc_fns: &'r mut Vec> },
+}
+
fn get_methods<'a>(
i: &'a clean::Impl,
- for_deref: bool,
+ mut mode: GetMethodsMode<'_, 'a>,
used_links: &mut FxHashSet,
- deref_mut: bool,
tcx: TyCtxt<'_>,
-) -> Vec> {
- i.items
- .iter()
- .filter_map(|item| {
- if let Some(ref name) = item.name
- && item.is_method()
- && (!for_deref || super::should_render_item(item, deref_mut, tcx))
- {
- Some(Link::new(
+) -> impl Iterator> {
+ i.items.iter().filter_map(move |item| {
+ if let Some(ref name) = item.name
+ && item.is_method()
+ {
+ let mut build_link = || {
+ Link::new(
get_next_url(used_links, format!("{typ}.{name}", typ = ItemType::Method)),
name.as_str(),
- ))
- } else {
- None
+ )
+ };
+ match &mut mode {
+ &mut GetMethodsMode::Deref { deref_mut } => {
+ if super::should_render_item(item, deref_mut, tcx) {
+ Some(build_link())
+ } else {
+ None
+ }
+ }
+ GetMethodsMode::AlsoCollectAssocFns { assoc_fns } => {
+ if item.has_self_param() {
+ Some(build_link())
+ } else {
+ assoc_fns.push(build_link());
+ None
+ }
+ }
}
- })
- .collect()
+ } else {
+ None
+ }
+ })
}
fn get_associated_constants<'a>(
i: &'a clean::Impl,
used_links: &mut FxHashSet,
-) -> Vec> {
- i.items
- .iter()
- .filter_map(|item| {
- if let Some(ref name) = item.name
- && item.is_associated_const()
- {
- Some(Link::new(
- get_next_url(used_links, format!("{typ}.{name}", typ = ItemType::AssocConst)),
- name.as_str(),
- ))
- } else {
- None
- }
- })
- .collect()
+) -> impl Iterator> {
+ i.items.iter().filter_map(|item| {
+ if let Some(ref name) = item.name
+ && item.is_associated_const()
+ {
+ Some(Link::new(
+ get_next_url(used_links, format!("{typ}.{name}", typ = ItemType::AssocConst)),
+ name.as_str(),
+ ))
+ } else {
+ None
+ }
+ })
}
fn get_associated_types<'a>(
i: &'a clean::Impl,
used_links: &mut FxHashSet,
-) -> Vec> {
- i.items
- .iter()
- .filter_map(|item| {
- if let Some(ref name) = item.name
- && item.is_associated_type()
- {
- Some(Link::new(
- get_next_url(used_links, format!("{typ}.{name}", typ = ItemType::AssocType)),
- name.as_str(),
- ))
- } else {
- None
- }
- })
- .collect()
+) -> impl Iterator> {
+ i.items.iter().filter_map(|item| {
+ if let Some(ref name) = item.name
+ && item.is_associated_type()
+ {
+ Some(Link::new(
+ get_next_url(used_links, format!("{typ}.{name}", typ = ItemType::AssocType)),
+ name.as_str(),
+ ))
+ } else {
+ None
+ }
+ })
}
diff --git a/src/librustdoc/html/templates/type_layout.html b/src/librustdoc/html/templates/type_layout.html
index 49153d58fe98c..4d4222a34956a 100644
--- a/src/librustdoc/html/templates/type_layout.html
+++ b/src/librustdoc/html/templates/type_layout.html
@@ -60,11 +60,6 @@
{# #}
Note: Encountered an error during type layout; {#+ #}
the type failed to be normalized. {# #}
- {% when Err(LayoutError::Cycle(_)) %}
-
{# #}
- Note: Encountered an error during type layout; {#+ #}
- the type's layout depended on the type's layout itself. {# #}
-
{% when Err(LayoutError::InvalidSimd {..}) %}
{# #}
Note: Encountered an error during type layout; {#+ #}
diff --git a/src/tools/miri/src/eval.rs b/src/tools/miri/src/eval.rs
index 1e75df7d278fb..cf4f7d689ac22 100644
--- a/src/tools/miri/src/eval.rs
+++ b/src/tools/miri/src/eval.rs
@@ -10,6 +10,7 @@ use std::{iter, thread};
use rustc_abi::ExternAbi;
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
+use rustc_errors::FatalErrorMarker;
use rustc_hir::def::Namespace;
use rustc_hir::def_id::DefId;
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, LayoutCx};
@@ -477,7 +478,11 @@ pub fn eval_entry<'tcx>(
let res: thread::Result> =
panic::catch_unwind(AssertUnwindSafe(|| ecx.run_threads()));
let res = res.unwrap_or_else(|panic_payload| {
- ecx.handle_ice();
+ // rustc "handles" some errors by unwinding with FatalErrorMarker
+ // (after emitting suitable diagnostics), so do not treat those as ICEs.
+ if !panic_payload.is::() {
+ ecx.handle_ice();
+ }
panic::resume_unwind(panic_payload)
});
// Obtain the result of the execution. This is always an `Err`, but that doesn't necessarily
diff --git a/src/tools/miri/tests/fail/layout_cycle.rs b/src/tools/miri/tests/fail/layout_cycle.rs
index 3e0dd881db84e..8d5f1914d0c32 100644
--- a/src/tools/miri/tests/fail/layout_cycle.rs
+++ b/src/tools/miri/tests/fail/layout_cycle.rs
@@ -1,5 +1,4 @@
-//@error-in-other-file: a cycle occurred during layout computation
-//~^ ERROR: cycle detected when computing layout of
+//~ ERROR: cycle detected when computing layout of
use std::mem;
diff --git a/src/tools/miri/tests/fail/layout_cycle.stderr b/src/tools/miri/tests/fail/layout_cycle.stderr
index dae6934931228..f8d555e5a10b8 100644
--- a/src/tools/miri/tests/fail/layout_cycle.stderr
+++ b/src/tools/miri/tests/fail/layout_cycle.stderr
@@ -9,13 +9,6 @@ LL | const SIZE: usize = intrinsics::size_of::();
| ^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
-error[E0080]: a cycle occurred during layout computation
- --> RUSTLIB/core/src/mem/mod.rs:LL:CC
- |
-LL | const SIZE: usize = intrinsics::size_of::();
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `> as std::mem::SizedTypeProperties>::SIZE` failed here
-
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
-Some errors have detailed explanations: E0080, E0391.
-For more information about an error, try `rustc --explain E0080`.
+For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/rustdoc-gui/hash-item-expansion.goml b/tests/rustdoc-gui/hash-item-expansion.goml
index a7a5c3cb48345..8661641206685 100644
--- a/tests/rustdoc-gui/hash-item-expansion.goml
+++ b/tests/rustdoc-gui/hash-item-expansion.goml
@@ -5,7 +5,7 @@ assert-attribute: ("#blanket-implementations-list > details:nth-child(2)", {"ope
// We first check that the impl block is open by default.
assert-attribute: ("#implementations-list details", {"open": ""})
// To ensure that we will click on the currently hidden method.
-assert-text: (".sidebar-elems section .block li > a", "must_use")
-click: ".sidebar-elems section .block li > a"
+assert-text: (".sidebar-elems section ul:nth-of-type(2) li > a", "must_use")
+click: ".sidebar-elems ul:nth-of-type(2) li > a"
// We check that the impl block was opened as expected so that we can see the method.
assert-attribute: ("#implementations-list > details", {"open": ""})
diff --git a/tests/rustdoc-gui/sidebar-mobile.goml b/tests/rustdoc-gui/sidebar-mobile.goml
index 3183650b555a8..61c1555fbc0e3 100644
--- a/tests/rustdoc-gui/sidebar-mobile.goml
+++ b/tests/rustdoc-gui/sidebar-mobile.goml
@@ -48,7 +48,7 @@ assert-property: ("rustdoc-topbar", {"clientHeight": "45"})
// Check that clicking an element from the sidebar scrolls to the right place
// so the target is not obscured by the topbar.
click: ".sidebar-menu-toggle"
-click: ".sidebar-elems section .block li > a"
+click: ".sidebar-elems section ul:nth-of-type(2) li > a"
assert-position: ("#method\.must_use", {"y": 45})
// Check that the bottom-most item on the sidebar menu can be scrolled fully into view.
diff --git a/tests/rustdoc-html/sidebar/sidebar-items.rs b/tests/rustdoc-html/sidebar/sidebar-items.rs
index 6e13457796e5e..bd0893dac3e36 100644
--- a/tests/rustdoc-html/sidebar/sidebar-items.rs
+++ b/tests/rustdoc-html/sidebar/sidebar-items.rs
@@ -42,6 +42,14 @@ pub struct Bar {
waza: u32,
}
+//@ has foo/struct.Bar.html
+//@ has - '//div[@class="sidebar-elems"]//h3/a[@href="#implementations"]' 'Associated Functions'
+//@ has - '//div[@class="sidebar-elems"]//h3/a[@href="#implementations"]' 'Methods'
+impl Bar {
+ pub fn method(&self) {}
+ pub fn assoc_fn() {}
+}
+
//@ has foo/enum.En.html
//@ has - '//div[@class="sidebar-elems"]//h3/a[@href="#variants"]' 'Variants'
//@ has - '//*[@class="sidebar-elems"]//section//a' 'Foo'
diff --git a/tests/rustdoc-html/typedef.rs b/tests/rustdoc-html/typedef.rs
index 3fdc2788bcacf..4eae3c7258213 100644
--- a/tests/rustdoc-html/typedef.rs
+++ b/tests/rustdoc-html/typedef.rs
@@ -13,7 +13,7 @@ impl MyStruct {
//@ has - '//*[@class="impl"]//h3[@class="code-header"]' 'impl MyTrait for MyAlias'
//@ hasraw - 'Alias docstring'
//@ has - '//*[@class="sidebar"]//*[@class="location"]' 'MyAlias'
-//@ has - '//*[@class="sidebar"]//a[@href="#implementations"]' 'Methods'
+//@ has - '//*[@class="sidebar"]//a[@href="#implementations"]' 'Associated Functions'
//@ has - '//*[@class="sidebar"]//a[@href="#trait-implementations"]' 'Trait Implementations'
/// Alias docstring
pub type MyAlias = MyStruct;
diff --git a/tests/ui/dropck/dropck-after-failed-type-lowering.rs b/tests/ui/dropck/dropck-after-failed-type-lowering.rs
index 2441e26fec96c..ee55e0dcaa491 100644
--- a/tests/ui/dropck/dropck-after-failed-type-lowering.rs
+++ b/tests/ui/dropck/dropck-after-failed-type-lowering.rs
@@ -3,11 +3,12 @@
trait B {
type C<'a>;
fn d() -> F {
+ //~^ ERROR: the trait bound `E: B` is not satisfied
todo!()
}
}
struct F {
- h: Option<::C>,
+ h: Option<::C>, //~ ERROR: the trait bound `G: B` is not satisfied
//~^ ERROR missing generics for associated type `B::C`
}
diff --git a/tests/ui/dropck/dropck-after-failed-type-lowering.stderr b/tests/ui/dropck/dropck-after-failed-type-lowering.stderr
index 56ea72de0c5f2..0922d2e4340e8 100644
--- a/tests/ui/dropck/dropck-after-failed-type-lowering.stderr
+++ b/tests/ui/dropck/dropck-after-failed-type-lowering.stderr
@@ -1,5 +1,5 @@
error[E0107]: missing generics for associated type `B::C`
- --> $DIR/dropck-after-failed-type-lowering.rs:10:25
+ --> $DIR/dropck-after-failed-type-lowering.rs:11:25
|
LL | h: Option<::C>,
| ^ expected 1 lifetime argument
@@ -14,6 +14,24 @@ help: add missing lifetime argument
LL | h: Option<::C<'a>>,
| ++++
-error: aborting due to 1 previous error
+error[E0277]: the trait bound `G: B` is not satisfied
+ --> $DIR/dropck-after-failed-type-lowering.rs:11:8
+ |
+LL | h: Option<::C>,
+ | ^^^^^^^^^^^^^^^^^^^ the trait `B` is not implemented for `G`
+ |
+help: consider restricting type parameter `G` with trait `B`
+ |
+LL | struct F {
+ | +++
+
+error[E0277]: the trait bound `E: B` is not satisfied
+ --> $DIR/dropck-after-failed-type-lowering.rs:5:18
+ |
+LL | fn d() -> F {
+ | ^^^^ the trait `B` is not implemented for `E`
+
+error: aborting due to 3 previous errors
-For more information about this error, try `rustc --explain E0107`.
+Some errors have detailed explanations: E0107, E0277.
+For more information about an error, try `rustc --explain E0107`.
diff --git a/tests/ui/extern/bad-external-async-fn-issue-146754.rs b/tests/ui/extern/bad-external-async-fn-issue-146754.rs
new file mode 100644
index 0000000000000..394341c129654
--- /dev/null
+++ b/tests/ui/extern/bad-external-async-fn-issue-146754.rs
@@ -0,0 +1,8 @@
+//@ edition:2024
+#![crate_type = "lib"]
+
+unsafe extern "C" {
+ async fn function() -> [(); || {}];
+ //~^ ERROR functions in `extern` blocks cannot have `async` qualifier
+ //~^^ ERROR mismatched types
+}
diff --git a/tests/ui/extern/bad-external-async-fn-issue-146754.stderr b/tests/ui/extern/bad-external-async-fn-issue-146754.stderr
new file mode 100644
index 0000000000000..2a04b23630430
--- /dev/null
+++ b/tests/ui/extern/bad-external-async-fn-issue-146754.stderr
@@ -0,0 +1,21 @@
+error: functions in `extern` blocks cannot have `async` qualifier
+ --> $DIR/bad-external-async-fn-issue-146754.rs:5:5
+ |
+LL | unsafe extern "C" {
+ | ----------------- in this `extern` block
+LL | async fn function() -> [(); || {}];
+ | ^^^^^ help: remove the `async` qualifier
+
+error[E0308]: mismatched types
+ --> $DIR/bad-external-async-fn-issue-146754.rs:5:33
+ |
+LL | async fn function() -> [(); || {}];
+ | ^^^^^ expected `usize`, found closure
+ |
+ = note: expected type `usize`
+ found closure `{closure@$DIR/bad-external-async-fn-issue-146754.rs:5:33: 5:35}`
+ = note: array length can only be `usize`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/imports/global-derive-path.rs b/tests/ui/imports/global-derive-path.rs
new file mode 100644
index 0000000000000..5f0a6bb86bf30
--- /dev/null
+++ b/tests/ui/imports/global-derive-path.rs
@@ -0,0 +1,10 @@
+//@ edition: 2024
+//@ check-pass
+#![crate_type = "lib"]
+#![feature(derive_macro_global_path)]
+
+#[::core::derive(Clone)]
+struct Y;
+
+#[::std::derive(Clone)]
+struct X;
diff --git a/tests/ui/layout/layout-cycle.rs b/tests/ui/layout/layout-cycle.rs
index b38bd52c6ade9..846ce0882cad1 100644
--- a/tests/ui/layout/layout-cycle.rs
+++ b/tests/ui/layout/layout-cycle.rs
@@ -1,6 +1,5 @@
//@ build-fail
//~^ ERROR: cycle detected when computing layout of
-//~? ERROR: a cycle occurred during layout computation
// Issue #111176 -- ensure that we do not emit ICE on layout cycles
diff --git a/tests/ui/layout/layout-cycle.stderr b/tests/ui/layout/layout-cycle.stderr
index e05ff614567c4..28c35d431226e 100644
--- a/tests/ui/layout/layout-cycle.stderr
+++ b/tests/ui/layout/layout-cycle.stderr
@@ -6,18 +6,6 @@ note: cycle used when const-evaluating + checking `core::mem::SizedTypePropertie
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
-error[E0080]: a cycle occurred during layout computation
- --> $SRC_DIR/core/src/mem/mod.rs:LL:COL
- |
- = note: evaluation of `> as std::mem::SizedTypeProperties>::SIZE` failed here
-
-note: the above error was encountered while instantiating `fn std::mem::size_of::>>`
- --> $DIR/layout-cycle.rs:26:5
- |
-LL | mem::size_of::>()
- | ^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
-Some errors have detailed explanations: E0080, E0391.
-For more information about an error, try `rustc --explain E0080`.
+For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/ui/layout/post-mono-layout-cycle.stderr b/tests/ui/layout/post-mono-layout-cycle.stderr
index 7f246b3d409ad..b9b1b988499e6 100644
--- a/tests/ui/layout/post-mono-layout-cycle.stderr
+++ b/tests/ui/layout/post-mono-layout-cycle.stderr
@@ -5,12 +5,6 @@ error[E0391]: cycle detected when computing layout of `Wrapper<()>`
= note: cycle used when computing layout of `core::option::Option>`
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
-note: the above error was encountered while instantiating `fn abi::<()>`
- --> $DIR/post-mono-layout-cycle.rs:19:5
- |
-LL | abi::(None);
- | ^^^^^^^^^^^^^^
-
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/ui/sized/stack-overflow-trait-infer-98842.64bit.stderr b/tests/ui/sized/stack-overflow-trait-infer-98842.64bit.stderr
deleted file mode 100644
index d097b809b5698..0000000000000
--- a/tests/ui/sized/stack-overflow-trait-infer-98842.64bit.stderr
+++ /dev/null
@@ -1,21 +0,0 @@
-error[E0391]: cycle detected when computing layout of `Foo`
- |
- = note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
- = note: ...which again requires computing layout of `Foo`, completing the cycle
-note: cycle used when const-evaluating + checking `_`
- --> $DIR/stack-overflow-trait-infer-98842.rs:14:1
- |
-LL | const _: *const Foo = 0 as _;
- | ^^^^^^^^^^^^^^^^^^^
- = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
-
-error[E0080]: a cycle occurred during layout computation
- --> $DIR/stack-overflow-trait-infer-98842.rs:14:1
- |
-LL | const _: *const Foo = 0 as _;
- | ^^^^^^^^^^^^^^^^^^^ evaluation of `_` failed here
-
-error: aborting due to 2 previous errors
-
-Some errors have detailed explanations: E0080, E0391.
-For more information about an error, try `rustc --explain E0080`.
diff --git a/tests/ui/sized/stack-overflow-trait-infer-98842.rs b/tests/ui/sized/stack-overflow-trait-infer-98842.rs
index 1c9f6c593f447..d6522e3cfb643 100644
--- a/tests/ui/sized/stack-overflow-trait-infer-98842.rs
+++ b/tests/ui/sized/stack-overflow-trait-infer-98842.rs
@@ -2,8 +2,7 @@
// issue: rust-lang/rust#98842
//@ check-fail
//@ edition:2021
-//@ stderr-per-bitwidth
-//~^^^^^ ERROR cycle detected when computing layout of `Foo`
+//~^^^^ ERROR cycle detected when computing layout of `Foo`
// If the inner `Foo` is named through an associated type,
// the "infinite size" error does not occur.
@@ -12,6 +11,5 @@ struct Foo(<&'static Foo as ::core::ops::Deref>::Target);
// and it will infinitely recurse somewhere trying to figure out the
// size of this pointer (is my guess):
const _: *const Foo = 0 as _;
-//~^ ERROR a cycle occurred during layout computation
pub fn main() {}
diff --git a/tests/ui/sized/stack-overflow-trait-infer-98842.32bit.stderr b/tests/ui/sized/stack-overflow-trait-infer-98842.stderr
similarity index 55%
rename from tests/ui/sized/stack-overflow-trait-infer-98842.32bit.stderr
rename to tests/ui/sized/stack-overflow-trait-infer-98842.stderr
index d097b809b5698..5557a6fc45b89 100644
--- a/tests/ui/sized/stack-overflow-trait-infer-98842.32bit.stderr
+++ b/tests/ui/sized/stack-overflow-trait-infer-98842.stderr
@@ -3,19 +3,12 @@ error[E0391]: cycle detected when computing layout of `Foo`
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
= note: ...which again requires computing layout of `Foo`, completing the cycle
note: cycle used when const-evaluating + checking `_`
- --> $DIR/stack-overflow-trait-infer-98842.rs:14:1
+ --> $DIR/stack-overflow-trait-infer-98842.rs:13:1
|
LL | const _: *const Foo = 0 as _;
| ^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
-error[E0080]: a cycle occurred during layout computation
- --> $DIR/stack-overflow-trait-infer-98842.rs:14:1
- |
-LL | const _: *const Foo = 0 as _;
- | ^^^^^^^^^^^^^^^^^^^ evaluation of `_` failed here
-
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
-Some errors have detailed explanations: E0080, E0391.
-For more information about an error, try `rustc --explain E0080`.
+For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/ui/unsized/thin-ptr-to-unsized-projection.rs b/tests/ui/unsized/thin-ptr-to-unsized-projection.rs
new file mode 100644
index 0000000000000..79918e6a0722d
--- /dev/null
+++ b/tests/ui/unsized/thin-ptr-to-unsized-projection.rs
@@ -0,0 +1,6 @@
+// This is a regression test for
+struct Foo<'a>(<& /*'a*/ [fn()] as core::ops::Deref>::Target); // adding the lifetime solves the ice
+ //~^ ERROR: missing lifetime specifier [E0106]
+const _: *const Foo = 0 as _;
+ //~^ ERROR: cannot cast `i32` to a pointer that is wide [E0606]
+fn main() {}
diff --git a/tests/ui/unsized/thin-ptr-to-unsized-projection.stderr b/tests/ui/unsized/thin-ptr-to-unsized-projection.stderr
new file mode 100644
index 0000000000000..256523c4a47ec
--- /dev/null
+++ b/tests/ui/unsized/thin-ptr-to-unsized-projection.stderr
@@ -0,0 +1,23 @@
+error[E0106]: missing lifetime specifier
+ --> $DIR/thin-ptr-to-unsized-projection.rs:2:17
+ |
+LL | struct Foo<'a>(<& /*'a*/ [fn()] as core::ops::Deref>::Target); // adding the lifetime solves the ice
+ | ^ expected named lifetime parameter
+ |
+help: consider using the `'a` lifetime
+ |
+LL | struct Foo<'a>(<&'a /*'a*/ [fn()] as core::ops::Deref>::Target); // adding the lifetime solves the ice
+ | ++
+
+error[E0606]: cannot cast `i32` to a pointer that is wide
+ --> $DIR/thin-ptr-to-unsized-projection.rs:4:28
+ |
+LL | const _: *const Foo = 0 as _;
+ | - ^ creating a `*const Foo<'_>` requires both an address and a length
+ | |
+ | consider casting this expression to `*const ()`, then using `core::ptr::from_raw_parts`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0106, E0606.
+For more information about an error, try `rustc --explain E0106`.