Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 0ab0b0b

Browse files
committedAug 16, 2024
Auto merge of #129142 - workingjubilee:rollup-7sspo84, r=workingjubilee
Rollup of 10 pull requests Successful merges: - #128064 (Improve docs for Waker::noop and LocalWaker::noop) - #128922 (rust-analyzer: use in-tree `pattern_analysis` crate) - #128965 (Remove `print::Pat` from the printing of `WitnessPat`) - #128977 (Only try to modify file times of a writable file on Windows) - #129018 (Migrate `rlib-format-packed-bundled-libs` and `native-link-modifier-bundle` `run-make` tests to rmake) - #129037 (Port `run-make/libtest-json` and `run-make/libtest-junit` to rmake) - #129078 (`ParamEnvAnd::fully_perform`: we have an `ocx`, use it) - #129110 (Add a comment explaining the return type of `Ty::kind`.) - #129111 (Port the `sysroot-crates-are-unstable` Python script to rmake) - #129135 (crashes: more tests) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 4b7d074 + 6593f0d commit 0ab0b0b

File tree

33 files changed

+608
-361
lines changed

33 files changed

+608
-361
lines changed
 

‎compiler/rustc_middle/src/ty/sty.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,10 @@ impl<'tcx> rustc_type_ir::inherent::Ty<TyCtxt<'tcx>> for Ty<'tcx> {
970970

971971
/// Type utilities
972972
impl<'tcx> Ty<'tcx> {
973+
// It would be nicer if this returned the value instead of a reference,
974+
// like how `Predicate::kind` and `Region::kind` do. (It would result in
975+
// many fewer subsequent dereferences.) But that gives a small but
976+
// noticeable performance hit. See #126069 for details.
973977
#[inline(always)]
974978
pub fn kind(self) -> &'tcx TyKind<'tcx> {
975979
self.0.0

‎compiler/rustc_pattern_analysis/src/rustc.rs‎

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -774,17 +774,16 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
774774
}
775775
}
776776

777-
/// Convert to a [`print::Pat`] for diagnostic purposes.
778-
fn hoist_pat_range(&self, range: &IntRange, ty: RevealedTy<'tcx>) -> print::Pat<'tcx> {
779-
use print::{Pat, PatKind};
777+
/// Prints an [`IntRange`] to a string for diagnostic purposes.
778+
fn print_pat_range(&self, range: &IntRange, ty: RevealedTy<'tcx>) -> String {
780779
use MaybeInfiniteInt::*;
781780
let cx = self;
782-
let kind = if matches!((range.lo, range.hi), (NegInfinity, PosInfinity)) {
783-
PatKind::Wild
781+
if matches!((range.lo, range.hi), (NegInfinity, PosInfinity)) {
782+
"_".to_string()
784783
} else if range.is_singleton() {
785784
let lo = cx.hoist_pat_range_bdy(range.lo, ty);
786785
let value = lo.as_finite().unwrap();
787-
PatKind::Constant { value }
786+
value.to_string()
788787
} else {
789788
// We convert to an inclusive range for diagnostics.
790789
let mut end = rustc_hir::RangeEnd::Included;
@@ -807,32 +806,24 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
807806
range.hi
808807
};
809808
let hi = cx.hoist_pat_range_bdy(hi, ty);
810-
PatKind::Range(Box::new(PatRange { lo, hi, end, ty: ty.inner() }))
811-
};
812-
813-
Pat { ty: ty.inner(), kind }
809+
PatRange { lo, hi, end, ty: ty.inner() }.to_string()
810+
}
814811
}
815812

816813
/// Prints a [`WitnessPat`] to an owned string, for diagnostic purposes.
814+
///
815+
/// This panics for patterns that don't appear in diagnostics, like float ranges.
817816
pub fn print_witness_pat(&self, pat: &WitnessPat<'p, 'tcx>) -> String {
818-
// This works by converting the witness pattern to a `print::Pat`
819-
// and then printing that, but callers don't need to know that.
820-
self.hoist_witness_pat(pat).to_string()
821-
}
822-
823-
/// Convert to a [`print::Pat`] for diagnostic purposes. This panics for patterns that don't
824-
/// appear in diagnostics, like float ranges.
825-
fn hoist_witness_pat(&self, pat: &WitnessPat<'p, 'tcx>) -> print::Pat<'tcx> {
826-
use print::{FieldPat, Pat, PatKind};
827817
let cx = self;
828-
let hoist = |p| Box::new(cx.hoist_witness_pat(p));
829-
let kind = match pat.ctor() {
830-
Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) },
831-
IntRange(range) => return self.hoist_pat_range(range, *pat.ty()),
818+
let print = |p| cx.print_witness_pat(p);
819+
match pat.ctor() {
820+
Bool(b) => b.to_string(),
821+
Str(s) => s.to_string(),
822+
IntRange(range) => return self.print_pat_range(range, *pat.ty()),
832823
Struct if pat.ty().is_box() => {
833824
// Outside of the `alloc` crate, the only way to create a struct pattern
834825
// of type `Box` is to use a `box` pattern via #[feature(box_patterns)].
835-
PatKind::Box { subpattern: hoist(&pat.fields[0]) }
826+
format!("box {}", print(&pat.fields[0]))
836827
}
837828
Struct | Variant(_) | UnionField => {
838829
let enum_info = match *pat.ty().kind() {
@@ -847,12 +838,29 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
847838
let subpatterns = pat
848839
.iter_fields()
849840
.enumerate()
850-
.map(|(i, pat)| FieldPat { field: FieldIdx::new(i), pattern: hoist(pat) })
841+
.map(|(i, pat)| print::FieldPat {
842+
field: FieldIdx::new(i),
843+
pattern: print(pat),
844+
is_wildcard: would_print_as_wildcard(cx.tcx, pat),
845+
})
851846
.collect::<Vec<_>>();
852847

853-
PatKind::StructLike { enum_info, subpatterns }
848+
let mut s = String::new();
849+
print::write_struct_like(
850+
&mut s,
851+
self.tcx,
852+
pat.ty().inner(),
853+
&enum_info,
854+
&subpatterns,
855+
)
856+
.unwrap();
857+
s
858+
}
859+
Ref => {
860+
let mut s = String::new();
861+
print::write_ref_like(&mut s, pat.ty().inner(), &print(&pat.fields[0])).unwrap();
862+
s
854863
}
855-
Ref => PatKind::Deref { subpattern: hoist(&pat.fields[0]) },
856864
Slice(slice) => {
857865
let (prefix_len, has_dot_dot) = match slice.kind {
858866
SliceKind::FixedLen(len) => (len, false),
@@ -879,24 +887,23 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
879887
}
880888
}
881889

882-
let prefix = prefix.iter().map(hoist).collect();
883-
let suffix = suffix.iter().map(hoist).collect();
890+
let prefix = prefix.iter().map(print).collect::<Vec<_>>();
891+
let suffix = suffix.iter().map(print).collect::<Vec<_>>();
884892

885-
PatKind::Slice { prefix, has_dot_dot, suffix }
893+
let mut s = String::new();
894+
print::write_slice_like(&mut s, &prefix, has_dot_dot, &suffix).unwrap();
895+
s
886896
}
887-
&Str(value) => PatKind::Constant { value },
888-
Never if self.tcx.features().never_patterns => PatKind::Never,
889-
Never | Wildcard | NonExhaustive | Hidden | PrivateUninhabited => PatKind::Wild,
897+
Never if self.tcx.features().never_patterns => "!".to_string(),
898+
Never | Wildcard | NonExhaustive | Hidden | PrivateUninhabited => "_".to_string(),
890899
Missing { .. } => bug!(
891900
"trying to convert a `Missing` constructor into a `Pat`; this is probably a bug,
892901
`Missing` should have been processed in `apply_constructors`"
893902
),
894903
F16Range(..) | F32Range(..) | F64Range(..) | F128Range(..) | Opaque(..) | Or => {
895904
bug!("can't convert to pattern: {:?}", pat)
896905
}
897-
};
898-
899-
Pat { ty: pat.ty().inner(), kind }
906+
}
900907
}
901908
}
902909

@@ -972,7 +979,7 @@ impl<'p, 'tcx: 'p> PatCx for RustcPatCtxt<'p, 'tcx> {
972979
overlaps_on: IntRange,
973980
overlaps_with: &[&crate::pat::DeconstructedPat<Self>],
974981
) {
975-
let overlap_as_pat = self.hoist_pat_range(&overlaps_on, *pat.ty());
982+
let overlap_as_pat = self.print_pat_range(&overlaps_on, *pat.ty());
976983
let overlaps: Vec<_> = overlaps_with
977984
.iter()
978985
.map(|pat| pat.data().span)
@@ -1012,7 +1019,7 @@ impl<'p, 'tcx: 'p> PatCx for RustcPatCtxt<'p, 'tcx> {
10121019
suggested_range.end = rustc_hir::RangeEnd::Included;
10131020
suggested_range.to_string()
10141021
};
1015-
let gap_as_pat = self.hoist_pat_range(&gap, *pat.ty());
1022+
let gap_as_pat = self.print_pat_range(&gap, *pat.ty());
10161023
if gapped_with.is_empty() {
10171024
// If `gapped_with` is empty, `gap == T::MAX`.
10181025
self.tcx.emit_node_span_lint(

‎compiler/rustc_pattern_analysis/src/rustc/print.rs‎

Lines changed: 15 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,75 +11,16 @@
1111
1212
use std::fmt;
1313

14-
use rustc_middle::thir::PatRange;
14+
use rustc_middle::bug;
1515
use rustc_middle::ty::{self, AdtDef, Ty, TyCtxt};
16-
use rustc_middle::{bug, mir};
1716
use rustc_span::sym;
1817
use rustc_target::abi::{FieldIdx, VariantIdx};
1918

2019
#[derive(Clone, Debug)]
21-
pub(crate) struct FieldPat<'tcx> {
20+
pub(crate) struct FieldPat {
2221
pub(crate) field: FieldIdx,
23-
pub(crate) pattern: Box<Pat<'tcx>>,
24-
}
25-
26-
#[derive(Clone, Debug)]
27-
pub(crate) struct Pat<'tcx> {
28-
pub(crate) ty: Ty<'tcx>,
29-
pub(crate) kind: PatKind<'tcx>,
30-
}
31-
32-
#[derive(Clone, Debug)]
33-
pub(crate) enum PatKind<'tcx> {
34-
Wild,
35-
36-
StructLike {
37-
enum_info: EnumInfo<'tcx>,
38-
subpatterns: Vec<FieldPat<'tcx>>,
39-
},
40-
41-
Box {
42-
subpattern: Box<Pat<'tcx>>,
43-
},
44-
45-
Deref {
46-
subpattern: Box<Pat<'tcx>>,
47-
},
48-
49-
Constant {
50-
value: mir::Const<'tcx>,
51-
},
52-
53-
Range(Box<PatRange<'tcx>>),
54-
55-
Slice {
56-
prefix: Box<[Box<Pat<'tcx>>]>,
57-
/// True if this slice-like pattern should include a `..` between the
58-
/// prefix and suffix.
59-
has_dot_dot: bool,
60-
suffix: Box<[Box<Pat<'tcx>>]>,
61-
},
62-
63-
Never,
64-
}
65-
66-
impl<'tcx> fmt::Display for Pat<'tcx> {
67-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68-
match self.kind {
69-
PatKind::Wild => write!(f, "_"),
70-
PatKind::Never => write!(f, "!"),
71-
PatKind::Box { ref subpattern } => write!(f, "box {subpattern}"),
72-
PatKind::StructLike { ref enum_info, ref subpatterns } => {
73-
ty::tls::with(|tcx| write_struct_like(f, tcx, self.ty, enum_info, subpatterns))
74-
}
75-
PatKind::Deref { ref subpattern } => write_ref_like(f, self.ty, subpattern),
76-
PatKind::Constant { value } => write!(f, "{value}"),
77-
PatKind::Range(ref range) => write!(f, "{range}"),
78-
PatKind::Slice { ref prefix, has_dot_dot, ref suffix } => {
79-
write_slice_like(f, prefix, has_dot_dot, suffix)
80-
}
81-
}
82-
}
22+
pub(crate) pattern: String,
23+
pub(crate) is_wildcard: bool,
8324
}
8425

8526
/// Returns a closure that will return `""` when called the first time,
@@ -103,12 +44,12 @@ pub(crate) enum EnumInfo<'tcx> {
10344
NotEnum,
10445
}
10546

106-
fn write_struct_like<'tcx>(
47+
pub(crate) fn write_struct_like<'tcx>(
10748
f: &mut impl fmt::Write,
10849
tcx: TyCtxt<'_>,
10950
ty: Ty<'tcx>,
11051
enum_info: &EnumInfo<'tcx>,
111-
subpatterns: &[FieldPat<'tcx>],
52+
subpatterns: &[FieldPat],
11253
) -> fmt::Result {
11354
let variant_and_name = match *enum_info {
11455
EnumInfo::Enum { adt_def, variant_index } => {
@@ -139,12 +80,12 @@ fn write_struct_like<'tcx>(
13980
write!(f, " {{ ")?;
14081

14182
let mut printed = 0;
142-
for p in subpatterns {
143-
if let PatKind::Wild = p.pattern.kind {
83+
for &FieldPat { field, ref pattern, is_wildcard } in subpatterns {
84+
if is_wildcard {
14485
continue;
14586
}
146-
let name = variant.fields[p.field].name;
147-
write!(f, "{}{}: {}", start_or_comma(), name, p.pattern)?;
87+
let field_name = variant.fields[field].name;
88+
write!(f, "{}{field_name}: {pattern}", start_or_comma())?;
14889
printed += 1;
14990
}
15091

@@ -184,10 +125,10 @@ fn write_struct_like<'tcx>(
184125
Ok(())
185126
}
186127

187-
fn write_ref_like<'tcx>(
128+
pub(crate) fn write_ref_like<'tcx>(
188129
f: &mut impl fmt::Write,
189130
ty: Ty<'tcx>,
190-
subpattern: &Pat<'tcx>,
131+
subpattern: &str,
191132
) -> fmt::Result {
192133
match ty.kind() {
193134
ty::Ref(_, _, mutbl) => {
@@ -198,11 +139,11 @@ fn write_ref_like<'tcx>(
198139
write!(f, "{subpattern}")
199140
}
200141

201-
fn write_slice_like<'tcx>(
142+
pub(crate) fn write_slice_like(
202143
f: &mut impl fmt::Write,
203-
prefix: &[Box<Pat<'tcx>>],
144+
prefix: &[String],
204145
has_dot_dot: bool,
205-
suffix: &[Box<Pat<'tcx>>],
146+
suffix: &[String],
206147
) -> fmt::Result {
207148
let mut start_or_comma = start_or_comma();
208149
write!(f, "[")?;

‎compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs‎

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -168,44 +168,12 @@ where
168168
// collecting region constraints via `region_constraints`.
169169
let (mut output, _) = scrape_region_constraints(
170170
infcx,
171-
|_ocx| {
172-
let (output, ei, mut obligations, _) =
171+
|ocx| {
172+
let (output, ei, obligations, _) =
173173
Q::fully_perform_into(self, infcx, &mut region_constraints, span)?;
174174
error_info = ei;
175175

176-
// Typically, instantiating NLL query results does not
177-
// create obligations. However, in some cases there
178-
// are unresolved type variables, and unify them *can*
179-
// create obligations. In that case, we have to go
180-
// fulfill them. We do this via a (recursive) query.
181-
while !obligations.is_empty() {
182-
trace!("{:#?}", obligations);
183-
let mut progress = false;
184-
for obligation in std::mem::take(&mut obligations) {
185-
let obligation = infcx.resolve_vars_if_possible(obligation);
186-
match ProvePredicate::fully_perform_into(
187-
obligation.param_env.and(ProvePredicate::new(obligation.predicate)),
188-
infcx,
189-
&mut region_constraints,
190-
span,
191-
) {
192-
Ok(((), _, new, certainty)) => {
193-
obligations.extend(new);
194-
progress = true;
195-
if let Certainty::Ambiguous = certainty {
196-
obligations.push(obligation);
197-
}
198-
}
199-
Err(_) => obligations.push(obligation),
200-
}
201-
}
202-
if !progress {
203-
infcx.dcx().span_bug(
204-
span,
205-
format!("ambiguity processing {obligations:?} from {self:?}"),
206-
);
207-
}
208-
}
176+
ocx.register_obligations(obligations);
209177
Ok(output)
210178
},
211179
"fully_perform",

‎library/core/src/task/wake.rs‎

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,10 +530,18 @@ impl Waker {
530530

531531
/// Returns a reference to a `Waker` that does nothing when used.
532532
///
533+
// Note! Much of the documentation for this method is duplicated
534+
// in the docs for `LocalWaker::noop`.
535+
// If you edit it, consider editing the other copy too.
536+
//
533537
/// This is mostly useful for writing tests that need a [`Context`] to poll
534538
/// some futures, but are not expecting those futures to wake the waker or
535539
/// do not need to do anything specific if it happens.
536540
///
541+
/// More generally, using `Waker::noop()` to poll a future
542+
/// means discarding the notification of when the future should be polled again.
543+
/// So it should only be used when such a notification will not be needed to make progress.
544+
///
537545
/// If an owned `Waker` is needed, `clone()` this one.
538546
///
539547
/// # Examples
@@ -783,12 +791,22 @@ impl LocalWaker {
783791
Self { waker }
784792
}
785793

786-
/// Creates a new `LocalWaker` that does nothing when `wake` is called.
794+
/// Returns a reference to a `LocalWaker` that does nothing when used.
787795
///
796+
// Note! Much of the documentation for this method is duplicated
797+
// in the docs for `Waker::noop`.
798+
// If you edit it, consider editing the other copy too.
799+
//
788800
/// This is mostly useful for writing tests that need a [`Context`] to poll
789801
/// some futures, but are not expecting those futures to wake the waker or
790802
/// do not need to do anything specific if it happens.
791803
///
804+
/// More generally, using `LocalWaker::noop()` to poll a future
805+
/// means discarding the notification of when the future should be polled again,
806+
/// So it should only be used when such a notification will not be needed to make progress.
807+
///
808+
/// If an owned `LocalWaker` is needed, `clone()` this one.
809+
///
792810
/// # Examples
793811
///
794812
/// ```

‎src/bootstrap/src/core/download.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -703,9 +703,7 @@ download-rustc = false
703703
let file_times = fs::FileTimes::new().set_accessed(now).set_modified(now);
704704

705705
let llvm_config = llvm_root.join("bin").join(exe("llvm-config", self.build));
706-
let llvm_config_file = t!(File::options().write(true).open(llvm_config));
707-
708-
t!(llvm_config_file.set_times(file_times));
706+
t!(crate::utils::helpers::set_file_times(llvm_config, file_times));
709707

710708
if self.should_fix_bins_and_dylibs() {
711709
let llvm_lib = llvm_root.join("lib");

‎src/bootstrap/src/lib.rs‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ use crate::core::builder;
3737
use crate::core::builder::{Builder, Kind};
3838
use crate::core::config::{flags, DryRun, LldMode, LlvmLibunwind, Target, TargetSelection};
3939
use crate::utils::exec::{command, BehaviorOnFailure, BootstrapCommand, CommandOutput, OutputMode};
40-
use crate::utils::helpers::{self, dir_is_empty, exe, libdir, mtime, output, symlink_dir};
40+
use crate::utils::helpers::{
41+
self, dir_is_empty, exe, libdir, mtime, output, set_file_times, symlink_dir,
42+
};
4143

4244
mod core;
4345
mod utils;
@@ -1792,21 +1794,20 @@ Executed at: {executed_at}"#,
17921794
}
17931795
}
17941796
if let Ok(()) = fs::hard_link(&src, dst) {
1795-
// Attempt to "easy copy" by creating a hard link
1796-
// (symlinks don't work on windows), but if that fails
1797-
// just fall back to a slow `copy` operation.
1797+
// Attempt to "easy copy" by creating a hard link (symlinks are priviledged on windows),
1798+
// but if that fails just fall back to a slow `copy` operation.
17981799
} else {
17991800
if let Err(e) = fs::copy(&src, dst) {
18001801
panic!("failed to copy `{}` to `{}`: {}", src.display(), dst.display(), e)
18011802
}
18021803
t!(fs::set_permissions(dst, metadata.permissions()));
18031804

1805+
// Restore file times because changing permissions on e.g. Linux using `chmod` can cause
1806+
// file access time to change.
18041807
let file_times = fs::FileTimes::new()
18051808
.set_accessed(t!(metadata.accessed()))
18061809
.set_modified(t!(metadata.modified()));
1807-
1808-
let dst_file = t!(fs::File::open(dst));
1809-
t!(dst_file.set_times(file_times));
1810+
t!(set_file_times(dst, file_times));
18101811
}
18111812
}
18121813

‎src/bootstrap/src/utils/helpers.rs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,3 +544,15 @@ pub fn get_closest_merge_base_commit(
544544

545545
Ok(output_result(git.as_command_mut())?.trim().to_owned())
546546
}
547+
548+
/// Sets the file times for a given file at `path`.
549+
pub fn set_file_times<P: AsRef<Path>>(path: P, times: fs::FileTimes) -> io::Result<()> {
550+
// Windows requires file to be writable to modify file times. But on Linux CI the file does not
551+
// need to be writable to modify file times and might be read-only.
552+
let f = if cfg!(windows) {
553+
fs::File::options().write(true).open(path)?
554+
} else {
555+
fs::File::open(path)?
556+
};
557+
f.set_times(times)
558+
}

‎src/bootstrap/src/utils/helpers/tests.rs‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use std::io::Write;
33
use std::path::PathBuf;
44

55
use crate::utils::helpers::{
6-
check_cfg_arg, extract_beta_rev, hex_encode, make, program_out_of_date, symlink_dir,
6+
check_cfg_arg, extract_beta_rev, hex_encode, make, program_out_of_date, set_file_times,
7+
symlink_dir,
78
};
89
use crate::{Config, Flags};
910

@@ -92,3 +93,24 @@ fn test_symlink_dir() {
9293
#[cfg(not(windows))]
9394
fs::remove_file(link_path).unwrap();
9495
}
96+
97+
#[test]
98+
fn test_set_file_times_sanity_check() {
99+
let config = Config::parse(&["check".to_owned(), "--config=/does/not/exist".to_owned()]);
100+
let tempfile = config.tempdir().join(".tmp-file");
101+
102+
{
103+
File::create(&tempfile).unwrap().write_all(b"dummy value").unwrap();
104+
assert!(tempfile.exists());
105+
}
106+
107+
// This might only fail on Windows (if file is default read-only then we try to modify file
108+
// times).
109+
let unix_epoch = std::time::SystemTime::UNIX_EPOCH;
110+
let target_time = fs::FileTimes::new().set_accessed(unix_epoch).set_modified(unix_epoch);
111+
set_file_times(&tempfile, target_time).unwrap();
112+
113+
let found_metadata = fs::metadata(tempfile).unwrap();
114+
assert_eq!(found_metadata.accessed().unwrap(), unix_epoch);
115+
assert_eq!(found_metadata.modified().unwrap(), unix_epoch)
116+
}

‎src/tools/run-make-support/src/external_deps/llvm.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,12 @@ impl LlvmAr {
297297
self
298298
}
299299

300+
/// Print the table of contents.
301+
pub fn table_of_contents(&mut self) -> &mut Self {
302+
self.cmd.arg("t");
303+
self
304+
}
305+
300306
/// Provide an output, then an input file. Bundled in one function, as llvm-ar has
301307
/// no "--output"-style flag.
302308
pub fn output_input(&mut self, out: impl AsRef<Path>, input: impl AsRef<Path>) -> &mut Self {

‎src/tools/rust-analyzer/crates/hir-ty/src/lib.rs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ extern crate rustc_abi;
1515
#[cfg(not(feature = "in-rust-tree"))]
1616
extern crate ra_ap_rustc_abi as rustc_abi;
1717

18-
// Use the crates.io version unconditionally until the API settles enough that we can switch to
19-
// using the in-tree one.
18+
#[cfg(feature = "in-rust-tree")]
19+
extern crate rustc_pattern_analysis;
20+
21+
#[cfg(not(feature = "in-rust-tree"))]
2022
extern crate ra_ap_rustc_pattern_analysis as rustc_pattern_analysis;
2123

2224
mod builder;

‎src/tools/tidy/src/allowed_run_make_makefiles.txt‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,9 @@ run-make/incr-add-rust-src-component/Makefile
66
run-make/issue-84395-lto-embed-bitcode/Makefile
77
run-make/jobserver-error/Makefile
88
run-make/libs-through-symlinks/Makefile
9-
run-make/libtest-json/Makefile
10-
run-make/libtest-junit/Makefile
119
run-make/libtest-thread-limit/Makefile
1210
run-make/macos-deployment-target/Makefile
13-
run-make/native-link-modifier-bundle/Makefile
1411
run-make/reproducible-build/Makefile
15-
run-make/rlib-format-packed-bundled-libs/Makefile
1612
run-make/split-debuginfo/Makefile
1713
run-make/symbol-mangling-hashed/Makefile
1814
run-make/translation/Makefile

‎tests/crashes/128695.rs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//@ known-bug: rust-lang/rust#128695
2+
//@ edition: 2021
3+
4+
use core::pin::{pin, Pin};
5+
6+
fn main() {
7+
let fut = pin!(async {
8+
let async_drop_fut = pin!(core::future::async_drop(async {}));
9+
(async_drop_fut).await;
10+
});
11+
}

‎tests/crashes/128810.rs‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//@ known-bug: rust-lang/rust#128810
2+
3+
#![feature(fn_delegation)]
4+
5+
use std::marker::PhantomData;
6+
7+
pub struct InvariantRef<'a, T: ?Sized>(&'a T, PhantomData<&'a mut &'a T>);
8+
9+
impl<'a> InvariantRef<'a, ()> {
10+
pub const NEW: Self = InvariantRef::new(&());
11+
}
12+
13+
trait Trait {
14+
fn foo(&self) -> u8 { 0 }
15+
fn bar(&self) -> u8 { 1 }
16+
fn meh(&self) -> u8 { 2 }
17+
}
18+
19+
struct Z(u8);
20+
21+
impl Trait for Z {
22+
reuse <u8 as Trait>::{foo, bar, meh} { &const { InvariantRef::<'a>::NEW } }
23+
}
24+
25+
fn main() { }

‎tests/crashes/128848.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//@ known-bug: rust-lang/rust#128848
2+
3+
fn f<T>(a: T, b: T, c: T) {
4+
f.call_once()
5+
}

‎tests/crashes/128870.rs‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//@ known-bug: rust-lang/rust#128870
2+
//@ compile-flags: -Zvalidate-mir
3+
4+
#[repr(packed)]
5+
#[repr(u32)]
6+
enum E {
7+
A,
8+
B,
9+
C,
10+
}
11+
12+
fn main() {
13+
union InvalidTag {
14+
int: u32,
15+
e: E,
16+
}
17+
let _invalid_tag = InvalidTag { int: 4 };
18+
}

‎tests/crashes/129075.rs‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//@ known-bug: rust-lang/rust#129075
2+
//@ compile-flags: -Zvalidate-mir -Zinline-mir=yes
3+
4+
struct Foo<T>([T; 2]);
5+
6+
impl<T: Default + Copy> Default for Foo<T> {
7+
fn default(&mut self) -> Self {
8+
Foo([Default::default(); 2])
9+
}
10+
}
11+
12+
fn field_array() {
13+
let a: i32;
14+
let b;
15+
Foo([a, b]) = Default::default();
16+
}

‎tests/crashes/129095.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//@ known-bug: rust-lang/rust#129095
2+
//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir
3+
4+
pub fn function_with_bytes<const BYTES: &'static [u8; 4]>() -> &'static [u8] {
5+
BYTES
6+
}
7+
8+
pub fn main() {
9+
assert_eq!(function_with_bytes::<b"AAAAb">(), &[0x41, 0x41, 0x41, 0x41]);
10+
}

‎tests/crashes/129099.rs‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//@ known-bug: rust-lang/rust#129099
2+
3+
#![feature(type_alias_impl_trait)]
4+
5+
fn dyn_hoops<T: Sized>() -> dyn for<'a> Iterator<Item = impl Captures<'a>> {
6+
loop {}
7+
}
8+
9+
pub fn main() {
10+
type Opaque = impl Sized;
11+
fn define() -> Opaque {
12+
let x: Opaque = dyn_hoops::<()>(0);
13+
x
14+
}
15+
}

‎tests/crashes/129109.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//@ known-bug: rust-lang/rust#129109
2+
//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir
3+
4+
extern "C" {
5+
pub static mut symbol: [i8];
6+
}
7+
8+
fn main() {
9+
println!("C", unsafe { &symbol });
10+
}

‎tests/crashes/129127.rs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//@ known-bug: rust-lang/rust#129127
2+
//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir -Zcross-crate-inline-threshold=always
3+
4+
5+
6+
7+
pub struct Rows<'a>();
8+
9+
impl<'a> Iterator for Rows<'a> {
10+
type Item = ();
11+
12+
fn next() -> Option<Self::Item> {
13+
let mut rows = Rows();
14+
rows.map(|row| row).next()
15+
}
16+
}
17+
18+
fn main() {
19+
let mut rows = Rows();
20+
rows.next();
21+
}

‎tests/run-make/libtest-json/Makefile‎

Lines changed: 0 additions & 20 deletions
This file was deleted.

‎tests/run-make/libtest-json/output-default.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
{ "type": "test", "name": "c", "event": "ok" }
88
{ "type": "test", "event": "started", "name": "d" }
99
{ "type": "test", "name": "d", "event": "ignored", "message": "msg" }
10-
{ "type": "suite", "event": "failed", "passed": 2, "failed": 1, "ignored": 1, "measured": 0, "filtered_out": 0, "exec_time": $TIME }
10+
{ "type": "suite", "event": "failed", "passed": 2, "failed": 1, "ignored": 1, "measured": 0, "filtered_out": 0, "exec_time": "$EXEC_TIME" }

‎tests/run-make/libtest-json/output-stdout-success.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
{ "type": "test", "name": "c", "event": "ok", "stdout": "thread 'c' panicked at f.rs:15:5:\nassertion failed: false\n" }
88
{ "type": "test", "event": "started", "name": "d" }
99
{ "type": "test", "name": "d", "event": "ignored", "message": "msg" }
10-
{ "type": "suite", "event": "failed", "passed": 2, "failed": 1, "ignored": 1, "measured": 0, "filtered_out": 0, "exec_time": $TIME }
10+
{ "type": "suite", "event": "failed", "passed": 2, "failed": 1, "ignored": 1, "measured": 0, "filtered_out": 0, "exec_time": "$EXEC_TIME" }
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Check libtest's JSON output against snapshots.
2+
3+
//@ ignore-cross-compile
4+
//@ needs-unwind (test file contains #[should_panic] test)
5+
6+
use run_make_support::{cmd, diff, python_command, rustc};
7+
8+
fn main() {
9+
rustc().arg("--test").input("f.rs").run();
10+
11+
run_tests(&[], "output-default.json");
12+
run_tests(&["--show-output"], "output-stdout-success.json");
13+
}
14+
15+
#[track_caller]
16+
fn run_tests(extra_args: &[&str], expected_file: &str) {
17+
let cmd_out = cmd("./f")
18+
.env("RUST_BACKTRACE", "0")
19+
.args(&["-Zunstable-options", "--test-threads=1", "--format=json"])
20+
.args(extra_args)
21+
.run_fail();
22+
let test_stdout = &cmd_out.stdout_utf8();
23+
24+
python_command().arg("validate_json.py").stdin(test_stdout).run();
25+
26+
diff()
27+
.expected_file(expected_file)
28+
.actual_text("stdout", test_stdout)
29+
.normalize(r#"(?<prefix>"exec_time": )[0-9.]+"#, r#"${prefix}"$$EXEC_TIME""#)
30+
.run();
31+
}

‎tests/run-make/libtest-junit/Makefile‎

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Check libtest's JUnit (XML) output against snapshots.
2+
3+
//@ ignore-cross-compile
4+
//@ needs-unwind (test file contains #[should_panic] test)
5+
6+
use run_make_support::{cmd, diff, python_command, rustc};
7+
8+
fn main() {
9+
rustc().arg("--test").input("f.rs").run();
10+
11+
run_tests(&[], "output-default.xml");
12+
run_tests(&["--show-output"], "output-stdout-success.xml");
13+
}
14+
15+
#[track_caller]
16+
fn run_tests(extra_args: &[&str], expected_file: &str) {
17+
let cmd_out = cmd("./f")
18+
.env("RUST_BACKTRACE", "0")
19+
.args(&["-Zunstable-options", "--test-threads=1", "--format=junit"])
20+
.args(extra_args)
21+
.run_fail();
22+
let test_stdout = &cmd_out.stdout_utf8();
23+
24+
python_command().arg("validate_junit.py").stdin(test_stdout).run();
25+
26+
diff()
27+
.expected_file(expected_file)
28+
.actual_text("stdout", test_stdout)
29+
.normalize(r#"\btime="[0-9.]+""#, r#"time="$$TIME""#)
30+
.run();
31+
}

‎tests/run-make/native-link-modifier-bundle/Makefile‎

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// This test exercises the `bundle` link argument, which can be turned on or off.
2+
3+
// When building a rlib or staticlib, +bundle means that all object files from the native static
4+
// library will be added to the rlib or staticlib archive, and then used from it during linking of
5+
// the final binary.
6+
7+
// When building a rlib -bundle means that the native static library is registered as a dependency
8+
// of that rlib "by name", and object files from it are included only during linking of the final
9+
// binary, the file search by that name is also performed during final linking.
10+
// When building a staticlib -bundle means that the native static library is simply not included
11+
// into the archive and some higher level build system will need to add it later during linking of
12+
// the final binary.
13+
14+
// This modifier has no effect when building other targets like executables or dynamic libraries.
15+
16+
// The default for this modifier is +bundle.
17+
// See https://github.com/rust-lang/rust/pull/95818
18+
19+
//@ ignore-cross-compile
20+
// Reason: cross-compilation fails to export native symbols
21+
22+
use run_make_support::{
23+
build_native_static_lib, dynamic_lib_name, is_msvc, llvm_nm, rust_lib_name, rustc,
24+
static_lib_name,
25+
};
26+
27+
fn main() {
28+
build_native_static_lib("native-staticlib");
29+
// Build a staticlib and a rlib, the `native_func` symbol will be bundled into them
30+
rustc().input("bundled.rs").crate_type("staticlib").crate_type("rlib").run();
31+
llvm_nm()
32+
.input(static_lib_name("bundled"))
33+
.run()
34+
.assert_stdout_contains_regex("T _*native_func");
35+
llvm_nm()
36+
.input(static_lib_name("bundled"))
37+
.run()
38+
.assert_stdout_contains_regex("U _*native_func");
39+
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("T _*native_func");
40+
llvm_nm().input(rust_lib_name("bundled")).run().assert_stdout_contains_regex("U _*native_func");
41+
42+
// Build a staticlib and a rlib, the `native_func` symbol will not be bundled into it
43+
build_native_static_lib("native-staticlib");
44+
rustc().input("non-bundled.rs").crate_type("staticlib").crate_type("rlib").run();
45+
llvm_nm()
46+
.input(static_lib_name("non_bundled"))
47+
.run()
48+
.assert_stdout_not_contains_regex("T _*native_func");
49+
llvm_nm()
50+
.input(static_lib_name("non_bundled"))
51+
.run()
52+
.assert_stdout_contains_regex("U _*native_func");
53+
llvm_nm()
54+
.input(rust_lib_name("non_bundled"))
55+
.run()
56+
.assert_stdout_not_contains_regex("T _*native_func");
57+
llvm_nm()
58+
.input(rust_lib_name("non_bundled"))
59+
.run()
60+
.assert_stdout_contains_regex("U _*native_func");
61+
62+
// This part of the test does not function on Windows MSVC - no symbols are printed.
63+
if !is_msvc() {
64+
// Build a cdylib, `native-staticlib` will not appear on the linker line because it was
65+
// bundled previously. The cdylib will contain the `native_func` symbol in the end.
66+
rustc()
67+
.input("cdylib-bundled.rs")
68+
.crate_type("cdylib")
69+
.print("link-args")
70+
.run()
71+
.assert_stdout_not_contains(r#"-l[" ]*native-staticlib"#);
72+
llvm_nm()
73+
.input(dynamic_lib_name("cdylib_bundled"))
74+
.run()
75+
.assert_stdout_contains_regex("[Tt] _*native_func");
76+
77+
// Build a cdylib, `native-staticlib` will appear on the linker line because it was not
78+
// bundled previously. The cdylib will contain the `native_func` symbol in the end
79+
rustc()
80+
.input("cdylib-non-bundled.rs")
81+
.crate_type("cdylib")
82+
.print("link-args")
83+
.run()
84+
.assert_stdout_contains_regex(r#"-l[" ]*native-staticlib"#);
85+
llvm_nm()
86+
.input(dynamic_lib_name("cdylib_non_bundled"))
87+
.run()
88+
.assert_stdout_contains_regex("[Tt] _*native_func");
89+
}
90+
}

‎tests/run-make/rlib-format-packed-bundled-libs/Makefile‎

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// `-Z packed_bundled_libs` is an unstable rustc flag that makes the compiler
2+
// only require a native library and no supplementary object files to compile.
3+
// Output files compiled with this flag should still contain all expected symbols -
4+
// that is what this test checks.
5+
// See https://github.com/rust-lang/rust/pull/100101
6+
7+
//@ ignore-cross-compile
8+
// Reason: cross-compilation fails to export native symbols
9+
10+
use run_make_support::{
11+
bin_name, build_native_static_lib, cwd, filename_contains, is_msvc, llvm_ar, llvm_nm, rfs,
12+
rust_lib_name, rustc, shallow_find_files,
13+
};
14+
15+
fn main() {
16+
build_native_static_lib("native_dep_1");
17+
build_native_static_lib("native_dep_2");
18+
build_native_static_lib("native_dep_3");
19+
rustc().input("rust_dep_up.rs").crate_type("rlib").arg("-Zpacked_bundled_libs").run();
20+
llvm_nm()
21+
.input(rust_lib_name("rust_dep_up"))
22+
.run()
23+
.assert_stdout_contains_regex("U.*native_f2");
24+
llvm_nm()
25+
.input(rust_lib_name("rust_dep_up"))
26+
.run()
27+
.assert_stdout_contains_regex("U.*native_f3");
28+
llvm_nm()
29+
.input(rust_lib_name("rust_dep_up"))
30+
.run()
31+
.assert_stdout_contains_regex("T.*rust_dep_up");
32+
llvm_ar()
33+
.table_of_contents()
34+
.arg(rust_lib_name("rust_dep_up"))
35+
.run()
36+
.assert_stdout_contains("native_dep_2");
37+
llvm_ar()
38+
.table_of_contents()
39+
.arg(rust_lib_name("rust_dep_up"))
40+
.run()
41+
.assert_stdout_contains("native_dep_3");
42+
rustc()
43+
.input("rust_dep_local.rs")
44+
.extern_("rlib", rust_lib_name("rust_dep_up"))
45+
.arg("-Zpacked_bundled_libs")
46+
.crate_type("rlib")
47+
.run();
48+
llvm_nm()
49+
.input(rust_lib_name("rust_dep_local"))
50+
.run()
51+
.assert_stdout_contains_regex("U.*native_f1");
52+
llvm_nm()
53+
.input(rust_lib_name("rust_dep_local"))
54+
.run()
55+
.assert_stdout_contains_regex("T.*rust_dep_local");
56+
llvm_ar()
57+
.table_of_contents()
58+
.arg(rust_lib_name("rust_dep_local"))
59+
.run()
60+
.assert_stdout_contains("native_dep_1");
61+
62+
// Ensure the compiler will not use files it should not know about.
63+
for file in shallow_find_files(cwd(), |path| filename_contains(path, "native_dep_")) {
64+
rfs::remove_file(file);
65+
}
66+
67+
rustc()
68+
.input("main.rs")
69+
.extern_("lib", rust_lib_name("rust_dep_local"))
70+
.output(bin_name("main"))
71+
.arg("-Zpacked_bundled_libs")
72+
.print("link-args")
73+
.run()
74+
.assert_stdout_contains_regex("native_dep_1.*native_dep_2.*native_dep_3");
75+
76+
// The binary "main" will not contain any symbols on MSVC.
77+
if !is_msvc() {
78+
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f1");
79+
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f2");
80+
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*native_f3");
81+
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*rust_dep_local");
82+
llvm_nm().input(bin_name("main")).run().assert_stdout_contains_regex("T.*rust_dep_up");
83+
}
84+
}
Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,102 @@
1-
use run_make_support::python_command;
1+
// Check that crates in the sysroot are treated as unstable, unless they are
2+
// on a list of known-stable sysroot crates.
3+
4+
use std::path::{Path, PathBuf};
5+
use std::str;
6+
7+
use run_make_support::{rfs, rustc, target};
8+
9+
fn is_stable_crate(name: &str) -> bool {
10+
matches!(name, "std" | "alloc" | "core" | "proc_macro")
11+
}
212

313
fn main() {
4-
python_command().arg("test.py").run();
14+
for cr in get_unstable_sysroot_crates() {
15+
check_crate_is_unstable(&cr);
16+
}
17+
println!("Done");
18+
}
19+
20+
#[derive(Debug)]
21+
struct Crate {
22+
name: String,
23+
path: PathBuf,
24+
}
25+
26+
fn check_crate_is_unstable(cr: &Crate) {
27+
let Crate { name, path } = cr;
28+
29+
print!("- Verifying that sysroot crate '{name}' is an unstable crate ...");
30+
31+
// Trying to use this crate from a user program should fail.
32+
let output = rustc()
33+
.crate_type("rlib")
34+
.target(target())
35+
.extern_(name, path)
36+
.input("-")
37+
.stdin(format!("extern crate {name};"))
38+
.run_fail();
39+
40+
// Make sure it failed for the intended reason, not some other reason.
41+
// (The actual feature required varies between crates.)
42+
output.assert_stderr_contains("use of unstable library feature");
43+
44+
println!(" OK");
45+
}
46+
47+
fn get_unstable_sysroot_crates() -> Vec<Crate> {
48+
let sysroot = PathBuf::from(rustc().print("sysroot").run().stdout_utf8().trim());
49+
let sysroot_libs_dir = sysroot.join("lib").join("rustlib").join(target()).join("lib");
50+
println!("Sysroot libs dir: {sysroot_libs_dir:?}");
51+
52+
// Generate a list of all library crates in the sysroot.
53+
let sysroot_crates = get_all_crates_in_dir(&sysroot_libs_dir);
54+
println!(
55+
"Found {} sysroot crates: {:?}",
56+
sysroot_crates.len(),
57+
sysroot_crates.iter().map(|cr| &cr.name).collect::<Vec<_>>()
58+
);
59+
60+
// Self-check: If we didn't find `core`, we probably checked the wrong directory.
61+
assert!(
62+
sysroot_crates.iter().any(|cr| cr.name == "core"),
63+
"Couldn't find `core` in {sysroot_libs_dir:?}"
64+
);
65+
66+
let unstable_sysroot_crates =
67+
sysroot_crates.into_iter().filter(|cr| !is_stable_crate(&cr.name)).collect::<Vec<_>>();
68+
// Self-check: There should be at least one unstable crate in the directory.
69+
assert!(
70+
!unstable_sysroot_crates.is_empty(),
71+
"Couldn't find any unstable crates in {sysroot_libs_dir:?}"
72+
);
73+
unstable_sysroot_crates
74+
}
75+
76+
fn get_all_crates_in_dir(libs_dir: &Path) -> Vec<Crate> {
77+
let mut libs = vec![];
78+
rfs::read_dir_entries(libs_dir, |path| {
79+
if !path.is_file() {
80+
return;
81+
}
82+
if let Some(name) = crate_name_from_path(path) {
83+
libs.push(Crate { name, path: path.to_owned() });
84+
}
85+
});
86+
libs.sort_by(|a, b| a.name.cmp(&b.name));
87+
libs
88+
}
89+
90+
/// Treat a file as a crate if its name begins with `lib` and ends with `.rlib`.
91+
/// The crate name is the part before the first hyphen (if any).
92+
fn crate_name_from_path(path: &Path) -> Option<String> {
93+
let name = path
94+
.file_name()?
95+
.to_str()?
96+
.strip_prefix("lib")?
97+
.strip_suffix(".rlib")?
98+
.split('-')
99+
.next()
100+
.expect("split always yields at least one string");
101+
Some(name.to_owned())
5102
}

‎tests/run-make/sysroot-crates-are-unstable/test.py‎

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.