Skip to content

Commit 6f83750

Browse files
committed
Auto merge of #123576 - matthiaskrgr:rollup-9wiqkfa, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #119224 (Drop panic hook after running tests) - #123411 (Put checks that detect UB under their own flag below debug_assertions) - #123516 (Do not ICE on field access check on expr with `ty::Error`) - #123522 (Stabilize const Atomic*::into_inner) - #123559 (Add a debug asserts call to match_projection_projections to ensure invariant) - #123563 (Rewrite `version` test run-make as an UI test) Failed merges: - #123569 (Move some tests) r? `@ghost` `@rustbot` modify labels: rollup
2 parents aa1c459 + 96dbde7 commit 6f83750

Some content is hidden

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

53 files changed

+298
-80
lines changed

compiler/rustc_codegen_cranelift/src/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ fn codegen_stmt<'tcx>(
789789
layout.offset_of_subfield(fx, fields.iter()).bytes()
790790
}
791791
NullOp::UbChecks => {
792-
let val = fx.tcx.sess.opts.debug_assertions;
792+
let val = fx.tcx.sess.ub_checks();
793793
let val = CValue::by_val(
794794
fx.bcx.ins().iconst(types::I8, i64::try_from(val).unwrap()),
795795
fx.layout_of(fx.tcx.types.bool),

compiler/rustc_codegen_ssa/src/mir/rvalue.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
682682
bx.cx().const_usize(val)
683683
}
684684
mir::NullOp::UbChecks => {
685-
let val = bx.tcx().sess.opts.debug_assertions;
685+
let val = bx.tcx().sess.ub_checks();
686686
bx.cx().const_bool(val)
687687
}
688688
};

compiler/rustc_const_eval/src/interpret/step.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
258258
let val = layout.offset_of_subfield(self, fields.iter()).bytes();
259259
Scalar::from_target_usize(val, self)
260260
}
261-
mir::NullOp::UbChecks => Scalar::from_bool(self.tcx.sess.opts.debug_assertions),
261+
mir::NullOp::UbChecks => Scalar::from_bool(self.tcx.sess.ub_checks()),
262262
};
263263
self.write_scalar(val, &dest)?;
264264
}

compiler/rustc_feature/src/builtin_attrs.rs

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub type GatedCfg = (Symbol, Symbol, GateFn);
2525
const GATED_CFGS: &[GatedCfg] = &[
2626
// (name in cfg, feature, function to check if the feature is enabled)
2727
(sym::overflow_checks, sym::cfg_overflow_checks, cfg_fn!(cfg_overflow_checks)),
28+
(sym::ub_checks, sym::cfg_ub_checks, cfg_fn!(cfg_ub_checks)),
2829
(sym::target_thread_local, sym::cfg_target_thread_local, cfg_fn!(cfg_target_thread_local)),
2930
(
3031
sym::target_has_atomic_equal_alignment,

compiler/rustc_feature/src/unstable.rs

+2
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,8 @@ declare_features! (
381381
(unstable, cfg_target_has_atomic_equal_alignment, "1.60.0", Some(93822)),
382382
/// Allows `cfg(target_thread_local)`.
383383
(unstable, cfg_target_thread_local, "1.7.0", Some(29594)),
384+
/// Allows the use of `#[cfg(ub_checks)` to check if UB checks are enabled.
385+
(unstable, cfg_ub_checks, "CURRENT_RUSTC_VERSION", Some(123499)),
384386
/// Allow conditional compilation depending on rust version
385387
(unstable, cfg_version, "1.45.0", Some(64796)),
386388
/// Allows to use the `#[cfi_encoding = ""]` attribute.

compiler/rustc_interface/src/tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,7 @@ fn test_unstable_options_tracking_hash() {
846846
tracked!(trap_unreachable, Some(false));
847847
tracked!(treat_err_as_bug, NonZero::new(1));
848848
tracked!(tune_cpu, Some(String::from("abc")));
849+
tracked!(ub_checks, Some(false));
849850
tracked!(uninit_const_chunk_threshold, 123);
850851
tracked!(unleash_the_miri_inside_of_you, true);
851852
tracked!(use_ctors_section, Some(true));

compiler/rustc_middle/src/mir/mod.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -777,8 +777,8 @@ impl<'tcx> Body<'tcx> {
777777
// _1 = const _
778778
// SwitchInt(_1)
779779
//
780-
// And MIR for if intrinsics::debug_assertions() looks like this:
781-
// _1 = cfg!(debug_assertions)
780+
// And MIR for if intrinsics::ub_checks() looks like this:
781+
// _1 = UbChecks()
782782
// SwitchInt(_1)
783783
//
784784
// So we're going to try to recognize this pattern.
@@ -799,9 +799,7 @@ impl<'tcx> Body<'tcx> {
799799
}
800800

801801
match rvalue {
802-
Rvalue::NullaryOp(NullOp::UbChecks, _) => {
803-
Some((tcx.sess.opts.debug_assertions as u128, targets))
804-
}
802+
Rvalue::NullaryOp(NullOp::UbChecks, _) => Some((tcx.sess.ub_checks() as u128, targets)),
805803
Rvalue::Use(Operand::Constant(constant)) => {
806804
let bits = eval_mono_const(constant);
807805
Some((bits, targets))

compiler/rustc_mir_transform/src/check_alignment.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl<'tcx> MirPass<'tcx> for CheckAlignment {
1616
if sess.target.llvm_target == "i686-pc-windows-msvc" {
1717
return false;
1818
}
19-
sess.opts.debug_assertions
19+
sess.ub_checks()
2020
}
2121

2222
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {

compiler/rustc_mir_transform/src/instsimplify.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
149149

150150
fn simplify_ub_check(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) {
151151
if let Rvalue::NullaryOp(NullOp::UbChecks, _) = *rvalue {
152-
let const_ = Const::from_bool(self.tcx, self.tcx.sess.opts.debug_assertions);
152+
let const_ = Const::from_bool(self.tcx, self.tcx.sess.ub_checks());
153153
let constant = ConstOperand { span: source_info.span, const_, user_ty: None };
154154
*rvalue = Rvalue::Use(Operand::Constant(Box::new(constant)));
155155
}

compiler/rustc_passes/src/dead.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
153153
self.insert_def_id(def.non_enum_variant().fields[index].did);
154154
}
155155
ty::Tuple(..) => {}
156-
_ => span_bug!(lhs.span, "named field access on non-ADT"),
156+
ty::Error(_) => {}
157+
kind => span_bug!(lhs.span, "named field access on non-ADT: {kind:?}"),
157158
}
158159
}
159160

compiler/rustc_session/src/config/cfg.rs

+6
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ pub(crate) fn default_configuration(sess: &Session) -> Cfg {
212212
ins_none!(sym::test);
213213
}
214214

215+
if sess.ub_checks() {
216+
ins_none!(sym::ub_checks);
217+
}
218+
215219
ret
216220
}
217221

@@ -367,6 +371,8 @@ impl CheckCfg {
367371

368372
ins!(sym::test, no_values);
369373

374+
ins!(sym::ub_checks, no_values);
375+
370376
ins!(sym::unix, no_values);
371377
ins!(sym::windows, no_values);
372378
}

compiler/rustc_session/src/options.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,9 @@ written to standard error output)"),
19921992
"in diagnostics, use heuristics to shorten paths referring to items"),
19931993
tune_cpu: Option<String> = (None, parse_opt_string, [TRACKED],
19941994
"select processor to schedule for (`rustc --print target-cpus` for details)"),
1995+
#[rustc_lint_opt_deny_field_access("use `Session::ub_checks` instead of this field")]
1996+
ub_checks: Option<bool> = (None, parse_opt_bool, [TRACKED],
1997+
"emit runtime checks for Undefined Behavior (default: -Cdebug-assertions)"),
19951998
ui_testing: bool = (false, parse_bool, [UNTRACKED],
19961999
"emit compiler diagnostics in a form suitable for UI testing (default: no)"),
19972000
uninit_const_chunk_threshold: usize = (16, parse_number, [TRACKED],

compiler/rustc_session/src/session.rs

+4
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,10 @@ impl Session {
735735
self.opts.cg.overflow_checks.unwrap_or(self.opts.debug_assertions)
736736
}
737737

738+
pub fn ub_checks(&self) -> bool {
739+
self.opts.unstable_opts.ub_checks.unwrap_or(self.opts.debug_assertions)
740+
}
741+
738742
pub fn relocation_model(&self) -> RelocModel {
739743
self.opts.cg.relocation_model.unwrap_or(self.target.relocation_model)
740744
}

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ symbols! {
514514
cfg_target_has_atomic_equal_alignment,
515515
cfg_target_thread_local,
516516
cfg_target_vendor,
517+
cfg_ub_checks,
517518
cfg_version,
518519
cfi,
519520
cfi_encoding,

compiler/rustc_trait_selection/src/traits/select/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
17321732
env_predicate: PolyProjectionPredicate<'tcx>,
17331733
potentially_unnormalized_candidates: bool,
17341734
) -> ProjectionMatchesProjection {
1735+
debug_assert_eq!(obligation.predicate.def_id, env_predicate.projection_def_id());
1736+
17351737
let mut nested_obligations = Vec::new();
17361738
let infer_predicate = self.infcx.instantiate_binder_with_fresh_vars(
17371739
obligation.cause.span,

compiler/stable_mir/src/mir/body.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ pub enum NullOp {
993993
AlignOf,
994994
/// Returns the offset of a field.
995995
OffsetOf(Vec<(VariantIdx, FieldIdx)>),
996-
/// cfg!(debug_assertions), but at codegen time
996+
/// cfg!(ub_checks), but at codegen time
997997
UbChecks,
998998
}
999999

library/core/src/cell.rs

+42
Original file line numberDiff line numberDiff line change
@@ -2071,6 +2071,7 @@ impl<T> UnsafeCell<T> {
20712071
/// ```
20722072
#[inline(always)]
20732073
#[stable(feature = "rust1", since = "1.0.0")]
2074+
// When this is const stabilized, please remove `primitive_into_inner` below.
20742075
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
20752076
pub const fn into_inner(self) -> T {
20762077
self.value
@@ -2217,6 +2218,47 @@ impl<T: CoerceUnsized<U>, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T> {}
22172218
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
22182219
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<UnsafeCell<U>> for UnsafeCell<T> {}
22192220

2221+
// Special cases of UnsafeCell::into_inner where T is a primitive. These are
2222+
// used by Atomic*::into_inner.
2223+
//
2224+
// The real UnsafeCell::into_inner cannot be used yet in a stable const function.
2225+
// That is blocked on a "precise drop analysis" unstable const feature.
2226+
// https://github.com/rust-lang/rust/issues/73255
2227+
macro_rules! unsafe_cell_primitive_into_inner {
2228+
($($primitive:ident $atomic:literal)*) => {
2229+
$(
2230+
#[cfg(target_has_atomic_load_store = $atomic)]
2231+
impl UnsafeCell<$primitive> {
2232+
pub(crate) const fn primitive_into_inner(self) -> $primitive {
2233+
self.value
2234+
}
2235+
}
2236+
)*
2237+
};
2238+
}
2239+
2240+
unsafe_cell_primitive_into_inner! {
2241+
i8 "8"
2242+
u8 "8"
2243+
i16 "16"
2244+
u16 "16"
2245+
i32 "32"
2246+
u32 "32"
2247+
i64 "64"
2248+
u64 "64"
2249+
i128 "128"
2250+
u128 "128"
2251+
isize "ptr"
2252+
usize "ptr"
2253+
}
2254+
2255+
#[cfg(target_has_atomic_load_store = "ptr")]
2256+
impl<T> UnsafeCell<*mut T> {
2257+
pub(crate) const fn primitive_into_inner(self) -> *mut T {
2258+
self.value
2259+
}
2260+
}
2261+
22202262
/// [`UnsafeCell`], but [`Sync`].
22212263
///
22222264
/// This is just an `UnsafeCell`, except it implements `Sync`

library/core/src/intrinsics.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -2704,17 +2704,17 @@ pub const unsafe fn typed_swap<T>(x: *mut T, y: *mut T) {
27042704
}
27052705

27062706
/// Returns whether we should perform some UB-checking at runtime. This eventually evaluates to
2707-
/// `cfg!(debug_assertions)`, but behaves different from `cfg!` when mixing crates built with different
2708-
/// flags: if the crate has debug assertions enabled or carries the `#[rustc_preserve_ub_checks]`
2707+
/// `cfg!(ub_checks)`, but behaves different from `cfg!` when mixing crates built with different
2708+
/// flags: if the crate has UB checks enabled or carries the `#[rustc_preserve_ub_checks]`
27092709
/// attribute, evaluation is delayed until monomorphization (or until the call gets inlined into
27102710
/// a crate that does not delay evaluation further); otherwise it can happen any time.
27112711
///
2712-
/// The common case here is a user program built with debug_assertions linked against the distributed
2713-
/// sysroot which is built without debug_assertions but with `#[rustc_preserve_ub_checks]`.
2712+
/// The common case here is a user program built with ub_checks linked against the distributed
2713+
/// sysroot which is built without ub_checks but with `#[rustc_preserve_ub_checks]`.
27142714
/// For code that gets monomorphized in the user crate (i.e., generic functions and functions with
2715-
/// `#[inline]`), gating assertions on `ub_checks()` rather than `cfg!(debug_assertions)` means that
2716-
/// assertions are enabled whenever the *user crate* has debug assertions enabled. However if the
2717-
/// user has debug assertions disabled, the checks will still get optimized out. This intrinsic is
2715+
/// `#[inline]`), gating assertions on `ub_checks()` rather than `cfg!(ub_checks)` means that
2716+
/// assertions are enabled whenever the *user crate* has UB checks enabled. However if the
2717+
/// user has UB checks disabled, the checks will still get optimized out. This intrinsic is
27182718
/// primarily used by [`ub_checks::assert_unsafe_precondition`].
27192719
#[rustc_const_unstable(feature = "const_ub_checks", issue = "none")]
27202720
#[unstable(feature = "core_intrinsics", issue = "none")]

library/core/src/sync/atomic.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,9 @@ impl AtomicBool {
578578
/// ```
579579
#[inline]
580580
#[stable(feature = "atomic_access", since = "1.15.0")]
581-
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
581+
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "CURRENT_RUSTC_VERSION")]
582582
pub const fn into_inner(self) -> bool {
583-
self.v.into_inner() != 0
583+
self.v.primitive_into_inner() != 0
584584
}
585585

586586
/// Loads a value from the bool.
@@ -1397,9 +1397,9 @@ impl<T> AtomicPtr<T> {
13971397
/// ```
13981398
#[inline]
13991399
#[stable(feature = "atomic_access", since = "1.15.0")]
1400-
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
1400+
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "CURRENT_RUSTC_VERSION")]
14011401
pub const fn into_inner(self) -> *mut T {
1402-
self.p.into_inner()
1402+
self.p.primitive_into_inner()
14031403
}
14041404

14051405
/// Loads a value from the pointer.
@@ -2378,9 +2378,9 @@ macro_rules! atomic_int {
23782378
/// ```
23792379
#[inline]
23802380
#[$stable_access]
2381-
#[rustc_const_unstable(feature = "const_cell_into_inner", issue = "78729")]
2381+
#[rustc_const_stable(feature = "const_atomic_into_inner", since = "CURRENT_RUSTC_VERSION")]
23822382
pub const fn into_inner(self) -> $int_type {
2383-
self.v.into_inner()
2383+
self.v.primitive_into_inner()
23842384
}
23852385

23862386
/// Loads a value from the atomic integer.

library/test/src/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ pub fn test_main(args: &[String], tests: Vec<TestDescAndFn>, options: Option<Opt
140140
});
141141
panic::set_hook(hook);
142142
}
143-
match console::run_tests_console(&opts, tests) {
143+
let res = console::run_tests_console(&opts, tests);
144+
// Prevent Valgrind from reporting reachable blocks in users' unit tests.
145+
drop(panic::take_hook());
146+
match res {
144147
Ok(true) => {}
145148
Ok(false) => process::exit(ERROR_EXIT_CODE),
146149
Err(e) => {

src/doc/unstable-book/src/compiler-flags/check-cfg.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Those well known names and values follows the same stability as what they refer
7777
Well known names and values checking is always enabled as long as at least one
7878
`--check-cfg` argument is present.
7979
80-
As of `2024-02-15T`, the list of known names is as follows:
80+
As of `2024-04-06T`, the list of known names is as follows:
8181
8282
<!--- See CheckCfg::fill_well_known in compiler/rustc_session/src/config.rs -->
8383
@@ -107,6 +107,7 @@ As of `2024-02-15T`, the list of known names is as follows:
107107
- `target_thread_local`
108108
- `target_vendor`
109109
- `test`
110+
- `ub_checks`
110111
- `unix`
111112
- `windows`
112113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# `ub-checks`
2+
3+
The tracking issue for this feature is: [#123499](https://github.com/rust-lang/rust/issues/123499).
4+
5+
--------------------
6+
7+
The `-Zub-checks` compiler flag enables additional runtime checks that detect some causes of Undefined Behavior at runtime.
8+
By default, `-Zub-checks` flag inherits the value of `-Cdebug-assertions`.
9+
10+
All checks are generated on a best-effort basis; even if we have a check implemented for some cause of Undefined Behavior, it may be possible for the check to not fire.
11+
If a dependency is compiled with `-Zub-checks=no` but the final binary or library is compiled with `-Zub-checks=yes`, UB checks reached by the dependency are likely to be optimized out.
12+
13+
When `-Zub-checks` detects UB, a non-unwinding panic is produced.
14+
That means that we will not unwind the stack and will not call any `Drop` impls, but we will execute the configured panic hook.
15+
We expect that unsafe code has been written which relies on code not unwinding which may have UB checks inserted.
16+
Ergo, an unwinding panic could easily turn works-as-intended UB into a much bigger problem.
17+
Calling the panic hook theoretically has the same implications, but we expect that the standard library panic hook will be stateless enough to be always called, and that if a user has configured a panic hook that the hook may be very helpful to debugging the detected UB.

src/tools/tidy/src/allowed_run_make_makefiles.txt

-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,6 @@ run-make/use-suggestions-rust-2018/Makefile
321321
run-make/used-cdylib-macos/Makefile
322322
run-make/used/Makefile
323323
run-make/valid-print-requests/Makefile
324-
run-make/version/Makefile
325324
run-make/volatile-intrinsics/Makefile
326325
run-make/wasm-exceptions-nostd/Makefile
327326
run-make/wasm-override-linker/Makefile

src/tools/tidy/src/ui_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const ENTRY_LIMIT: usize = 900;
1818
// FIXME: The following limits should be reduced eventually.
1919

2020
const ISSUES_ENTRY_LIMIT: usize = 1733;
21-
const ROOT_ENTRY_LIMIT: usize = 860;
21+
const ROOT_ENTRY_LIMIT: usize = 861;
2222

2323
const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
2424
"rs", // test source files

tests/codegen/ub-checks.rs

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// With -Zub-checks=yes (enabled by default by -Cdebug-assertions=yes) we will produce a runtime
2+
// check that the index to slice::get_unchecked is in-bounds of the slice. That is tested for by
3+
// tests/ui/precondition-checks/out-of-bounds-get-unchecked.rs
4+
//
5+
// This test ensures that such a runtime check is *not* emitted when debug-assertions are enabled,
6+
// but ub-checks are explicitly disabled.
7+
8+
//@ revisions: DEBUG NOCHECKS
9+
//@ [DEBUG] compile-flags:
10+
//@ [NOCHECKS] compile-flags: -Zub-checks=no
11+
//@ compile-flags: -O -Cdebug-assertions=yes
12+
13+
#![crate_type = "lib"]
14+
15+
use std::ops::Range;
16+
17+
// CHECK-LABEL: @slice_get_unchecked(
18+
#[no_mangle]
19+
pub unsafe fn slice_get_unchecked(x: &[i32], i: usize) -> &i32 {
20+
// CHECK: icmp ult
21+
// NOCHECKS: tail call void @llvm.assume
22+
// DEBUG: br i1
23+
// DEBUG: call core::panicking::panic_nounwind
24+
// DEBUG: unreachable
25+
// CHECK: getelementptr inbounds
26+
// CHECK: ret ptr
27+
x.get_unchecked(i)
28+
}

tests/run-make/version/Makefile

-6
This file was deleted.

tests/ui/check-cfg/allow-same-level.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `FALSE`
44
LL | #[cfg(FALSE)]
55
| ^^^^^
66
|
7-
= help: expected names are: `clippy`, `debug_assertions`, `doc`, `doctest`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `unix`, `windows`
7+
= help: expected names are: `clippy`, `debug_assertions`, `doc`, `doctest`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `sanitizer_cfi_generalize_pointers`, `sanitizer_cfi_normalize_integers`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `ub_checks`, `unix`, `windows`
88
= help: to expect this configuration use `--check-cfg=cfg(FALSE)`
99
= note: see <https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/check-cfg.html> for more information about checking conditional configuration
1010
= note: `#[warn(unexpected_cfgs)]` on by default

0 commit comments

Comments
 (0)