Share inline(never) generics across crates · rust-lang/rust@4a216a2 (original) (raw)
`@@ -208,8 +208,8 @@ where
`
208
208
`// available to downstream crates. This depends on whether we are in
`
209
209
`// share-generics mode and whether the current crate can even have
`
210
210
`// downstream crates.
`
211
``
`-
let export_generics =
`
212
``
`-
cx.tcx.sess.opts.share_generics() && cx.tcx.local_crate_exports_generics();
`
``
211
`+
let can_export_generics = cx.tcx.local_crate_exports_generics();
`
``
212
`+
let always_export_generics = can_export_generics && cx.tcx.sess.opts.share_generics();
`
213
213
``
214
214
`let cgu_name_builder = &mut CodegenUnitNameBuilder::new(cx.tcx);
`
215
215
`let cgu_name_cache = &mut UnordMap::default();
`
`@@ -249,7 +249,8 @@ where
`
249
249
` cx.tcx,
`
250
250
`&mono_item,
`
251
251
`&mut can_be_internalized,
`
252
``
`-
export_generics,
`
``
252
`+
can_export_generics,
`
``
253
`+
always_export_generics,
`
253
254
`);
`
254
255
`if visibility == Visibility::Hidden && can_be_internalized {
`
255
256
` internalization_candidates.insert(mono_item);
`
`@@ -739,12 +740,19 @@ fn mono_item_linkage_and_visibility<'tcx>(
`
739
740
`tcx: TyCtxt<'tcx>,
`
740
741
`mono_item: &MonoItem<'tcx>,
`
741
742
`can_be_internalized: &mut bool,
`
742
``
`-
export_generics: bool,
`
``
743
`+
can_export_generics: bool,
`
``
744
`+
always_export_generics: bool,
`
743
745
`) -> (Linkage, Visibility) {
`
744
746
`if let Some(explicit_linkage) = mono_item.explicit_linkage(tcx) {
`
745
747
`return (explicit_linkage, Visibility::Default);
`
746
748
`}
`
747
``
`-
let vis = mono_item_visibility(tcx, mono_item, can_be_internalized, export_generics);
`
``
749
`+
let vis = mono_item_visibility(
`
``
750
`+
tcx,
`
``
751
`+
mono_item,
`
``
752
`+
can_be_internalized,
`
``
753
`+
can_export_generics,
`
``
754
`+
always_export_generics,
`
``
755
`+
);
`
748
756
`(Linkage::External, vis)
`
749
757
`}
`
750
758
``
`@@ -767,7 +775,8 @@ fn mono_item_visibility<'tcx>(
`
767
775
`tcx: TyCtxt<'tcx>,
`
768
776
`mono_item: &MonoItem<'tcx>,
`
769
777
`can_be_internalized: &mut bool,
`
770
``
`-
export_generics: bool,
`
``
778
`+
can_export_generics: bool,
`
``
779
`+
always_export_generics: bool,
`
771
780
`) -> Visibility {
`
772
781
`let instance = match mono_item {
`
773
782
`// This is pretty complicated; see below.
`
`@@ -826,7 +835,11 @@ fn mono_item_visibility<'tcx>(
`
826
835
``
827
836
`` // Upstream DefId
instances get different handling than local ones.
``
828
837
`let Some(def_id) = def_id.as_local() else {
`
829
``
`-
return if export_generics && is_generic {
`
``
838
`+
return if is_generic
`
``
839
`+
&& (always_export_generics
`
``
840
`+
|| (can_export_generics
`
``
841
`+
&& tcx.codegen_fn_attrs(def_id).inline == rustc_attr::InlineAttr::Never))
`
``
842
`+
{
`
830
843
`// If it is an upstream monomorphization and we export generics, we must make
`
831
844
`// it available to downstream crates.
`
832
845
`*can_be_internalized = false;
`
`@@ -837,7 +850,10 @@ fn mono_item_visibility<'tcx>(
`
837
850
`};
`
838
851
``
839
852
`if is_generic {
`
840
``
`-
if export_generics {
`
``
853
`+
if always_export_generics
`
``
854
`+
|| (can_export_generics
`
``
855
`+
&& tcx.codegen_fn_attrs(def_id).inline == rustc_attr::InlineAttr::Never)
`
``
856
`+
{
`
841
857
`if tcx.is_unreachable_local_definition(def_id) {
`
842
858
`// This instance cannot be used from another crate.
`
843
859
`Visibility::Hidden
`