Skip to content

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

+3
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

+56-13
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

+5-3
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

+1
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

+2-1
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`
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

+1
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

+4
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

+1-1
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

+1-1
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
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ pub fn set_host_rpath(cmd: &mut Command) {
164164
///
165165
/// impl CommandWrapper {
166166
/// /// Get the [`Output`][::std::process::Output] of the finished process.
167-
/// pub fn output(&mut self) -> Output { /* ... */ } // <- required `output()` method
167+
/// pub fn command_output(&mut self) -> Output { /* ... */ } // <- required `command_output()` method
168168
/// }
169169
///
170170
/// crate::impl_common_helpers!(CommandWrapper);
@@ -242,7 +242,7 @@ macro_rules! impl_common_helpers {
242242
let caller_location = ::std::panic::Location::caller();
243243
let caller_line_number = caller_location.line();
244244

245-
let output = self.output();
245+
let output = self.command_output();
246246
if !output.status.success() {
247247
handle_failed_output(&self.cmd, output, caller_line_number);
248248
}
@@ -255,7 +255,7 @@ macro_rules! impl_common_helpers {
255255
let caller_location = ::std::panic::Location::caller();
256256
let caller_line_number = caller_location.line();
257257

258-
let output = self.output();
258+
let output = self.command_output();
259259
if output.status.success() {
260260
handle_failed_output(&self.cmd, output, caller_line_number);
261261
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl LlvmReadobj {
4444

4545
/// Get the [`Output`][::std::process::Output] of the finished process.
4646
#[track_caller]
47-
pub fn output(&mut self) -> ::std::process::Output {
47+
pub fn command_output(&mut self) -> ::std::process::Output {
4848
self.cmd.output().expect("failed to get output of finished process")
4949
}
5050
}

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

+9-2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ impl Rustc {
9191
self
9292
}
9393

94+
/// Specify path to the output file.
95+
pub fn output<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
96+
self.cmd.arg("-o");
97+
self.cmd.arg(path.as_ref());
98+
self
99+
}
100+
94101
/// This flag defers LTO optimizations to the linker.
95102
pub fn linker_plugin_lto(&mut self, option: &str) -> &mut Self {
96103
self.cmd.arg(format!("-Clinker-plugin-lto={option}"));
@@ -171,7 +178,7 @@ impl Rustc {
171178

172179
/// Get the [`Output`][::std::process::Output] of the finished process.
173180
#[track_caller]
174-
pub fn output(&mut self) -> ::std::process::Output {
181+
pub fn command_output(&mut self) -> ::std::process::Output {
175182
// let's make sure we piped all the input and outputs
176183
self.cmd.stdin(Stdio::piped());
177184
self.cmd.stdout(Stdio::piped());
@@ -196,7 +203,7 @@ impl Rustc {
196203
let caller_location = std::panic::Location::caller();
197204
let caller_line_number = caller_location.line();
198205

199-
let output = self.output();
206+
let output = self.command_output();
200207
if output.status.code().unwrap() != code {
201208
handle_failed_output(&self.cmd, output, caller_line_number);
202209
}

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ impl Rustdoc {
5151
self
5252
}
5353

54+
/// Specify path to the output folder.
55+
pub fn output<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
56+
self.cmd.arg("-o");
57+
self.cmd.arg(path.as_ref());
58+
self
59+
}
60+
5461
/// Specify output directory.
5562
pub fn out_dir<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
5663
self.cmd.arg("--out-dir").arg(path.as_ref());
@@ -73,7 +80,7 @@ impl Rustdoc {
7380

7481
/// Get the [`Output`][::std::process::Output] of the finished process.
7582
#[track_caller]
76-
pub fn output(&mut self) -> ::std::process::Output {
83+
pub fn command_output(&mut self) -> ::std::process::Output {
7784
// let's make sure we piped all the input and outputs
7885
self.cmd.stdin(Stdio::piped());
7986
self.cmd.stdout(Stdio::piped());
@@ -93,12 +100,19 @@ impl Rustdoc {
93100
}
94101
}
95102

103+
/// Specify the edition year.
104+
pub fn edition(&mut self, edition: &str) -> &mut Self {
105+
self.cmd.arg("--edition");
106+
self.cmd.arg(edition);
107+
self
108+
}
109+
96110
#[track_caller]
97111
pub fn run_fail_assert_exit_code(&mut self, code: i32) -> Output {
98112
let caller_location = std::panic::Location::caller();
99113
let caller_line_number = caller_location.line();
100114

101-
let output = self.output();
115+
let output = self.command_output();
102116
if output.status.code().unwrap() != code {
103117
handle_failed_output(&self.cmd, output, caller_line_number);
104118
}

src/tools/tidy/src/allowed_run_make_makefiles.txt

-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ run-make/dep-graph/Makefile
4444
run-make/dep-info-doesnt-run-much/Makefile
4545
run-make/dep-info-spaces/Makefile
4646
run-make/dep-info/Makefile
47-
run-make/doctests-runtool/Makefile
4847
run-make/dump-ice-to-disk/Makefile
4948
run-make/dump-mono-stats/Makefile
5049
run-make/duplicate-output-flavors/Makefile
@@ -245,7 +244,6 @@ run-make/rlib-format-packed-bundled-libs-3/Makefile
245244
run-make/rlib-format-packed-bundled-libs/Makefile
246245
run-make/rmeta-preferred/Makefile
247246
run-make/rustc-macro-dep-files/Makefile
248-
run-make/rustdoc-error-lines/Makefile
249247
run-make/rustdoc-io-error/Makefile
250248
run-make/rustdoc-map-file/Makefile
251249
run-make/rustdoc-output-path/Makefile

tests/run-make/CURRENT_RUSTC_VERSION/rmake.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ fn main() {
1313
let mut stable_path = PathBuf::from(env!("TMPDIR"));
1414
stable_path.push("libstable.rmeta");
1515

16-
let output = rustc().input("main.rs").emit("metadata").extern_("stable", &stable_path).output();
16+
let output =
17+
rustc().input("main.rs").emit("metadata").extern_("stable", &stable_path).command_output();
1718

1819
let stderr = String::from_utf8_lossy(&output.stderr);
1920
let version = include_str!(concat!(env!("S"), "/src/version"));

tests/run-make/doctests-runtool/Makefile

-20
This file was deleted.

0 commit comments

Comments
 (0)