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

Commit 7b0bf9e

Browse files
committed
Auto merge of rust-lang#95223 - Dylan-DPC:rollup-idpb7ka, r=Dylan-DPC
Rollup of 6 pull requests Successful merges: - rust-lang#91608 (Fold aarch64 feature +fp into +neon) - rust-lang#92955 (add perf side effect docs to `Iterator::cloned()`) - rust-lang#94713 (Add u16::is_utf16_surrogate) - rust-lang#95212 (Replace `this.clone()` with `this.create_snapshot_for_diagnostic()`) - rust-lang#95219 (Modernize `alloc-no-oom-handling` test) - rust-lang#95222 (interpret/validity: improve clarity) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2 parents 2b50739 + 2f24923 commit 7b0bf9e

File tree

16 files changed

+206
-21
lines changed

16 files changed

+206
-21
lines changed

compiler/rustc_codegen_llvm/src/llvm_util.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ pub fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> SmallVec<[&'a str; 2]
187187
("x86", "avx512vaes") => smallvec!["vaes"],
188188
("x86", "avx512gfni") => smallvec!["gfni"],
189189
("x86", "avx512vpclmulqdq") => smallvec!["vpclmulqdq"],
190-
("aarch64", "fp") => smallvec!["fp-armv8"],
191190
("aarch64", "rcpc2") => smallvec!["rcpc-immo"],
192191
("aarch64", "dpb") => smallvec!["ccpp"],
193192
("aarch64", "dpb2") => smallvec!["ccdp"],
@@ -230,6 +229,8 @@ pub fn check_tied_features(
230229
None
231230
}
232231

232+
// Used to generate cfg variables and apply features
233+
// Must express features in the way Rust understands them
233234
pub fn target_features(sess: &Session) -> Vec<Symbol> {
234235
let target_machine = create_informational_target_machine(sess);
235236
let mut features: Vec<Symbol> =
@@ -239,13 +240,14 @@ pub fn target_features(sess: &Session) -> Vec<Symbol> {
239240
if sess.is_nightly_build() || gate.is_none() { Some(feature) } else { None }
240241
})
241242
.filter(|feature| {
243+
// check that all features in a given smallvec are enabled
242244
for llvm_feature in to_llvm_features(sess, feature) {
243245
let cstr = SmallCStr::new(llvm_feature);
244-
if unsafe { llvm::LLVMRustHasFeature(target_machine, cstr.as_ptr()) } {
245-
return true;
246+
if !unsafe { llvm::LLVMRustHasFeature(target_machine, cstr.as_ptr()) } {
247+
return false;
246248
}
247249
}
248-
false
250+
true
249251
})
250252
.map(|feature| Symbol::intern(feature))
251253
.collect();

compiler/rustc_codegen_ssa/src/target_features.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,8 @@ const ARM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
4343
];
4444

4545
const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
46-
// FEAT_AdvSimd
46+
// FEAT_AdvSimd & FEAT_FP
4747
("neon", None),
48-
// FEAT_FP
49-
("fp", None),
5048
// FEAT_FP16
5149
("fp16", None),
5250
// FEAT_SVE
@@ -143,7 +141,6 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
143141
];
144142

145143
const AARCH64_TIED_FEATURES: &[&[&str]] = &[
146-
&["fp", "neon"], // Silicon always has both, so avoid needless complications
147144
&["paca", "pacg"], // Together these represent `pauth` in LLVM
148145
];
149146

compiler/rustc_const_eval/src/interpret/validity.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,8 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
432432
if let Some(ref mut ref_tracking) = self.ref_tracking {
433433
// Proceed recursively even for ZST, no reason to skip them!
434434
// `!` is a ZST and we want to validate it.
435-
// Skip validation entirely for some external statics
436435
if let Ok((alloc_id, _offset, _ptr)) = self.ecx.memory.ptr_try_get_alloc(place.ptr) {
437-
// not a ZST
436+
// Special handling for pointers to statics (irrespective of their type).
438437
let alloc_kind = self.ecx.tcx.get_global_alloc(alloc_id);
439438
if let Some(GlobalAlloc::Static(did)) = alloc_kind {
440439
assert!(!self.ecx.tcx.is_thread_local_static(did));
@@ -469,7 +468,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
469468
// We need to clone the path anyway, make sure it gets created
470469
// with enough space for the additional `Deref`.
471470
let mut new_path = Vec::with_capacity(path.len() + 1);
472-
new_path.clone_from(path);
471+
new_path.extend(path);
473472
new_path.push(PathElem::Deref);
474473
new_path
475474
});

compiler/rustc_parse/src/parser/generics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ impl<'a> Parser<'a> {
118118
Some(this.parse_ty_param(attrs)?)
119119
} else if this.token.can_begin_type() {
120120
// Trying to write an associated type bound? (#26271)
121-
let snapshot = this.clone();
121+
let snapshot = this.create_snapshot_for_diagnostic();
122122
match this.parse_ty_where_predicate() {
123123
Ok(where_predicate) => {
124124
this.struct_span_err(
@@ -133,7 +133,7 @@ impl<'a> Parser<'a> {
133133
Err(err) => {
134134
err.cancel();
135135
// FIXME - maybe we should overwrite 'self' outside of `collect_tokens`?
136-
*this = snapshot;
136+
this.restore_snapshot(snapshot);
137137
return Ok((None, TrailingToken::None));
138138
}
139139
}

compiler/rustc_target/src/asm/aarch64.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl AArch64InlineAsmRegClass {
6464
match self {
6565
Self::reg => types! { _: I8, I16, I32, I64, F32, F64; },
6666
Self::vreg | Self::vreg_low16 => types! {
67-
fp: I8, I16, I32, I64, F32, F64,
67+
neon: I8, I16, I32, I64, F32, F64,
6868
VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2), VecF64(1),
6969
VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4), VecF64(2);
7070
},

library/core/src/char/decode.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ impl<I: Iterator<Item = u16>> Iterator for DecodeUtf16<I> {
9191
None => self.iter.next()?,
9292
};
9393

94-
if u < 0xD800 || 0xDFFF < u {
94+
if !u.is_utf16_surrogate() {
9595
// SAFETY: not a surrogate
9696
Some(Ok(unsafe { from_u32_unchecked(u as u32) }))
9797
} else if u >= 0xDC00 {
@@ -125,7 +125,7 @@ impl<I: Iterator<Item = u16>> Iterator for DecodeUtf16<I> {
125125
// buf is empty, no additional elements from it.
126126
None => (0, 0),
127127
// `u` is a non surrogate, so it's always an additional character.
128-
Some(u) if u < 0xD800 || 0xDFFF < u => (1, 1),
128+
Some(u) if !u.is_utf16_surrogate() => (1, 1),
129129
// `u` is a leading surrogate (it can never be a trailing surrogate and
130130
// it's a surrogate due to the previous branch) and `self.iter` is empty.
131131
//

library/core/src/iter/traits/iterator.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3189,6 +3189,10 @@ pub trait Iterator {
31893189
/// This is useful when you have an iterator over `&T`, but you need an
31903190
/// iterator over `T`.
31913191
///
3192+
/// There is no guarantee whatsoever about the `clone` method actually
3193+
/// being called *or* optimized away. So code should not depend on
3194+
/// either.
3195+
///
31923196
/// [`clone`]: Clone::clone
31933197
///
31943198
/// # Examples
@@ -3206,6 +3210,18 @@ pub trait Iterator {
32063210
/// assert_eq!(v_cloned, vec![1, 2, 3]);
32073211
/// assert_eq!(v_map, vec![1, 2, 3]);
32083212
/// ```
3213+
///
3214+
/// To get the best performance, try to clone late:
3215+
///
3216+
/// ```
3217+
/// let a = [vec![0_u8, 1, 2], vec![3, 4], vec![23]];
3218+
/// // don't do this:
3219+
/// let slower: Vec<_> = a.iter().cloned().filter(|s| s.len() == 1).collect();
3220+
/// assert_eq!(&[vec![23]], &slower[..]);
3221+
/// // instead call `cloned` late
3222+
/// let faster: Vec<_> = a.iter().filter(|s| s.len() == 1).cloned().collect();
3223+
/// assert_eq!(&[vec![23]], &faster[..]);
3224+
/// ```
32093225
#[stable(feature = "rust1", since = "1.0.0")]
32103226
fn cloned<'a, T: 'a>(self) -> Cloned<Self>
32113227
where

library/core/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
#![warn(missing_docs)]
9494
#![allow(explicit_outlives_requirements)]
9595
//
96-
// Library features for const fns:
96+
// Library features:
9797
#![feature(const_align_offset)]
9898
#![feature(const_align_of_val)]
9999
#![feature(const_alloc_layout)]
@@ -146,6 +146,8 @@
146146
#![feature(ptr_metadata)]
147147
#![feature(slice_ptr_get)]
148148
#![feature(str_internals)]
149+
#![feature(utf16_extra)]
150+
#![feature(utf16_extra_const)]
149151
#![feature(variant_count)]
150152
#![feature(const_array_from_ref)]
151153
#![feature(const_slice_from_ref)]

library/core/src/num/mod.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,31 @@ impl u16 {
820820
uint_impl! { u16, u16, i16, NonZeroU16, 16, 65535, 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
821821
"[0x34, 0x12]", "[0x12, 0x34]", "", "" }
822822
widening_impl! { u16, u32, 16, unsigned }
823+
824+
/// Checks if the value is a Unicode surrogate code point, which are disallowed values for [`char`].
825+
///
826+
/// # Examples
827+
///
828+
/// ```
829+
/// #![feature(utf16_extra)]
830+
///
831+
/// let low_non_surrogate = 0xA000u16;
832+
/// let low_surrogate = 0xD800u16;
833+
/// let high_surrogate = 0xDC00u16;
834+
/// let high_non_surrogate = 0xE000u16;
835+
///
836+
/// assert!(!low_non_surrogate.is_utf16_surrogate());
837+
/// assert!(low_surrogate.is_utf16_surrogate());
838+
/// assert!(high_surrogate.is_utf16_surrogate());
839+
/// assert!(!high_non_surrogate.is_utf16_surrogate());
840+
/// ```
841+
#[must_use]
842+
#[unstable(feature = "utf16_extra", issue = "94919")]
843+
#[rustc_const_unstable(feature = "utf16_extra_const", issue = "94919")]
844+
#[inline]
845+
pub const fn is_utf16_surrogate(self) -> bool {
846+
matches!(self, 0xD800..=0xDFFF)
847+
}
823848
}
824849

825850
#[lang = "u32"]

library/std/tests/run-time-detect.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ fn aarch64_linux() {
2929
println!("neon: {}", is_aarch64_feature_detected!("neon"));
3030
println!("asimd: {}", is_aarch64_feature_detected!("asimd"));
3131
println!("pmull: {}", is_aarch64_feature_detected!("pmull"));
32-
println!("fp: {}", is_aarch64_feature_detected!("fp"));
3332
println!("fp16: {}", is_aarch64_feature_detected!("fp16"));
3433
println!("sve: {}", is_aarch64_feature_detected!("sve"));
3534
println!("crc: {}", is_aarch64_feature_detected!("crc"));

0 commit comments

Comments
 (0)