Skip to content

Commit 1e6fe58

Browse files
committed
Auto merge of #94079 - petrochenkov:cstr, r=joshtriplett
library: Move `CStr` to libcore, and `CString` to liballoc Closes #46736 Interesting points: - Stability: - To make `CStr(ing)` from libcore/liballoc unusable without enabling features I had to make these structures unstable, and reexport them from libstd using stable type aliases instead of `pub use` reexports. (Because stability of `use` items is not checked.) - Relying on target ABI in libcore is ok: - #94079 (comment) - `trait CStrExt` (UPDATE: used only in `cfg(bootstrap)` mode, otherwise lang items are used instead) - #94079 (comment) - `strlen` - #94079 (comment) Otherwise it's just a code move + some minor hackery usual for liballoc in `cfg(test)` mode.
2 parents 69a5ae3 + f62c84e commit 1e6fe58

File tree

28 files changed

+940
-695
lines changed

28 files changed

+940
-695
lines changed

Cargo.lock

+2-2
Original file line numberDiff line numberDiff line change
@@ -731,9 +731,9 @@ dependencies = [
731731

732732
[[package]]
733733
name = "compiler_builtins"
734-
version = "0.1.70"
734+
version = "0.1.71"
735735
source = "registry+https://github.com./rust-lang/crates.io-index"
736-
checksum = "80873f979f0a344a4ade87c2f70d9ccf5720b83b10c97ec7cd745895d021e85a"
736+
checksum = "163437f05ca8f29d7e9128ea728dedf5eb620e445fbca273641d3a3050305f23"
737737
dependencies = [
738738
"cc",
739739
"rustc-std-workspace-core",

compiler/rustc_hir/src/lang_items.rs

+2
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ language_item_table! {
326326
Range, sym::Range, range_struct, Target::Struct, GenericRequirement::None;
327327
RangeToInclusive, sym::RangeToInclusive, range_to_inclusive_struct, Target::Struct, GenericRequirement::None;
328328
RangeTo, sym::RangeTo, range_to_struct, Target::Struct, GenericRequirement::None;
329+
330+
CStr, sym::CStr, c_str, Target::Struct, GenericRequirement::None;
329331
}
330332

331333
pub enum GenericRequirement {

compiler/rustc_metadata/src/creader.rs

+1
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ impl<'a> CrateLoader<'a> {
417417

418418
let crate_metadata = CrateMetadata::new(
419419
self.sess,
420+
&self.cstore,
420421
metadata,
421422
crate_root,
422423
raw_proc_macros,

compiler/rustc_metadata/src/rmeta/decoder.rs

+15-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Decoding metadata from a single crate's metadata
22

3-
use crate::creader::CrateMetadataRef;
3+
use crate::creader::{CStore, CrateMetadataRef};
44
use crate::rmeta::table::{FixedSizeEncoding, Table};
55
use crate::rmeta::*;
66

@@ -1737,6 +1737,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
17371737
impl CrateMetadata {
17381738
crate fn new(
17391739
sess: &Session,
1740+
cstore: &CStore,
17401741
blob: MetadataBlob,
17411742
root: CrateRoot<'static>,
17421743
raw_proc_macros: Option<&'static [ProcMacro]>,
@@ -1752,11 +1753,6 @@ impl CrateMetadata {
17521753
.decode((&blob, sess))
17531754
.map(|trait_impls| (trait_impls.trait_id, trait_impls.impls))
17541755
.collect();
1755-
let incoherent_impls = root
1756-
.incoherent_impls
1757-
.decode((&blob, sess))
1758-
.map(|incoherent_impls| (incoherent_impls.self_ty, incoherent_impls.impls))
1759-
.collect();
17601756
let alloc_decoding_state =
17611757
AllocDecodingState::new(root.interpret_alloc_index.decode(&blob).collect());
17621758
let dependencies = Lock::new(cnum_map.iter().cloned().collect());
@@ -1765,11 +1761,11 @@ impl CrateMetadata {
17651761
// that does not copy any data. It just does some data verification.
17661762
let def_path_hash_map = root.def_path_hash_map.decode(&blob);
17671763

1768-
CrateMetadata {
1764+
let mut cdata = CrateMetadata {
17691765
blob,
17701766
root,
17711767
trait_impls,
1772-
incoherent_impls,
1768+
incoherent_impls: Default::default(),
17731769
raw_proc_macros,
17741770
source_map_import_info: OnceCell::new(),
17751771
def_path_hash_map,
@@ -1786,7 +1782,17 @@ impl CrateMetadata {
17861782
hygiene_context: Default::default(),
17871783
def_key_cache: Default::default(),
17881784
def_path_hash_cache: Default::default(),
1789-
}
1785+
};
1786+
1787+
// Need `CrateMetadataRef` to decode `DefId`s in simplified types.
1788+
cdata.incoherent_impls = cdata
1789+
.root
1790+
.incoherent_impls
1791+
.decode(CrateMetadataRef { cdata: &cdata, cstore })
1792+
.map(|incoherent_impls| (incoherent_impls.self_ty, incoherent_impls.impls))
1793+
.collect();
1794+
1795+
cdata
17901796
}
17911797

17921798
crate fn dependencies(&self) -> LockGuard<'_, Vec<CrateNum>> {

compiler/rustc_typeck/src/check/method/probe.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
644644
self.assemble_inherent_impl_candidates_for_type(p.def_id());
645645
}
646646
ty::Adt(def, _) => {
647-
self.assemble_inherent_impl_candidates_for_type(def.did());
647+
let def_id = def.did();
648+
self.assemble_inherent_impl_candidates_for_type(def_id);
649+
if Some(def_id) == self.tcx.lang_items().c_str() {
650+
self.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty);
651+
}
648652
}
649653
ty::Foreign(did) => {
650654
self.assemble_inherent_impl_candidates_for_type(did);

compiler/rustc_typeck/src/coherence/inherent_impls.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ impl<'tcx> ItemLikeVisitor<'_> for InherentCollect<'tcx> {
5555
let self_ty = self.tcx.type_of(item.def_id);
5656
match *self_ty.kind() {
5757
ty::Adt(def, _) => {
58-
self.check_def_id(item, def.did());
58+
let def_id = def.did();
59+
if !def_id.is_local() && Some(def_id) == self.tcx.lang_items().c_str() {
60+
self.check_primitive_impl(item.def_id, self_ty, items, ty.span)
61+
} else {
62+
self.check_def_id(item, def_id);
63+
}
5964
}
6065
ty::Foreign(did) => {
6166
self.check_def_id(item, did);

0 commit comments

Comments
 (0)