Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 371dd62

Browse files
committed
Auto merge of rust-lang#124776 - fmease:rollup-xu4kudb, r=fmease
Rollup of 5 pull requests Successful merges: - rust-lang#124742 (Add `rustfmt` cfg to well known cfgs list) - rust-lang#124747 (Support Result<T, E> across FFI when niche optimization can be used (v2)) - rust-lang#124753 (Migrate `run-make/rustdoc-error-lines` to new `rmake.rs`) - rust-lang#124765 ([rustdoc] Fix bad color for setting cog in ayu theme) - rust-lang#124768 ([resubmission] Meta: Enable the brand new triagebot transfer command) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 3170bd9 + f599c0a commit 371dd62

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1032
-171
lines changed

compiler/rustc_feature/src/unstable.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,9 @@ declare_features! (
579579
(incomplete, repr128, "1.16.0", Some(56071)),
580580
/// Allows `repr(simd)` and importing the various simd intrinsics.
581581
(unstable, repr_simd, "1.4.0", Some(27731)),
582+
/// Allows enums like Result<T, E> to be used across FFI, if T's niche value can
583+
/// be used to describe E or vise-versa.
584+
(unstable, result_ffi_guarantees, "CURRENT_RUSTC_VERSION", Some(110503)),
582585
/// Allows bounding the return type of AFIT/RPITIT.
583586
(incomplete, return_type_notation, "1.70.0", Some(109417)),
584587
/// Allows `extern "rust-cold"`.

compiler/rustc_lint/src/types.rs

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,32 @@ fn get_nullable_type<'tcx>(
11011101
})
11021102
}
11031103

1104+
/// A type is niche-optimization candidate iff:
1105+
/// - Is a zero-sized type with alignment 1 (a “1-ZST”).
1106+
/// - Has no fields.
1107+
/// - Does not have the `#[non_exhaustive]` attribute.
1108+
fn is_niche_optimization_candidate<'tcx>(
1109+
tcx: TyCtxt<'tcx>,
1110+
param_env: ty::ParamEnv<'tcx>,
1111+
ty: Ty<'tcx>,
1112+
) -> bool {
1113+
if tcx.layout_of(param_env.and(ty)).is_ok_and(|layout| !layout.is_1zst()) {
1114+
return false;
1115+
}
1116+
1117+
match ty.kind() {
1118+
ty::Adt(ty_def, _) => {
1119+
let non_exhaustive = ty_def.is_variant_list_non_exhaustive();
1120+
let empty = (ty_def.is_struct() && ty_def.all_fields().next().is_none())
1121+
|| (ty_def.is_enum() && ty_def.variants().is_empty());
1122+
1123+
!non_exhaustive && empty
1124+
}
1125+
ty::Tuple(tys) => tys.is_empty(),
1126+
_ => false,
1127+
}
1128+
}
1129+
11041130
/// Check if this enum can be safely exported based on the "nullable pointer optimization". If it
11051131
/// can, return the type that `ty` can be safely converted to, otherwise return `None`.
11061132
/// Currently restricted to function pointers, boxes, references, `core::num::NonZero`,
@@ -1117,6 +1143,22 @@ pub(crate) fn repr_nullable_ptr<'tcx>(
11171143
let field_ty = match &ty_def.variants().raw[..] {
11181144
[var_one, var_two] => match (&var_one.fields.raw[..], &var_two.fields.raw[..]) {
11191145
([], [field]) | ([field], []) => field.ty(tcx, args),
1146+
([field1], [field2]) => {
1147+
if !tcx.features().result_ffi_guarantees {
1148+
return None;
1149+
}
1150+
1151+
let ty1 = field1.ty(tcx, args);
1152+
let ty2 = field2.ty(tcx, args);
1153+
1154+
if is_niche_optimization_candidate(tcx, param_env, ty1) {
1155+
ty2
1156+
} else if is_niche_optimization_candidate(tcx, param_env, ty2) {
1157+
ty1
1158+
} else {
1159+
return None;
1160+
}
1161+
}
11201162
_ => return None,
11211163
},
11221164
_ => return None,
@@ -1202,7 +1244,6 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
12021244
args: GenericArgsRef<'tcx>,
12031245
) -> FfiResult<'tcx> {
12041246
use FfiResult::*;
1205-
12061247
let transparent_with_all_zst_fields = if def.repr().transparent() {
12071248
if let Some(field) = transparent_newtype_field(self.cx.tcx, variant) {
12081249
// Transparent newtypes have at most one non-ZST field which needs to be checked..
@@ -1329,27 +1370,29 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
13291370
return FfiSafe;
13301371
}
13311372

1373+
if def.is_variant_list_non_exhaustive() && !def.did().is_local() {
1374+
return FfiUnsafe {
1375+
ty,
1376+
reason: fluent::lint_improper_ctypes_non_exhaustive,
1377+
help: None,
1378+
};
1379+
}
1380+
13321381
// Check for a repr() attribute to specify the size of the
13331382
// discriminant.
13341383
if !def.repr().c() && !def.repr().transparent() && def.repr().int.is_none()
13351384
{
1336-
// Special-case types like `Option<extern fn()>`.
1337-
if repr_nullable_ptr(self.cx.tcx, self.cx.param_env, ty, self.mode)
1338-
.is_none()
1385+
// Special-case types like `Option<extern fn()>` and `Result<extern fn(), ()>`
1386+
if let Some(ty) =
1387+
repr_nullable_ptr(self.cx.tcx, self.cx.param_env, ty, self.mode)
13391388
{
1340-
return FfiUnsafe {
1341-
ty,
1342-
reason: fluent::lint_improper_ctypes_enum_repr_reason,
1343-
help: Some(fluent::lint_improper_ctypes_enum_repr_help),
1344-
};
1389+
return self.check_type_for_ffi(cache, ty);
13451390
}
1346-
}
13471391

1348-
if def.is_variant_list_non_exhaustive() && !def.did().is_local() {
13491392
return FfiUnsafe {
13501393
ty,
1351-
reason: fluent::lint_improper_ctypes_non_exhaustive,
1352-
help: None,
1394+
reason: fluent::lint_improper_ctypes_enum_repr_reason,
1395+
help: Some(fluent::lint_improper_ctypes_enum_repr_help),
13531396
};
13541397
}
13551398

compiler/rustc_session/src/config/cfg.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,15 @@ impl CheckCfg {
262262

263263
ins!(sym::debug_assertions, no_values);
264264

265-
// These four are never set by rustc, but we set them anyway: they
266-
// should not trigger a lint because `cargo clippy`, `cargo doc`,
267-
// `cargo test` and `cargo miri run` (respectively) can set them.
265+
// These four are never set by rustc, but we set them anyway; they
266+
// should not trigger the lint because `cargo clippy`, `cargo doc`,
267+
// `cargo test`, `cargo miri run` and `cargo fmt` (respectively)
268+
// can set them.
268269
ins!(sym::clippy, no_values);
269270
ins!(sym::doc, no_values);
270271
ins!(sym::doctest, no_values);
271272
ins!(sym::miri, no_values);
273+
ins!(sym::rustfmt, no_values);
272274

273275
ins!(sym::overflow_checks, no_values);
274276

compiler/rustc_span/src/symbol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,7 @@ symbols! {
15111511
require,
15121512
residual,
15131513
result,
1514+
result_ffi_guarantees,
15141515
resume,
15151516
return_position_impl_trait_in_trait,
15161517
return_type_notation,

src/doc/rustc/src/check-cfg.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ Those well known names and values follows the same stability as what they refer
7171
Well known names and values checking is always enabled as long as at least one
7272
`--check-cfg` argument is present.
7373
74-
As of `2024-04-06T`, the list of known names is as follows:
74+
As of `2024-05-06T`, the list of known names is as follows:
7575
7676
<!--- See CheckCfg::fill_well_known in compiler/rustc_session/src/config.rs -->
7777
@@ -84,6 +84,7 @@ As of `2024-04-06T`, the list of known names is as follows:
8484
- `panic`
8585
- `proc_macro`
8686
- `relocation_model`
87+
- `rustfmt`
8788
- `sanitize`
8889
- `sanitizer_cfi_generalize_pointers`
8990
- `sanitizer_cfi_normalize_integers`
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# `result_ffi_guarantees`
2+
3+
The tracking issue for this feature is: [#110503]
4+
5+
[#110503]: https://github.com/rust-lang/rust/issues/110503
6+
7+
------------------------
8+
9+
This feature adds the possibility of using `Result<T, E>` in FFI if T's niche
10+
value can be used to describe E or vise-versa.
11+
12+
See [RFC 3391] for more information.
13+
14+
[RFC 3391]: https://github.com/rust-lang/rfcs/blob/master/text/3391-result_ffi_guarantees.md

src/librustdoc/html/static/css/noscript.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ nav.sub {
8585
--search-tab-button-not-selected-background: #e6e6e6;
8686
--search-tab-button-selected-border-top-color: #0089ff;
8787
--search-tab-button-selected-background: #fff;
88+
--settings-menu-filter: none;
8889
--stab-background-color: #fff5d6;
8990
--stab-code-color: #000;
9091
--code-highlight-kw-color: #8959a8;

src/librustdoc/html/static/css/rustdoc.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,7 @@ a.tooltip:hover::after {
16251625
,5.1715698,7.5,6 S6.8284302,7.5,6,7.5z" fill="black"/></svg>');
16261626
width: 22px;
16271627
height: 22px;
1628+
filter: var(--settings-menu-filter);
16281629
}
16291630

16301631
#sidebar-button > a:before {
@@ -2419,6 +2420,7 @@ by default.
24192420
--search-tab-button-not-selected-background: #e6e6e6;
24202421
--search-tab-button-selected-border-top-color: #0089ff;
24212422
--search-tab-button-selected-background: #fff;
2423+
--settings-menu-filter: none;
24222424
--stab-background-color: #fff5d6;
24232425
--stab-code-color: #000;
24242426
--code-highlight-kw-color: #8959a8;
@@ -2524,6 +2526,7 @@ by default.
25242526
--search-tab-button-not-selected-background: #252525;
25252527
--search-tab-button-selected-border-top-color: #0089ff;
25262528
--search-tab-button-selected-background: #353535;
2529+
--settings-menu-filter: none;
25272530
--stab-background-color: #314559;
25282531
--stab-code-color: #e6e1cf;
25292532
--code-highlight-kw-color: #ab8ac1;
@@ -2636,6 +2639,7 @@ Original by Dempfi (https://github.com/dempfi/ayu)
26362639
--search-tab-button-not-selected-background: transparent !important;
26372640
--search-tab-button-selected-border-top-color: none;
26382641
--search-tab-button-selected-background: #141920 !important;
2642+
--settings-menu-filter: invert(100%);
26392643
--stab-background-color: #314559;
26402644
--stab-code-color: #e6e1cf;
26412645
--code-highlight-kw-color: #ff7733;

src/tools/run-make-support/src/cc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ impl Cc {
7373
}
7474

7575
/// Get the [`Output`][::std::process::Output] of the finished process.
76-
pub fn output(&mut self) -> ::std::process::Output {
76+
pub fn command_output(&mut self) -> ::std::process::Output {
7777
self.cmd.output().expect("failed to get output of finished process")
7878
}
7979
}

src/tools/run-make-support/src/clang.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl Clang {
7272
}
7373

7474
/// Get the [`Output`][::std::process::Output] of the finished process.
75-
pub fn output(&mut self) -> ::std::process::Output {
75+
pub fn command_output(&mut self) -> ::std::process::Output {
7676
self.cmd.output().expect("failed to get output of finished process")
7777
}
7878
}

0 commit comments

Comments
 (0)