mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 23:12:02 +00:00
Auto merge of #81635 - michaelwoerister:structured_def_path_hash, r=pnkfelix
Let a portion of DefPathHash uniquely identify the DefPath's crate. This allows to directly map from a `DefPathHash` to the crate it originates from, without constructing side tables to do that mapping -- something that is useful for incremental compilation where we deal with `DefPathHash` instead of `DefId` a lot. It also allows to reliably and cheaply check for `DefPathHash` collisions which allows the compiler to gracefully abort compilation instead of running into a subsequent ICE at some random place in the code. The following new piece of documentation describes the most interesting aspects of the changes: ```rust /// A `DefPathHash` is a fixed-size representation of a `DefPath` that is /// stable across crate and compilation session boundaries. It consists of two /// separate 64-bit hashes. The first uniquely identifies the crate this /// `DefPathHash` originates from (see [StableCrateId]), and the second /// uniquely identifies the corresponding `DefPath` within that crate. Together /// they form a unique identifier within an entire crate graph. /// /// There is a very small chance of hash collisions, which would mean that two /// different `DefPath`s map to the same `DefPathHash`. Proceeding compilation /// with such a hash collision would very probably lead to an ICE and, in the /// worst case, to a silent mis-compilation. The compiler therefore actively /// and exhaustively checks for such hash collisions and aborts compilation if /// it finds one. /// /// `DefPathHash` uses 64-bit hashes for both the crate-id part and the /// crate-internal part, even though it is likely that there are many more /// `LocalDefId`s in a single crate than there are individual crates in a crate /// graph. Since we use the same number of bits in both cases, the collision /// probability for the crate-local part will be quite a bit higher (though /// still very small). /// /// This imbalance is not by accident: A hash collision in the /// crate-local part of a `DefPathHash` will be detected and reported while /// compiling the crate in question. Such a collision does not depend on /// outside factors and can be easily fixed by the crate maintainer (e.g. by /// renaming the item in question or by bumping the crate version in a harmless /// way). /// /// A collision between crate-id hashes on the other hand is harder to fix /// because it depends on the set of crates in the entire crate graph of a /// compilation session. Again, using the same crate with a different version /// number would fix the issue with a high probability -- but that might be /// easier said then done if the crates in questions are dependencies of /// third-party crates. /// /// That being said, given a high quality hash function, the collision /// probabilities in question are very small. For example, for a big crate like /// `rustc_middle` (with ~50000 `LocalDefId`s as of the time of writing) there /// is a probability of roughly 1 in 14,750,000,000 of a crate-internal /// collision occurring. For a big crate graph with 1000 crates in it, there is /// a probability of 1 in 36,890,000,000,000 of a `StableCrateId` collision. ``` Given the probabilities involved I hope that no one will ever actually see the error messages. Nonetheless, I'd be glad about some feedback on how to improve them. Should we create a GH issue describing the problem and possible solutions to point to? Or a page in the rustc book? r? `@pnkfelix` (feel free to re-assign)
This commit is contained in:
commit
76c500ec6c
@ -42,7 +42,6 @@ pub mod util {
|
||||
pub mod ast;
|
||||
pub mod ast_like;
|
||||
pub mod attr;
|
||||
pub mod crate_disambiguator;
|
||||
pub mod entry;
|
||||
pub mod expand;
|
||||
pub mod mut_visit;
|
||||
|
@ -7,11 +7,17 @@ use std::hash::{Hash, Hasher};
|
||||
use std::mem::{self, MaybeUninit};
|
||||
|
||||
#[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Copy)]
|
||||
#[repr(C)]
|
||||
pub struct Fingerprint(u64, u64);
|
||||
|
||||
impl Fingerprint {
|
||||
pub const ZERO: Fingerprint = Fingerprint(0, 0);
|
||||
|
||||
#[inline]
|
||||
pub fn new(_0: u64, _1: u64) -> Fingerprint {
|
||||
Fingerprint(_0, _1)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn from_smaller_hash(hash: u64) -> Fingerprint {
|
||||
Fingerprint(hash, hash)
|
||||
@ -19,7 +25,12 @@ impl Fingerprint {
|
||||
|
||||
#[inline]
|
||||
pub fn to_smaller_hash(&self) -> u64 {
|
||||
self.0
|
||||
// Even though both halves of the fingerprint are expected to be good
|
||||
// quality hash values, let's still combine the two values because the
|
||||
// Fingerprints in DefPathHash have the StableCrateId portion which is
|
||||
// the same for all DefPathHashes from the same crate. Combining the
|
||||
// two halfs makes sure we get a good quality hash in such cases too.
|
||||
self.0.wrapping_mul(3).wrapping_add(self.1)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@ -92,8 +103,19 @@ impl<H: Hasher> FingerprintHasher for H {
|
||||
impl FingerprintHasher for crate::unhash::Unhasher {
|
||||
#[inline]
|
||||
fn write_fingerprint(&mut self, fingerprint: &Fingerprint) {
|
||||
// `Unhasher` only wants a single `u64`
|
||||
self.write_u64(fingerprint.0);
|
||||
// Even though both halves of the fingerprint are expected to be good
|
||||
// quality hash values, let's still combine the two values because the
|
||||
// Fingerprints in DefPathHash have the StableCrateId portion which is
|
||||
// the same for all DefPathHashes from the same crate. Combining the
|
||||
// two halfs makes sure we get a good quality hash in such cases too.
|
||||
//
|
||||
// Since `Unhasher` is used only in the context of HashMaps, it is OK
|
||||
// to combine the two components in an order-independent way (which is
|
||||
// cheaper than the more robust Fingerprint::to_smaller_hash()). For
|
||||
// HashMaps we don't really care if Fingerprint(x,y) and
|
||||
// Fingerprint(y, x) result in the same hash value. Collision
|
||||
// probability will still be much better than with FxHash.
|
||||
self.write_u64(fingerprint.0.wrapping_add(fingerprint.1));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,13 +5,16 @@
|
||||
//! expressions) that are mostly just leftovers.
|
||||
|
||||
pub use crate::def_id::DefPathHash;
|
||||
use crate::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
use crate::def_id::{
|
||||
CrateNum, DefId, DefIndex, LocalDefId, StableCrateId, CRATE_DEF_INDEX, LOCAL_CRATE,
|
||||
};
|
||||
use crate::hir;
|
||||
|
||||
use rustc_ast::crate_disambiguator::CrateDisambiguator;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stable_hasher::StableHasher;
|
||||
use rustc_data_structures::unhash::UnhashMap;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_span::crate_disambiguator::CrateDisambiguator;
|
||||
use rustc_span::hygiene::ExpnId;
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
|
||||
@ -27,6 +30,7 @@ use tracing::debug;
|
||||
pub struct DefPathTable {
|
||||
index_to_key: IndexVec<DefIndex, DefKey>,
|
||||
def_path_hashes: IndexVec<DefIndex, DefPathHash>,
|
||||
def_path_hash_to_index: UnhashMap<DefPathHash, DefIndex>,
|
||||
}
|
||||
|
||||
impl DefPathTable {
|
||||
@ -39,6 +43,35 @@ impl DefPathTable {
|
||||
};
|
||||
self.def_path_hashes.push(def_path_hash);
|
||||
debug_assert!(self.def_path_hashes.len() == self.index_to_key.len());
|
||||
|
||||
// Check for hash collisions of DefPathHashes. These should be
|
||||
// exceedingly rare.
|
||||
if let Some(existing) = self.def_path_hash_to_index.insert(def_path_hash, index) {
|
||||
let def_path1 = DefPath::make(LOCAL_CRATE, existing, |idx| self.def_key(idx));
|
||||
let def_path2 = DefPath::make(LOCAL_CRATE, index, |idx| self.def_key(idx));
|
||||
|
||||
// Continuing with colliding DefPathHashes can lead to correctness
|
||||
// issues. We must abort compilation.
|
||||
//
|
||||
// The likelyhood of such a collision is very small, so actually
|
||||
// running into one could be indicative of a poor hash function
|
||||
// being used.
|
||||
//
|
||||
// See the documentation for DefPathHash for more information.
|
||||
panic!(
|
||||
"found DefPathHash collsion between {:?} and {:?}. \
|
||||
Compilation cannot continue.",
|
||||
def_path1, def_path2
|
||||
);
|
||||
}
|
||||
|
||||
// Assert that all DefPathHashes correctly contain the local crate's
|
||||
// StableCrateId
|
||||
#[cfg(debug_assertions)]
|
||||
if let Some(root) = self.def_path_hashes.get(CRATE_DEF_INDEX) {
|
||||
assert!(def_path_hash.stable_crate_id() == root.stable_crate_id());
|
||||
}
|
||||
|
||||
index
|
||||
}
|
||||
|
||||
@ -108,13 +141,10 @@ pub struct DefKey {
|
||||
}
|
||||
|
||||
impl DefKey {
|
||||
fn compute_stable_hash(&self, parent_hash: DefPathHash) -> DefPathHash {
|
||||
pub(crate) fn compute_stable_hash(&self, parent: DefPathHash) -> DefPathHash {
|
||||
let mut hasher = StableHasher::new();
|
||||
|
||||
// We hash a `0u8` here to disambiguate between regular `DefPath` hashes,
|
||||
// and the special "root_parent" below.
|
||||
0u8.hash(&mut hasher);
|
||||
parent_hash.hash(&mut hasher);
|
||||
parent.hash(&mut hasher);
|
||||
|
||||
let DisambiguatedDefPathData { ref data, disambiguator } = self.disambiguated_data;
|
||||
|
||||
@ -127,19 +157,13 @@ impl DefKey {
|
||||
|
||||
disambiguator.hash(&mut hasher);
|
||||
|
||||
DefPathHash(hasher.finish())
|
||||
}
|
||||
let local_hash: u64 = hasher.finish();
|
||||
|
||||
fn root_parent_stable_hash(
|
||||
crate_name: &str,
|
||||
crate_disambiguator: CrateDisambiguator,
|
||||
) -> DefPathHash {
|
||||
let mut hasher = StableHasher::new();
|
||||
// Disambiguate this from a regular `DefPath` hash; see `compute_stable_hash()` above.
|
||||
1u8.hash(&mut hasher);
|
||||
crate_name.hash(&mut hasher);
|
||||
crate_disambiguator.hash(&mut hasher);
|
||||
DefPathHash(hasher.finish())
|
||||
// Construct the new DefPathHash, making sure that the `crate_id`
|
||||
// portion of the hash is properly copied from the parent. This way the
|
||||
// `crate_id` part will be recursively propagated from the root to all
|
||||
// DefPathHashes in this DefPathTable.
|
||||
DefPathHash::new(parent.stable_crate_id(), local_hash)
|
||||
}
|
||||
}
|
||||
|
||||
@ -295,6 +319,12 @@ impl Definitions {
|
||||
self.table.def_path_hash(id.local_def_index)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn def_path_hash_to_def_id(&self, def_path_hash: DefPathHash) -> LocalDefId {
|
||||
let local_def_index = self.table.def_path_hash_to_index[&def_path_hash];
|
||||
LocalDefId { local_def_index }
|
||||
}
|
||||
|
||||
/// Returns the path from the crate root to `index`. The root
|
||||
/// nodes are not included in the path (i.e., this will be an
|
||||
/// empty vector for the crate root). For an inlined item, this
|
||||
@ -332,7 +362,8 @@ impl Definitions {
|
||||
},
|
||||
};
|
||||
|
||||
let parent_hash = DefKey::root_parent_stable_hash(crate_name, crate_disambiguator);
|
||||
let stable_crate_id = StableCrateId::new(crate_name, crate_disambiguator);
|
||||
let parent_hash = DefPathHash::new(stable_crate_id, 0);
|
||||
let def_path_hash = key.compute_stable_hash(parent_hash);
|
||||
|
||||
// Create the root definition.
|
||||
|
@ -30,6 +30,9 @@ mod stable_hash_impls;
|
||||
mod target;
|
||||
pub mod weak_lang_items;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
pub use hir::*;
|
||||
pub use hir_id::*;
|
||||
pub use lang_items::{LangItem, LanguageItems};
|
||||
|
39
compiler/rustc_hir/src/tests.rs
Normal file
39
compiler/rustc_hir/src/tests.rs
Normal file
@ -0,0 +1,39 @@
|
||||
use crate::definitions::{DefKey, DefPathData, DisambiguatedDefPathData};
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_span::crate_disambiguator::CrateDisambiguator;
|
||||
use rustc_span::def_id::{DefPathHash, StableCrateId};
|
||||
|
||||
#[test]
|
||||
fn def_path_hash_depends_on_crate_id() {
|
||||
// This test makes sure that *both* halves of a DefPathHash depend on
|
||||
// the crate-id of the defining crate. This is a desirable property
|
||||
// because the crate-id can be more easily changed than the DefPath
|
||||
// of an item, so, in the case of a crate-local DefPathHash collision,
|
||||
// the user can simply "role the dice again" for all DefPathHashes in
|
||||
// the crate by changing the crate disambiguator (e.g. via bumping the
|
||||
// crate's version number).
|
||||
|
||||
let d0 = CrateDisambiguator::from(Fingerprint::new(12, 34));
|
||||
let d1 = CrateDisambiguator::from(Fingerprint::new(56, 78));
|
||||
|
||||
let h0 = mk_test_hash("foo", d0);
|
||||
let h1 = mk_test_hash("foo", d1);
|
||||
|
||||
assert_ne!(h0.stable_crate_id(), h1.stable_crate_id());
|
||||
assert_ne!(h0.local_hash(), h1.local_hash());
|
||||
|
||||
fn mk_test_hash(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> DefPathHash {
|
||||
let stable_crate_id = StableCrateId::new(crate_name, crate_disambiguator);
|
||||
let parent_hash = DefPathHash::new(stable_crate_id, 0);
|
||||
|
||||
let key = DefKey {
|
||||
parent: None,
|
||||
disambiguated_data: DisambiguatedDefPathData {
|
||||
data: DefPathData::CrateRoot,
|
||||
disambiguator: 0,
|
||||
},
|
||||
};
|
||||
|
||||
key.compute_stable_hash(parent_hash)
|
||||
}
|
||||
}
|
@ -6,11 +6,11 @@ use crate::rmeta::{CrateDep, CrateMetadata, CrateNumMap, CrateRoot, MetadataBlob
|
||||
|
||||
use rustc_ast::expand::allocator::AllocatorKind;
|
||||
use rustc_ast::{self as ast, *};
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::svh::Svh;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_expand::base::SyntaxExtension;
|
||||
use rustc_hir::def_id::{CrateNum, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::def_id::{CrateNum, LocalDefId, StableCrateId, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::Definitions;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::middle::cstore::{CrateDepKind, CrateSource, ExternCrate};
|
||||
@ -42,6 +42,10 @@ pub struct CStore {
|
||||
allocator_kind: Option<AllocatorKind>,
|
||||
/// This crate has a `#[global_allocator]` item.
|
||||
has_global_allocator: bool,
|
||||
|
||||
/// This map is used to verify we get no hash conflicts between
|
||||
/// `StableCrateId` values.
|
||||
stable_crate_ids: FxHashMap<StableCrateId, CrateNum>,
|
||||
}
|
||||
|
||||
pub struct CrateLoader<'a> {
|
||||
@ -194,6 +198,11 @@ impl<'a> CrateLoader<'a> {
|
||||
metadata_loader: &'a MetadataLoaderDyn,
|
||||
local_crate_name: &str,
|
||||
) -> Self {
|
||||
let local_crate_stable_id =
|
||||
StableCrateId::new(local_crate_name, sess.local_crate_disambiguator());
|
||||
let mut stable_crate_ids = FxHashMap::default();
|
||||
stable_crate_ids.insert(local_crate_stable_id, LOCAL_CRATE);
|
||||
|
||||
CrateLoader {
|
||||
sess,
|
||||
metadata_loader,
|
||||
@ -207,6 +216,7 @@ impl<'a> CrateLoader<'a> {
|
||||
injected_panic_runtime: None,
|
||||
allocator_kind: None,
|
||||
has_global_allocator: false,
|
||||
stable_crate_ids,
|
||||
},
|
||||
used_extern_options: Default::default(),
|
||||
}
|
||||
@ -313,6 +323,20 @@ impl<'a> CrateLoader<'a> {
|
||||
res
|
||||
}
|
||||
|
||||
fn verify_no_stable_crate_id_hash_conflicts(
|
||||
&mut self,
|
||||
root: &CrateRoot<'_>,
|
||||
cnum: CrateNum,
|
||||
) -> Result<(), CrateError> {
|
||||
if let Some(existing) = self.cstore.stable_crate_ids.insert(root.stable_crate_id(), cnum) {
|
||||
let crate_name0 = root.name();
|
||||
let crate_name1 = self.cstore.get_crate_data(existing).name();
|
||||
return Err(CrateError::StableCrateIdCollision(crate_name0, crate_name1));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn register_crate(
|
||||
&mut self,
|
||||
host_lib: Option<Library>,
|
||||
@ -334,6 +358,8 @@ impl<'a> CrateLoader<'a> {
|
||||
// Claim this crate number and cache it
|
||||
let cnum = self.cstore.alloc_new_crate_num();
|
||||
|
||||
self.verify_no_stable_crate_id_hash_conflicts(&crate_root, cnum)?;
|
||||
|
||||
info!(
|
||||
"register crate `{}` (cnum = {}. private_dep = {})",
|
||||
crate_root.name(),
|
||||
|
@ -888,6 +888,7 @@ crate enum CrateError {
|
||||
MultipleMatchingCrates(Symbol, FxHashMap<Svh, Library>),
|
||||
SymbolConflictsCurrent(Symbol),
|
||||
SymbolConflictsOthers(Symbol),
|
||||
StableCrateIdCollision(Symbol, Symbol),
|
||||
DlOpen(String),
|
||||
DlSym(String),
|
||||
LocatorCombined(CombinedLocatorError),
|
||||
@ -970,6 +971,13 @@ impl CrateError {
|
||||
`-C metadata`. This will result in symbol conflicts between the two.",
|
||||
root_name,
|
||||
),
|
||||
CrateError::StableCrateIdCollision(crate_name0, crate_name1) => {
|
||||
let msg = format!(
|
||||
"found crates (`{}` and `{}`) with colliding StableCrateId values.",
|
||||
crate_name0, crate_name1
|
||||
);
|
||||
sess.struct_span_err(span, &msg)
|
||||
}
|
||||
CrateError::DlOpen(s) | CrateError::DlSym(s) => sess.struct_span_err(span, &s),
|
||||
CrateError::LocatorCombined(locator) => {
|
||||
let crate_name = locator.crate_name;
|
||||
|
@ -635,6 +635,10 @@ impl CrateRoot<'_> {
|
||||
self.hash
|
||||
}
|
||||
|
||||
crate fn stable_crate_id(&self) -> StableCrateId {
|
||||
self.stable_crate_id
|
||||
}
|
||||
|
||||
crate fn triple(&self) -> &TargetTriple {
|
||||
&self.triple
|
||||
}
|
||||
|
@ -653,6 +653,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||
triple: tcx.sess.opts.target_triple.clone(),
|
||||
hash: tcx.crate_hash(LOCAL_CRATE),
|
||||
disambiguator: tcx.sess.local_crate_disambiguator(),
|
||||
stable_crate_id: tcx.def_path_hash(LOCAL_CRATE.as_def_id()).stable_crate_id(),
|
||||
panic_strategy: tcx.sess.panic_strategy(),
|
||||
edition: tcx.sess.edition(),
|
||||
has_global_allocator: tcx.has_global_allocator(LOCAL_CRATE),
|
||||
|
@ -7,7 +7,7 @@ use rustc_data_structures::svh::Svh;
|
||||
use rustc_data_structures::sync::MetadataRef;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{CtorKind, DefKind};
|
||||
use rustc_hir::def_id::{DefId, DefIndex, DefPathHash};
|
||||
use rustc_hir::def_id::{DefId, DefIndex, DefPathHash, StableCrateId};
|
||||
use rustc_hir::definitions::DefKey;
|
||||
use rustc_hir::lang_items;
|
||||
use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec};
|
||||
@ -203,6 +203,7 @@ crate struct CrateRoot<'tcx> {
|
||||
extra_filename: String,
|
||||
hash: Svh,
|
||||
disambiguator: CrateDisambiguator,
|
||||
stable_crate_id: StableCrateId,
|
||||
panic_strategy: PanicStrategy,
|
||||
edition: Edition,
|
||||
has_global_allocator: bool,
|
||||
|
@ -8,7 +8,6 @@ use crate::parse::ParseSess;
|
||||
use crate::search_paths::{PathKind, SearchPath};
|
||||
|
||||
pub use rustc_ast::attr::MarkedAttrs;
|
||||
pub use rustc_ast::crate_disambiguator::CrateDisambiguator;
|
||||
pub use rustc_ast::Attribute;
|
||||
use rustc_data_structures::flock;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
@ -23,6 +22,7 @@ use rustc_errors::json::JsonEmitter;
|
||||
use rustc_errors::registry::Registry;
|
||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, DiagnosticId, ErrorReported};
|
||||
use rustc_lint_defs::FutureBreakage;
|
||||
pub use rustc_span::crate_disambiguator::CrateDisambiguator;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::source_map::{FileLoader, MultiSpan, RealFileLoader, SourceMap, Span};
|
||||
use rustc_span::{sym, SourceFileHashAlgorithm, Symbol};
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::crate_disambiguator::CrateDisambiguator;
|
||||
use crate::HashStableContext;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
@ -105,10 +106,72 @@ impl ::std::fmt::Debug for CrateNum {
|
||||
}
|
||||
}
|
||||
|
||||
/// A `DefPathHash` is a fixed-size representation of a `DefPath` that is
|
||||
/// stable across crate and compilation session boundaries. It consists of two
|
||||
/// separate 64-bit hashes. The first uniquely identifies the crate this
|
||||
/// `DefPathHash` originates from (see [StableCrateId]), and the second
|
||||
/// uniquely identifies the corresponding `DefPath` within that crate. Together
|
||||
/// they form a unique identifier within an entire crate graph.
|
||||
///
|
||||
/// There is a very small chance of hash collisions, which would mean that two
|
||||
/// different `DefPath`s map to the same `DefPathHash`. Proceeding compilation
|
||||
/// with such a hash collision would very probably lead to an ICE, and in the
|
||||
/// worst case lead to a silent mis-compilation. The compiler therefore actively
|
||||
/// and exhaustively checks for such hash collisions and aborts compilation if
|
||||
/// it finds one.
|
||||
///
|
||||
/// `DefPathHash` uses 64-bit hashes for both the crate-id part and the
|
||||
/// crate-internal part, even though it is likely that there are many more
|
||||
/// `LocalDefId`s in a single crate than there are individual crates in a crate
|
||||
/// graph. Since we use the same number of bits in both cases, the collision
|
||||
/// probability for the crate-local part will be quite a bit higher (though
|
||||
/// still very small).
|
||||
///
|
||||
/// This imbalance is not by accident: A hash collision in the
|
||||
/// crate-local part of a `DefPathHash` will be detected and reported while
|
||||
/// compiling the crate in question. Such a collision does not depend on
|
||||
/// outside factors and can be easily fixed by the crate maintainer (e.g. by
|
||||
/// renaming the item in question or by bumping the crate version in a harmless
|
||||
/// way).
|
||||
///
|
||||
/// A collision between crate-id hashes on the other hand is harder to fix
|
||||
/// because it depends on the set of crates in the entire crate graph of a
|
||||
/// compilation session. Again, using the same crate with a different version
|
||||
/// number would fix the issue with a high probability -- but that might be
|
||||
/// easier said then done if the crates in questions are dependencies of
|
||||
/// third-party crates.
|
||||
///
|
||||
/// That being said, given a high quality hash function, the collision
|
||||
/// probabilities in question are very small. For example, for a big crate like
|
||||
/// `rustc_middle` (with ~50000 `LocalDefId`s as of the time of writing) there
|
||||
/// is a probability of roughly 1 in 14,750,000,000 of a crate-internal
|
||||
/// collision occurring. For a big crate graph with 1000 crates in it, there is
|
||||
/// a probability of 1 in 36,890,000,000,000 of a `StableCrateId` collision.
|
||||
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
#[derive(HashStable_Generic, Encodable, Decodable)]
|
||||
pub struct DefPathHash(pub Fingerprint);
|
||||
|
||||
impl DefPathHash {
|
||||
/// Returns the [StableCrateId] identifying the crate this [DefPathHash]
|
||||
/// originates from.
|
||||
#[inline]
|
||||
pub fn stable_crate_id(&self) -> StableCrateId {
|
||||
StableCrateId(self.0.as_value().0)
|
||||
}
|
||||
|
||||
/// Returns the crate-local part of the [DefPathHash].
|
||||
#[inline]
|
||||
pub fn local_hash(&self) -> u64 {
|
||||
self.0.as_value().1
|
||||
}
|
||||
|
||||
/// Builds a new [DefPathHash] with the given [StableCrateId] and
|
||||
/// `local_hash`, where `local_hash` must be unique within its crate.
|
||||
pub fn new(stable_crate_id: StableCrateId, local_hash: u64) -> DefPathHash {
|
||||
DefPathHash(Fingerprint::new(stable_crate_id.0, local_hash))
|
||||
}
|
||||
}
|
||||
|
||||
impl Borrow<Fingerprint> for DefPathHash {
|
||||
#[inline]
|
||||
fn borrow(&self) -> &Fingerprint {
|
||||
@ -116,6 +179,30 @@ impl Borrow<Fingerprint> for DefPathHash {
|
||||
}
|
||||
}
|
||||
|
||||
/// A [StableCrateId] is a 64 bit hash of `(crate-name, crate-disambiguator)`. It
|
||||
/// is to [CrateNum] what [DefPathHash] is to [DefId]. It is stable across
|
||||
/// compilation sessions.
|
||||
///
|
||||
/// Since the ID is a hash value there is a (very small) chance that two crates
|
||||
/// end up with the same [StableCrateId]. The compiler will check for such
|
||||
/// collisions when loading crates and abort compilation in order to avoid
|
||||
/// further trouble.
|
||||
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Encodable, Decodable)]
|
||||
pub struct StableCrateId(u64);
|
||||
|
||||
impl StableCrateId {
|
||||
/// Computes the stable ID for a crate with the given name and
|
||||
/// disambiguator.
|
||||
pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> StableCrateId {
|
||||
use std::hash::Hash;
|
||||
|
||||
let mut hasher = StableHasher::new();
|
||||
crate_name.hash(&mut hasher);
|
||||
crate_disambiguator.hash(&mut hasher);
|
||||
StableCrateId(hasher.finish())
|
||||
}
|
||||
}
|
||||
|
||||
rustc_index::newtype_index! {
|
||||
/// A DefIndex is an index into the hir-map for a crate, identifying a
|
||||
/// particular definition. It should really be considered an interned
|
||||
|
@ -47,6 +47,8 @@ pub mod lev_distance;
|
||||
mod span_encoding;
|
||||
pub use span_encoding::{Span, DUMMY_SP};
|
||||
|
||||
pub mod crate_disambiguator;
|
||||
|
||||
pub mod symbol;
|
||||
pub use symbol::{sym, Symbol};
|
||||
|
||||
|
@ -1,18 +1,3 @@
|
||||
error: lifetime parameter `'a` only used once
|
||||
--> $DIR/one-use-in-fn-argument-in-band.rs:11:10
|
||||
|
|
||||
LL | fn a(x: &'a u32, y: &'b u32) {
|
||||
| ^^-
|
||||
| |
|
||||
| this lifetime is only used here
|
||||
| help: elide the single-use lifetime
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/one-use-in-fn-argument-in-band.rs:4:9
|
||||
|
|
||||
LL | #![deny(single_use_lifetimes)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime parameter `'b` only used once
|
||||
--> $DIR/one-use-in-fn-argument-in-band.rs:11:22
|
||||
|
|
||||
@ -21,6 +6,21 @@ LL | fn a(x: &'a u32, y: &'b u32) {
|
||||
| |
|
||||
| this lifetime is only used here
|
||||
| help: elide the single-use lifetime
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/one-use-in-fn-argument-in-band.rs:4:9
|
||||
|
|
||||
LL | #![deny(single_use_lifetimes)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime parameter `'a` only used once
|
||||
--> $DIR/one-use-in-fn-argument-in-band.rs:11:10
|
||||
|
|
||||
LL | fn a(x: &'a u32, y: &'b u32) {
|
||||
| ^^-
|
||||
| |
|
||||
| this lifetime is only used here
|
||||
| help: elide the single-use lifetime
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
error: symbol-name(_ZN5basic4main17h4272b3de5e868f5aE)
|
||||
error: symbol-name(_ZN5basic4main17hfcf1daab33c43a6aE)
|
||||
--> $DIR/basic.rs:8:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(basic::main::h4272b3de5e868f5a)
|
||||
error: demangling(basic::main::hfcf1daab33c43a6a)
|
||||
--> $DIR/basic.rs:8:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
|
@ -9,8 +9,8 @@
|
||||
//[legacy]~^ ERROR symbol-name(_ZN5basic4main
|
||||
//[legacy]~| ERROR demangling(basic::main
|
||||
//[legacy]~| ERROR demangling-alt(basic::main)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvCs4fqI2P2rA04_5basic4main)
|
||||
//[v0]~| ERROR demangling(basic[317d481089b8c8fe]::main)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvCs21hi0yVfW1J_5basic4main)
|
||||
//[v0]~| ERROR demangling(basic[17891616a171812d]::main)
|
||||
//[v0]~| ERROR demangling-alt(basic::main)
|
||||
#[rustc_def_path]
|
||||
//[legacy]~^ ERROR def-path(main)
|
||||
|
@ -1,10 +1,10 @@
|
||||
error: symbol-name(_RNvCs4fqI2P2rA04_5basic4main)
|
||||
error: symbol-name(_RNvCs21hi0yVfW1J_5basic4main)
|
||||
--> $DIR/basic.rs:8:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(basic[317d481089b8c8fe]::main)
|
||||
error: demangling(basic[17891616a171812d]::main)
|
||||
--> $DIR/basic.rs:8:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
|
@ -5,32 +5,32 @@
|
||||
pub struct Unsigned<const F: u8>;
|
||||
|
||||
#[rustc_symbol_name]
|
||||
//~^ ERROR symbol-name(_RMCs4fqI2P2rA04_25const_generics_demanglingINtB0_8UnsignedKhb_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[317d481089b8c8fe]::Unsigned<11: u8>>)
|
||||
//~^ ERROR symbol-name(_RMCs21hi0yVfW1J_25const_generics_demanglingINtB0_8UnsignedKhb_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[17891616a171812d]::Unsigned<11: u8>>)
|
||||
//~| ERROR demangling-alt(<const_generics_demangling::Unsigned<11>>)
|
||||
impl Unsigned<11> {}
|
||||
|
||||
pub struct Signed<const F: i16>;
|
||||
|
||||
#[rustc_symbol_name]
|
||||
//~^ ERROR symbol-name(_RMs_Cs4fqI2P2rA04_25const_generics_demanglingINtB2_6SignedKsn98_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[317d481089b8c8fe]::Signed<-152: i16>>)
|
||||
//~^ ERROR symbol-name(_RMs_Cs21hi0yVfW1J_25const_generics_demanglingINtB2_6SignedKsn98_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[17891616a171812d]::Signed<-152: i16>>)
|
||||
//~| ERROR demangling-alt(<const_generics_demangling::Signed<-152>>)
|
||||
impl Signed<-152> {}
|
||||
|
||||
pub struct Bool<const F: bool>;
|
||||
|
||||
#[rustc_symbol_name]
|
||||
//~^ ERROR symbol-name(_RMs0_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4BoolKb1_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[317d481089b8c8fe]::Bool<true: bool>>)
|
||||
//~^ ERROR symbol-name(_RMs0_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4BoolKb1_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[17891616a171812d]::Bool<true: bool>>)
|
||||
//~| ERROR demangling-alt(<const_generics_demangling::Bool<true>>)
|
||||
impl Bool<true> {}
|
||||
|
||||
pub struct Char<const F: char>;
|
||||
|
||||
#[rustc_symbol_name]
|
||||
//~^ ERROR symbol-name(_RMs1_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4CharKc2202_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[317d481089b8c8fe]::Char<'∂': char>>)
|
||||
//~^ ERROR symbol-name(_RMs1_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4CharKc2202_E)
|
||||
//~| ERROR demangling(<const_generics_demangling[17891616a171812d]::Char<'∂': char>>)
|
||||
//~| ERROR demangling-alt(<const_generics_demangling::Char<'∂'>>)
|
||||
impl Char<'∂'> {}
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
error: symbol-name(_RMCs4fqI2P2rA04_25const_generics_demanglingINtB0_8UnsignedKhb_E)
|
||||
error: symbol-name(_RMCs21hi0yVfW1J_25const_generics_demanglingINtB0_8UnsignedKhb_E)
|
||||
--> $DIR/const-generics-demangling.rs:7:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<const_generics_demangling[317d481089b8c8fe]::Unsigned<11: u8>>)
|
||||
error: demangling(<const_generics_demangling[17891616a171812d]::Unsigned<11: u8>>)
|
||||
--> $DIR/const-generics-demangling.rs:7:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
@ -16,13 +16,13 @@ error: demangling-alt(<const_generics_demangling::Unsigned<11>>)
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_RMs_Cs4fqI2P2rA04_25const_generics_demanglingINtB2_6SignedKsn98_E)
|
||||
error: symbol-name(_RMs_Cs21hi0yVfW1J_25const_generics_demanglingINtB2_6SignedKsn98_E)
|
||||
--> $DIR/const-generics-demangling.rs:15:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<const_generics_demangling[317d481089b8c8fe]::Signed<-152: i16>>)
|
||||
error: demangling(<const_generics_demangling[17891616a171812d]::Signed<-152: i16>>)
|
||||
--> $DIR/const-generics-demangling.rs:15:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
@ -34,13 +34,13 @@ error: demangling-alt(<const_generics_demangling::Signed<-152>>)
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_RMs0_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4BoolKb1_E)
|
||||
error: symbol-name(_RMs0_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4BoolKb1_E)
|
||||
--> $DIR/const-generics-demangling.rs:23:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<const_generics_demangling[317d481089b8c8fe]::Bool<true: bool>>)
|
||||
error: demangling(<const_generics_demangling[17891616a171812d]::Bool<true: bool>>)
|
||||
--> $DIR/const-generics-demangling.rs:23:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
@ -52,13 +52,13 @@ error: demangling-alt(<const_generics_demangling::Bool<true>>)
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_RMs1_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4CharKc2202_E)
|
||||
error: symbol-name(_RMs1_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4CharKc2202_E)
|
||||
--> $DIR/const-generics-demangling.rs:31:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<const_generics_demangling[317d481089b8c8fe]::Char<'∂': char>>)
|
||||
error: demangling(<const_generics_demangling[17891616a171812d]::Char<'∂': char>>)
|
||||
--> $DIR/const-generics-demangling.rs:31:1
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
|
@ -1,71 +1,71 @@
|
||||
error: symbol-name(_ZN5impl13foo3Foo3bar17ha318160f105e638cE)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
error: symbol-name(_ZN5impl13foo3Foo3bar17<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(impl1::foo::Foo::bar::ha318160f105e638c)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
error: demangling(impl1::foo::Foo::bar::<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(impl1::foo::Foo::bar)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(foo::Foo::bar)
|
||||
--> $DIR/impl1.rs:23:9
|
||||
--> $DIR/impl1.rs:22:9
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz17h6c2dbab6e66f9fa3E)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
error: symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz17<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(impl1::bar::<impl impl1::foo::Foo>::baz::h6c2dbab6e66f9fa3)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
error: demangling(impl1::bar::<impl impl1::foo::Foo>::baz::<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(impl1::bar::<impl impl1::foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(bar::<impl foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:41:9
|
||||
--> $DIR/impl1.rs:40:9
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method17SYMBOL_HASHE)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
error: symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method17<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method::SYMBOL_HASH)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
error: demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method::<SYMBOL_HASH>)
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method)
|
||||
--> $DIR/impl1.rs:71:13
|
||||
--> $DIR/impl1.rs:70:13
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
@ -3,8 +3,7 @@
|
||||
// revisions: legacy v0
|
||||
//[legacy]compile-flags: -Z symbol-mangling-version=legacy
|
||||
//[v0]compile-flags: -Z symbol-mangling-version=v0
|
||||
//[legacy]normalize-stderr-32bit: "hee444285569b39c2" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-64bit: "h310ea0259fc3d32d" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-test: "h[\w]{16}E?\)" -> "<SYMBOL_HASH>)"
|
||||
|
||||
#![feature(auto_traits, rustc_attrs)]
|
||||
#![allow(dead_code)]
|
||||
@ -17,8 +16,8 @@ mod foo {
|
||||
//[legacy]~^ ERROR symbol-name(_ZN5impl13foo3Foo3bar
|
||||
//[legacy]~| ERROR demangling(impl1::foo::Foo::bar
|
||||
//[legacy]~| ERROR demangling-alt(impl1::foo::Foo::bar)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13fooNtB2_3Foo3bar)
|
||||
//[v0]~| ERROR demangling(<impl1[317d481089b8c8fe]::foo::Foo>::bar)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13fooNtB2_3Foo3bar)
|
||||
//[v0]~| ERROR demangling(<impl1[17891616a171812d]::foo::Foo>::bar)
|
||||
//[v0]~| ERROR demangling-alt(<impl1::foo::Foo>::bar)
|
||||
#[rustc_def_path]
|
||||
//[legacy]~^ ERROR def-path(foo::Foo::bar)
|
||||
@ -35,8 +34,8 @@ mod bar {
|
||||
//[legacy]~^ ERROR symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz
|
||||
//[legacy]~| ERROR demangling(impl1::bar::<impl impl1::foo::Foo>::baz
|
||||
//[legacy]~| ERROR demangling-alt(impl1::bar::<impl impl1::foo::Foo>::baz)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13barNtNtB4_3foo3Foo3baz)
|
||||
//[v0]~| ERROR demangling(<impl1[317d481089b8c8fe]::foo::Foo>::baz)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13barNtNtB4_3foo3Foo3baz)
|
||||
//[v0]~| ERROR demangling(<impl1[17891616a171812d]::foo::Foo>::baz)
|
||||
//[v0]~| ERROR demangling-alt(<impl1::foo::Foo>::baz)
|
||||
#[rustc_def_path]
|
||||
//[legacy]~^ ERROR def-path(bar::<impl foo::Foo>::baz)
|
||||
@ -65,8 +64,8 @@ fn main() {
|
||||
//[legacy]~^ ERROR symbol-name(_ZN209_$LT$$u5b$$RF$dyn$u20$impl1..Foo$u2b$Assoc$u20$$u3d$$u20$extern$u20$$u22$C$u22$$u20$fn$LP$$RF$u8$C$$u20$...$RP$$u2b$impl1..AutoTrait$u3b$$u20$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method
|
||||
//[legacy]~| ERROR demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method
|
||||
//[legacy]~| ERROR demangling-alt(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvXNCNvCs4fqI2P2rA04_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method)
|
||||
//[v0]~| ERROR demangling(<[&dyn impl1[317d481089b8c8fe]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvXNCNvCs21hi0yVfW1J_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method)
|
||||
//[v0]~| ERROR demangling(<[&dyn impl1[17891616a171812d]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[17891616a171812d]::AutoTrait; 3: usize] as impl1[17891616a171812d]::main::{closure#1}::Bar>::method)
|
||||
//[v0]~| ERROR demangling-alt(<[&dyn impl1::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method)
|
||||
#[rustc_def_path]
|
||||
//[legacy]~^ ERROR def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method)
|
||||
|
@ -1,71 +1,71 @@
|
||||
error: symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13fooNtB2_3Foo3bar)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
error: symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13fooNtB2_3Foo3bar)
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<impl1[317d481089b8c8fe]::foo::Foo>::bar)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
error: demangling(<impl1[17891616a171812d]::foo::Foo>::bar)
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<impl1::foo::Foo>::bar)
|
||||
--> $DIR/impl1.rs:16:9
|
||||
--> $DIR/impl1.rs:15:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(foo::Foo::bar)
|
||||
--> $DIR/impl1.rs:23:9
|
||||
--> $DIR/impl1.rs:22:9
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13barNtNtB4_3foo3Foo3baz)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
error: symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13barNtNtB4_3foo3Foo3baz)
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<impl1[317d481089b8c8fe]::foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
error: demangling(<impl1[17891616a171812d]::foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<impl1::foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:34:9
|
||||
--> $DIR/impl1.rs:33:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(bar::<impl foo::Foo>::baz)
|
||||
--> $DIR/impl1.rs:41:9
|
||||
--> $DIR/impl1.rs:40:9
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: symbol-name(_RNvXNCNvCs4fqI2P2rA04_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
error: symbol-name(_RNvXNCNvCs21hi0yVfW1J_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method)
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<[&dyn impl1[317d481089b8c8fe]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
error: demangling(<[&dyn impl1[17891616a171812d]::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1[17891616a171812d]::AutoTrait; 3: usize] as impl1[17891616a171812d]::main::{closure#1}::Bar>::method)
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<[&dyn impl1::Foo<Assoc = for<'a> extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method)
|
||||
--> $DIR/impl1.rs:64:13
|
||||
--> $DIR/impl1.rs:63:13
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: def-path(<[&dyn Foo<Assoc = for<'r> extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method)
|
||||
--> $DIR/impl1.rs:71:13
|
||||
--> $DIR/impl1.rs:70:13
|
||||
|
|
||||
LL | #[rustc_def_path]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
@ -1,10 +1,10 @@
|
||||
error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h79d9aaa05f4b26d6E)
|
||||
error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17hb8ca3eb2682b1b51E)
|
||||
--> $DIR/issue-60925.rs:22:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo::h79d9aaa05f4b26d6)
|
||||
error: demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo::hb8ca3eb2682b1b51)
|
||||
--> $DIR/issue-60925.rs:22:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
|
@ -23,8 +23,8 @@ mod foo {
|
||||
//[legacy]~^ ERROR symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo
|
||||
//[legacy]~| ERROR demangling(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo
|
||||
//[legacy]~| ERROR demangling-alt(issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
||||
//[v0]~| ERROR demangling(<issue_60925[317d481089b8c8fe]::foo::Foo<issue_60925[317d481089b8c8fe]::llvm::Foo>>::foo)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
||||
//[v0]~| ERROR demangling(<issue_60925[17891616a171812d]::foo::Foo<issue_60925[17891616a171812d]::llvm::Foo>>::foo)
|
||||
//[v0]~| ERROR demangling-alt(<issue_60925::foo::Foo<issue_60925::llvm::Foo>>::foo)
|
||||
pub(crate) fn foo() {
|
||||
for _ in 0..0 {
|
||||
|
@ -1,10 +1,10 @@
|
||||
error: symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
||||
error: symbol-name(_RNvMNtCs21hi0yVfW1J_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo)
|
||||
--> $DIR/issue-60925.rs:22:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<issue_60925[317d481089b8c8fe]::foo::Foo<issue_60925[317d481089b8c8fe]::llvm::Foo>>::foo)
|
||||
error: demangling(<issue_60925[17891616a171812d]::foo::Foo<issue_60925[17891616a171812d]::llvm::Foo>>::foo)
|
||||
--> $DIR/issue-60925.rs:22:9
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
|
@ -1,17 +1,17 @@
|
||||
error: symbol-name(_ZN72_$LT$issue_75326..Foo$LT$I$C$E$GT$$u20$as$u20$issue_75326..Iterator2$GT$4next17SYMBOL_HASH)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<issue_75326::Foo<I,E> as issue_75326::Iterator2>::next::SYMBOL_HASH)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<issue_75326::Foo<I,E> as issue_75326::Iterator2>::next)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -3,8 +3,7 @@
|
||||
// revisions: legacy v0
|
||||
//[legacy]compile-flags: -Z symbol-mangling-version=legacy
|
||||
//[v0]compile-flags: -Z symbol-mangling-version=v0
|
||||
//[legacy]normalize-stderr-32bit: "h[\d\w]+" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-64bit: "h[\d\w]+" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-test: "h[\w{16}]+" -> "SYMBOL_HASH"
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
@ -44,8 +43,8 @@ where
|
||||
//[legacy]~^ ERROR symbol-name(_ZN72_$LT$issue_75326..Foo$LT$I$C$E$GT$$u20$as$u20$issue_75326..Iterator2$GT$4next
|
||||
//[legacy]~| ERROR demangling(<issue_75326::Foo<I,E> as issue_75326::Iterator2>::next
|
||||
//[legacy]~| ERROR demangling-alt(<issue_75326::Foo<I,E> as issue_75326::Iterator2>::next)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvXINICs4fqI2P2rA04_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_)
|
||||
//[v0]~| ERROR demangling(<issue_75326[317d481089b8c8fe]::Foo<_, _> as issue_75326[317d481089b8c8fe]::Iterator2>::next)
|
||||
//[v0]~^^^^ ERROR symbol-name(_RNvXINICs21hi0yVfW1J_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_)
|
||||
//[v0]~| ERROR demangling(<issue_75326[17891616a171812d]::Foo<_, _> as issue_75326[17891616a171812d]::Iterator2>::next)
|
||||
//[v0]~| ERROR demangling-alt(<issue_75326::Foo<_, _> as issue_75326::Iterator2>::next)
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.find(|_| true)
|
||||
|
@ -1,17 +1,17 @@
|
||||
error: symbol-name(_RNvXINICs4fqI2P2rA04_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
error: symbol-name(_RNvXINICs21hi0yVfW1J_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_)
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling(<issue_75326[317d481089b8c8fe]::Foo<_, _> as issue_75326[317d481089b8c8fe]::Iterator2>::next)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
error: demangling(<issue_75326[17891616a171812d]::Foo<_, _> as issue_75326[17891616a171812d]::Iterator2>::next)
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: demangling-alt(<issue_75326::Foo<_, _> as issue_75326::Iterator2>::next)
|
||||
--> $DIR/issue-75326.rs:43:5
|
||||
--> $DIR/issue-75326.rs:42:5
|
||||
|
|
||||
LL | #[rustc_symbol_name]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
Loading…
Reference in New Issue
Block a user