Skip to content

Commit 3be7537

Browse files
committed
Auto merge of rust-lang#141717 - jhpratt:rollup-neu8nzl, r=jhpratt
Rollup of 4 pull requests Successful merges: - rust-lang#138285 (Stabilize `repr128`) - rust-lang#139994 (add `CStr::display`) - rust-lang#141571 (coretests: extend and simplify float tests) - rust-lang#141656 (CI: Add cargo tests to aarch64-apple-darwin) Failed merges: - rust-lang#141430 (remove `visit_clobber` and move `DummyAstNode` to `rustc_expand`) - rust-lang#141636 (avoid some usages of `&mut P<T>` in AST visitors) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 835b73c + 8353439 commit 3be7537

File tree

4 files changed

+145
-135
lines changed

4 files changed

+145
-135
lines changed

core/src/ffi/c_str.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,30 @@ impl CStr {
632632
// instead of doing it afterwards.
633633
str::from_utf8(self.to_bytes())
634634
}
635+
636+
/// Returns an object that implements [`Display`] for safely printing a [`CStr`] that may
637+
/// contain non-Unicode data.
638+
///
639+
/// Behaves as if `self` were first lossily converted to a `str`, with invalid UTF-8 presented
640+
/// as the Unicode replacement character: �.
641+
///
642+
/// [`Display`]: fmt::Display
643+
///
644+
/// # Examples
645+
///
646+
/// ```
647+
/// #![feature(cstr_display)]
648+
///
649+
/// let cstr = c"Hello, world!";
650+
/// println!("{}", cstr.display());
651+
/// ```
652+
#[unstable(feature = "cstr_display", issue = "139984")]
653+
#[must_use = "this does not display the `CStr`; \
654+
it returns an object that can be displayed"]
655+
#[inline]
656+
pub fn display(&self) -> impl fmt::Display {
657+
crate::bstr::ByteStr::from_bytes(self.to_bytes())
658+
}
635659
}
636660

637661
// `.to_bytes()` representations are compared instead of the inner `[c_char]`s,

coretests/tests/ffi/cstr.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,9 @@ fn debug() {
1919
let s = c"abc\x01\x02\n\xE2\x80\xA6\xFF";
2020
assert_eq!(format!("{s:?}"), r#""abc\x01\x02\n\xe2\x80\xa6\xff""#);
2121
}
22+
23+
#[test]
24+
fn display() {
25+
let s = c"\xf0\x28\x8c\xbc";
26+
assert_eq!(format!("{}", s.display()), "�(��");
27+
}

coretests/tests/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#![feature(core_io_borrowed_buf)]
2424
#![feature(core_private_bignum)]
2525
#![feature(core_private_diy_float)]
26+
#![feature(cstr_display)]
2627
#![feature(dec2flt)]
2728
#![feature(duration_constants)]
2829
#![feature(duration_constructors)]

coretests/tests/num/mod.rs

Lines changed: 114 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ assume_usize_width! {
732732
}
733733

734734
macro_rules! test_float {
735-
($modname: ident, $fassert: ident, $fty: ty, $inf: expr, $neginf: expr, $nan: expr, $min: expr, $max: expr, $min_pos: expr, $max_exp:expr) => {
735+
($modname: ident, $fassert: ident, $fty: ty) => {
736736
mod $modname {
737737
#[test]
738738
fn min() {
@@ -747,19 +747,19 @@ macro_rules! test_float {
747747
$fassert!((-0.0 as $fty).min(9.0), -0.0);
748748
$fassert!((-0.0 as $fty).min(9.0).is_sign_negative());
749749
$fassert!((-0.0 as $fty).min(-9.0), -9.0);
750-
$fassert!(($inf as $fty).min(9.0), 9.0);
751-
$fassert!((9.0 as $fty).min($inf), 9.0);
752-
$fassert!(($inf as $fty).min(-9.0), -9.0);
753-
$fassert!((-9.0 as $fty).min($inf), -9.0);
754-
$fassert!(($neginf as $fty).min(9.0), $neginf);
755-
$fassert!((9.0 as $fty).min($neginf), $neginf);
756-
$fassert!(($neginf as $fty).min(-9.0), $neginf);
757-
$fassert!((-9.0 as $fty).min($neginf), $neginf);
758-
$fassert!(($nan as $fty).min(9.0), 9.0);
759-
$fassert!(($nan as $fty).min(-9.0), -9.0);
760-
$fassert!((9.0 as $fty).min($nan), 9.0);
761-
$fassert!((-9.0 as $fty).min($nan), -9.0);
762-
$fassert!(($nan as $fty).min($nan).is_nan());
750+
$fassert!(<$fty>::INFINITY.min(9.0), 9.0);
751+
$fassert!((9.0 as $fty).min(<$fty>::INFINITY), 9.0);
752+
$fassert!(<$fty>::INFINITY.min(-9.0), -9.0);
753+
$fassert!((-9.0 as $fty).min(<$fty>::INFINITY), -9.0);
754+
$fassert!(<$fty>::NEG_INFINITY.min(9.0), <$fty>::NEG_INFINITY);
755+
$fassert!((9.0 as $fty).min(<$fty>::NEG_INFINITY), <$fty>::NEG_INFINITY);
756+
$fassert!(<$fty>::NEG_INFINITY.min(-9.0), <$fty>::NEG_INFINITY);
757+
$fassert!((-9.0 as $fty).min(<$fty>::NEG_INFINITY), <$fty>::NEG_INFINITY);
758+
$fassert!(<$fty>::NAN.min(9.0), 9.0);
759+
$fassert!(<$fty>::NAN.min(-9.0), -9.0);
760+
$fassert!((9.0 as $fty).min(<$fty>::NAN), 9.0);
761+
$fassert!((-9.0 as $fty).min(<$fty>::NAN), -9.0);
762+
$fassert!(<$fty>::NAN.min(<$fty>::NAN).is_nan());
763763
}
764764
#[test]
765765
fn max() {
@@ -777,19 +777,19 @@ macro_rules! test_float {
777777
$fassert!((0.0 as $fty).max(-9.0).is_sign_positive());
778778
$fassert!((-0.0 as $fty).max(-9.0), -0.0);
779779
$fassert!((-0.0 as $fty).max(-9.0).is_sign_negative());
780-
$fassert!(($inf as $fty).max(9.0), $inf);
781-
$fassert!((9.0 as $fty).max($inf), $inf);
782-
$fassert!(($inf as $fty).max(-9.0), $inf);
783-
$fassert!((-9.0 as $fty).max($inf), $inf);
784-
$fassert!(($neginf as $fty).max(9.0), 9.0);
785-
$fassert!((9.0 as $fty).max($neginf), 9.0);
786-
$fassert!(($neginf as $fty).max(-9.0), -9.0);
787-
$fassert!((-9.0 as $fty).max($neginf), -9.0);
788-
$fassert!(($nan as $fty).max(9.0), 9.0);
789-
$fassert!(($nan as $fty).max(-9.0), -9.0);
790-
$fassert!((9.0 as $fty).max($nan), 9.0);
791-
$fassert!((-9.0 as $fty).max($nan), -9.0);
792-
$fassert!(($nan as $fty).max($nan).is_nan());
780+
$fassert!(<$fty>::INFINITY.max(9.0), <$fty>::INFINITY);
781+
$fassert!((9.0 as $fty).max(<$fty>::INFINITY), <$fty>::INFINITY);
782+
$fassert!(<$fty>::INFINITY.max(-9.0), <$fty>::INFINITY);
783+
$fassert!((-9.0 as $fty).max(<$fty>::INFINITY), <$fty>::INFINITY);
784+
$fassert!(<$fty>::NEG_INFINITY.max(9.0), 9.0);
785+
$fassert!((9.0 as $fty).max(<$fty>::NEG_INFINITY), 9.0);
786+
$fassert!(<$fty>::NEG_INFINITY.max(-9.0), -9.0);
787+
$fassert!((-9.0 as $fty).max(<$fty>::NEG_INFINITY), -9.0);
788+
$fassert!(<$fty>::NAN.max(9.0), 9.0);
789+
$fassert!(<$fty>::NAN.max(-9.0), -9.0);
790+
$fassert!((9.0 as $fty).max(<$fty>::NAN), 9.0);
791+
$fassert!((-9.0 as $fty).max(<$fty>::NAN), -9.0);
792+
$fassert!(<$fty>::NAN.max(<$fty>::NAN).is_nan());
793793
}
794794
#[test]
795795
fn minimum() {
@@ -806,19 +806,19 @@ macro_rules! test_float {
806806
$fassert!((-0.0 as $fty).minimum(9.0), -0.0);
807807
$fassert!((-0.0 as $fty).minimum(9.0).is_sign_negative());
808808
$fassert!((-0.0 as $fty).minimum(-9.0), -9.0);
809-
$fassert!(($inf as $fty).minimum(9.0), 9.0);
810-
$fassert!((9.0 as $fty).minimum($inf), 9.0);
811-
$fassert!(($inf as $fty).minimum(-9.0), -9.0);
812-
$fassert!((-9.0 as $fty).minimum($inf), -9.0);
813-
$fassert!(($neginf as $fty).minimum(9.0), $neginf);
814-
$fassert!((9.0 as $fty).minimum($neginf), $neginf);
815-
$fassert!(($neginf as $fty).minimum(-9.0), $neginf);
816-
$fassert!((-9.0 as $fty).minimum($neginf), $neginf);
817-
$fassert!(($nan as $fty).minimum(9.0).is_nan());
818-
$fassert!(($nan as $fty).minimum(-9.0).is_nan());
819-
$fassert!((9.0 as $fty).minimum($nan).is_nan());
820-
$fassert!((-9.0 as $fty).minimum($nan).is_nan());
821-
$fassert!(($nan as $fty).minimum($nan).is_nan());
809+
$fassert!(<$fty>::INFINITY.minimum(9.0), 9.0);
810+
$fassert!((9.0 as $fty).minimum(<$fty>::INFINITY), 9.0);
811+
$fassert!(<$fty>::INFINITY.minimum(-9.0), -9.0);
812+
$fassert!((-9.0 as $fty).minimum(<$fty>::INFINITY), -9.0);
813+
$fassert!(<$fty>::NEG_INFINITY.minimum(9.0), <$fty>::NEG_INFINITY);
814+
$fassert!((9.0 as $fty).minimum(<$fty>::NEG_INFINITY), <$fty>::NEG_INFINITY);
815+
$fassert!(<$fty>::NEG_INFINITY.minimum(-9.0), <$fty>::NEG_INFINITY);
816+
$fassert!((-9.0 as $fty).minimum(<$fty>::NEG_INFINITY), <$fty>::NEG_INFINITY);
817+
$fassert!(<$fty>::NAN.minimum(9.0).is_nan());
818+
$fassert!(<$fty>::NAN.minimum(-9.0).is_nan());
819+
$fassert!((9.0 as $fty).minimum(<$fty>::NAN).is_nan());
820+
$fassert!((-9.0 as $fty).minimum(<$fty>::NAN).is_nan());
821+
$fassert!(<$fty>::NAN.minimum(<$fty>::NAN).is_nan());
822822
}
823823
#[test]
824824
fn maximum() {
@@ -838,19 +838,19 @@ macro_rules! test_float {
838838
$fassert!((0.0 as $fty).maximum(-9.0).is_sign_positive());
839839
$fassert!((-0.0 as $fty).maximum(-9.0), -0.0);
840840
$fassert!((-0.0 as $fty).maximum(-9.0).is_sign_negative());
841-
$fassert!(($inf as $fty).maximum(9.0), $inf);
842-
$fassert!((9.0 as $fty).maximum($inf), $inf);
843-
$fassert!(($inf as $fty).maximum(-9.0), $inf);
844-
$fassert!((-9.0 as $fty).maximum($inf), $inf);
845-
$fassert!(($neginf as $fty).maximum(9.0), 9.0);
846-
$fassert!((9.0 as $fty).maximum($neginf), 9.0);
847-
$fassert!(($neginf as $fty).maximum(-9.0), -9.0);
848-
$fassert!((-9.0 as $fty).maximum($neginf), -9.0);
849-
$fassert!(($nan as $fty).maximum(9.0).is_nan());
850-
$fassert!(($nan as $fty).maximum(-9.0).is_nan());
851-
$fassert!((9.0 as $fty).maximum($nan).is_nan());
852-
$fassert!((-9.0 as $fty).maximum($nan).is_nan());
853-
$fassert!(($nan as $fty).maximum($nan).is_nan());
841+
$fassert!(<$fty>::INFINITY.maximum(9.0), <$fty>::INFINITY);
842+
$fassert!((9.0 as $fty).maximum(<$fty>::INFINITY), <$fty>::INFINITY);
843+
$fassert!(<$fty>::INFINITY.maximum(-9.0), <$fty>::INFINITY);
844+
$fassert!((-9.0 as $fty).maximum(<$fty>::INFINITY), <$fty>::INFINITY);
845+
$fassert!(<$fty>::NEG_INFINITY.maximum(9.0), 9.0);
846+
$fassert!((9.0 as $fty).maximum(<$fty>::NEG_INFINITY), 9.0);
847+
$fassert!(<$fty>::NEG_INFINITY.maximum(-9.0), -9.0);
848+
$fassert!((-9.0 as $fty).maximum(<$fty>::NEG_INFINITY), -9.0);
849+
$fassert!(<$fty>::NAN.maximum(9.0).is_nan());
850+
$fassert!(<$fty>::NAN.maximum(-9.0).is_nan());
851+
$fassert!((9.0 as $fty).maximum(<$fty>::NAN).is_nan());
852+
$fassert!((-9.0 as $fty).maximum(<$fty>::NAN).is_nan());
853+
$fassert!(<$fty>::NAN.maximum(<$fty>::NAN).is_nan());
854854
}
855855
#[test]
856856
fn midpoint() {
@@ -863,38 +863,47 @@ macro_rules! test_float {
863863
$fassert!((0.0 as $fty).midpoint(0.0), 0.0);
864864
$fassert!((-0.0 as $fty).midpoint(-0.0), -0.0);
865865
$fassert!((-5.0 as $fty).midpoint(5.0), 0.0);
866-
$fassert!(($max as $fty).midpoint($min), 0.0);
867-
$fassert!(($min as $fty).midpoint($max), -0.0);
868-
$fassert!(($max as $fty).midpoint($min_pos), $max / 2.);
869-
$fassert!((-$max as $fty).midpoint($min_pos), -$max / 2.);
870-
$fassert!(($max as $fty).midpoint(-$min_pos), $max / 2.);
871-
$fassert!((-$max as $fty).midpoint(-$min_pos), -$max / 2.);
872-
$fassert!(($min_pos as $fty).midpoint($max), $max / 2.);
873-
$fassert!(($min_pos as $fty).midpoint(-$max), -$max / 2.);
874-
$fassert!((-$min_pos as $fty).midpoint($max), $max / 2.);
875-
$fassert!((-$min_pos as $fty).midpoint(-$max), -$max / 2.);
876-
$fassert!(($max as $fty).midpoint($max), $max);
877-
$fassert!(($min_pos as $fty).midpoint($min_pos), $min_pos);
878-
$fassert!((-$min_pos as $fty).midpoint(-$min_pos), -$min_pos);
879-
$fassert!(($max as $fty).midpoint(5.0), $max / 2.0 + 2.5);
880-
$fassert!(($max as $fty).midpoint(-5.0), $max / 2.0 - 2.5);
881-
$fassert!(($inf as $fty).midpoint($inf), $inf);
882-
$fassert!(($neginf as $fty).midpoint($neginf), $neginf);
883-
$fassert!(($nan as $fty).midpoint(1.0).is_nan());
884-
$fassert!((1.0 as $fty).midpoint($nan).is_nan());
885-
$fassert!(($nan as $fty).midpoint($nan).is_nan());
866+
$fassert!(<$fty>::MAX.midpoint(<$fty>::MIN), 0.0);
867+
$fassert!(<$fty>::MIN.midpoint(<$fty>::MAX), -0.0);
868+
$fassert!(<$fty>::MAX.midpoint(<$fty>::MIN_POSITIVE), <$fty>::MAX / 2.);
869+
$fassert!((-<$fty>::MAX).midpoint(<$fty>::MIN_POSITIVE), -<$fty>::MAX / 2.);
870+
$fassert!(<$fty>::MAX.midpoint(-<$fty>::MIN_POSITIVE), <$fty>::MAX / 2.);
871+
$fassert!((-<$fty>::MAX).midpoint(-<$fty>::MIN_POSITIVE), -<$fty>::MAX / 2.);
872+
$fassert!((<$fty>::MIN_POSITIVE).midpoint(<$fty>::MAX), <$fty>::MAX / 2.);
873+
$fassert!((<$fty>::MIN_POSITIVE).midpoint(-<$fty>::MAX), -<$fty>::MAX / 2.);
874+
$fassert!((-<$fty>::MIN_POSITIVE).midpoint(<$fty>::MAX), <$fty>::MAX / 2.);
875+
$fassert!((-<$fty>::MIN_POSITIVE).midpoint(-<$fty>::MAX), -<$fty>::MAX / 2.);
876+
$fassert!(<$fty>::MAX.midpoint(<$fty>::MAX), <$fty>::MAX);
877+
$fassert!(
878+
(<$fty>::MIN_POSITIVE).midpoint(<$fty>::MIN_POSITIVE),
879+
<$fty>::MIN_POSITIVE
880+
);
881+
$fassert!(
882+
(-<$fty>::MIN_POSITIVE).midpoint(-<$fty>::MIN_POSITIVE),
883+
-<$fty>::MIN_POSITIVE
884+
);
885+
$fassert!(<$fty>::MAX.midpoint(5.0), <$fty>::MAX / 2.0 + 2.5);
886+
$fassert!(<$fty>::MAX.midpoint(-5.0), <$fty>::MAX / 2.0 - 2.5);
887+
$fassert!(<$fty>::INFINITY.midpoint(<$fty>::INFINITY), <$fty>::INFINITY);
888+
$fassert!(
889+
<$fty>::NEG_INFINITY.midpoint(<$fty>::NEG_INFINITY),
890+
<$fty>::NEG_INFINITY
891+
);
892+
$fassert!(<$fty>::NAN.midpoint(1.0).is_nan());
893+
$fassert!((1.0 as $fty).midpoint(<$fty>::NAN).is_nan());
894+
$fassert!(<$fty>::NAN.midpoint(<$fty>::NAN).is_nan());
886895

887896
// test if large differences in magnitude are still correctly computed.
888897
// NOTE: that because of how small x and y are, x + y can never overflow
889898
// so (x + y) / 2.0 is always correct
890899
// in particular, `2.pow(i)` will never be at the max exponent, so it could
891900
// be safely doubled, while j is significantly smaller.
892-
for i in $max_exp.saturating_sub(64)..$max_exp {
901+
for i in <$fty>::MAX_EXP.saturating_sub(64)..<$fty>::MAX_EXP {
893902
for j in 0..64u8 {
894-
let large = <$fty>::from(2.0f32).powi(i);
903+
let large = (2.0 as $fty).powi(i);
895904
// a much smaller number, such that there is no chance of overflow to test
896905
// potential double rounding in midpoint's implementation.
897-
let small = <$fty>::from(2.0f32).powi($max_exp - 1)
906+
let small = (2.0 as $fty).powi(<$fty>::MAX_EXP - 1)
898907
* <$fty>::EPSILON
899908
* <$fty>::from(j);
900909

@@ -906,23 +915,37 @@ macro_rules! test_float {
906915
}
907916
}
908917
#[test]
918+
fn abs() {
919+
$fassert!((-1.0 as $fty).abs(), 1.0);
920+
$fassert!((1.0 as $fty).abs(), 1.0);
921+
$fassert!(<$fty>::NEG_INFINITY.abs(), <$fty>::INFINITY);
922+
$fassert!(<$fty>::INFINITY.abs(), <$fty>::INFINITY);
923+
}
924+
#[test]
925+
fn copysign() {
926+
$fassert!((1.0 as $fty).copysign(-2.0), -1.0);
927+
$fassert!((-1.0 as $fty).copysign(2.0), 1.0);
928+
$fassert!(<$fty>::INFINITY.copysign(-0.0), <$fty>::NEG_INFINITY);
929+
$fassert!(<$fty>::NEG_INFINITY.copysign(0.0), <$fty>::INFINITY);
930+
}
931+
#[test]
909932
fn rem_euclid() {
910933
// FIXME: Use $fassert when rem_euclid becomes const
911-
assert!($inf.rem_euclid((42.0 as $fty)).is_nan());
912-
assert_eq!((42.0 as $fty).rem_euclid($inf), (42.0 as $fty));
913-
assert!((42.0 as $fty).rem_euclid($nan).is_nan());
914-
assert!($inf.rem_euclid($inf).is_nan());
915-
assert!($inf.rem_euclid($nan).is_nan());
916-
assert!($nan.rem_euclid($inf).is_nan());
934+
assert!(<$fty>::INFINITY.rem_euclid((42.0 as $fty)).is_nan());
935+
assert_eq!((42.0 as $fty).rem_euclid(<$fty>::INFINITY), (42.0 as $fty));
936+
assert!((42.0 as $fty).rem_euclid(<$fty>::NAN).is_nan());
937+
assert!(<$fty>::INFINITY.rem_euclid(<$fty>::INFINITY).is_nan());
938+
assert!(<$fty>::INFINITY.rem_euclid(<$fty>::NAN).is_nan());
939+
assert!(<$fty>::NAN.rem_euclid(<$fty>::INFINITY).is_nan());
917940
}
918941
#[test]
919942
fn div_euclid() {
920943
// FIXME: Use $fassert when div_euclid becomes const
921-
assert_eq!((42.0 as $fty).div_euclid($inf), 0.0);
922-
assert!((42.0 as $fty).div_euclid($nan).is_nan());
923-
assert!($inf.div_euclid($inf).is_nan());
924-
assert!($inf.div_euclid($nan).is_nan());
925-
assert!($nan.div_euclid($inf).is_nan());
944+
assert_eq!((42.0 as $fty).div_euclid(<$fty>::INFINITY), 0.0);
945+
assert!((42.0 as $fty).div_euclid(<$fty>::NAN).is_nan());
946+
assert!(<$fty>::INFINITY.div_euclid(<$fty>::INFINITY).is_nan());
947+
assert!(<$fty>::INFINITY.div_euclid(<$fty>::NAN).is_nan());
948+
assert!(<$fty>::NAN.div_euclid(<$fty>::INFINITY).is_nan());
926949
}
927950
}
928951
};
@@ -948,51 +971,7 @@ macro_rules! float_const_assert {
948971
};
949972
}
950973

951-
test_float!(
952-
f32,
953-
float_assert,
954-
f32,
955-
f32::INFINITY,
956-
f32::NEG_INFINITY,
957-
f32::NAN,
958-
f32::MIN,
959-
f32::MAX,
960-
f32::MIN_POSITIVE,
961-
f32::MAX_EXP
962-
);
963-
test_float!(
964-
f32_const,
965-
float_const_assert,
966-
f32,
967-
f32::INFINITY,
968-
f32::NEG_INFINITY,
969-
f32::NAN,
970-
f32::MIN,
971-
f32::MAX,
972-
f32::MIN_POSITIVE,
973-
f32::MAX_EXP
974-
);
975-
test_float!(
976-
f64,
977-
float_assert,
978-
f64,
979-
f64::INFINITY,
980-
f64::NEG_INFINITY,
981-
f64::NAN,
982-
f64::MIN,
983-
f64::MAX,
984-
f64::MIN_POSITIVE,
985-
f64::MAX_EXP
986-
);
987-
test_float!(
988-
f64_const,
989-
float_const_assert,
990-
f64,
991-
f64::INFINITY,
992-
f64::NEG_INFINITY,
993-
f64::NAN,
994-
f64::MIN,
995-
f64::MAX,
996-
f64::MIN_POSITIVE,
997-
f64::MAX_EXP
998-
);
974+
test_float!(f32, float_assert, f32);
975+
test_float!(f32_const, float_const_assert, f32);
976+
test_float!(f64, float_assert, f64);
977+
test_float!(f64_const, float_const_assert, f64);

0 commit comments

Comments
 (0)