Merge from rustc
This commit is contained in:
commit
b237952297
374 changed files with 4610 additions and 1510 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit d992ab4e9034930e7809749f04077045af8f4d79
|
||||
Subproject commit 1cd6d3803dfb0b342272862a8590f5dfc9f72573
|
||||
|
|
@ -472,7 +472,7 @@ fn check_clippy_lint_names(cx: &LateContext<'_>, name: Symbol, items: &[NestedMe
|
|||
|
||||
fn check_lint_reason(cx: &LateContext<'_>, name: Symbol, items: &[NestedMetaItem], attr: &'_ Attribute) {
|
||||
// Check for the feature
|
||||
if !cx.tcx.sess.features_untracked().lint_reasons {
|
||||
if !cx.tcx.features().lint_reasons {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ fn check_hash_peq<'tcx>(
|
|||
|
||||
// Only care about `impl PartialEq<Foo> for Foo`
|
||||
// For `impl PartialEq<B> for A, input_types is [A, B]
|
||||
if trait_ref.substs.type_at(1) == ty {
|
||||
if trait_ref.subst_identity().substs.type_at(1) == ty {
|
||||
span_lint_and_then(
|
||||
cx,
|
||||
DERIVED_HASH_WITH_MANUAL_EQ,
|
||||
|
|
@ -299,7 +299,7 @@ fn check_ord_partial_ord<'tcx>(
|
|||
|
||||
// Only care about `impl PartialOrd<Foo> for Foo`
|
||||
// For `impl PartialOrd<B> for A, input_types is [A, B]
|
||||
if trait_ref.substs.type_at(1) == ty {
|
||||
if trait_ref.subst_identity().substs.type_at(1) == ty {
|
||||
let mess = if partial_ord_is_automatically_derived {
|
||||
"you are implementing `Ord` explicitly but have derived `PartialOrd`"
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ impl<'tcx> LateLintPass<'tcx> for FallibleImplFrom {
|
|||
if_chain! {
|
||||
if let hir::ItemKind::Impl(impl_) = &item.kind;
|
||||
if let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id);
|
||||
if cx.tcx.is_diagnostic_item(sym::From, impl_trait_ref.def_id);
|
||||
if cx.tcx.is_diagnostic_item(sym::From, impl_trait_ref.skip_binder().def_id);
|
||||
then {
|
||||
lint_impl_body(cx, item.span, impl_.items);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for FromOverInto {
|
|||
&& let Some(into_trait_seg) = hir_trait_ref.path.segments.last()
|
||||
// `impl Into<target_ty> for self_ty`
|
||||
&& let Some(GenericArgs { args: [GenericArg::Type(target_ty)], .. }) = into_trait_seg.args
|
||||
&& let Some(middle_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id)
|
||||
&& let Some(middle_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id).map(ty::EarlyBinder::subst_identity)
|
||||
&& cx.tcx.is_diagnostic_item(sym::Into, middle_trait_ref.def_id)
|
||||
&& !matches!(middle_trait_ref.substs.type_at(1).kind(), ty::Alias(ty::Opaque, _))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline {
|
|||
let container_id = assoc_item.container_id(cx.tcx);
|
||||
let trait_def_id = match assoc_item.container {
|
||||
TraitContainer => Some(container_id),
|
||||
ImplContainer => cx.tcx.impl_trait_ref(container_id).map(|t| t.def_id),
|
||||
ImplContainer => cx.tcx.impl_trait_ref(container_id).map(|t| t.skip_binder().def_id),
|
||||
};
|
||||
|
||||
if let Some(trait_def_id) = trait_def_id {
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSendFieldInSendTy {
|
|||
if send_trait == trait_id;
|
||||
if hir_impl.polarity == ImplPolarity::Positive;
|
||||
if let Some(ty_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id);
|
||||
if let self_ty = ty_trait_ref.self_ty();
|
||||
if let self_ty = ty_trait_ref.subst_identity().self_ty();
|
||||
if let ty::Adt(adt_def, impl_trait_substs) = self_ty.kind();
|
||||
then {
|
||||
let mut non_send_fields = Vec::new();
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ impl<'tcx> LateLintPass<'tcx> for OnlyUsedInRecursion {
|
|||
})) => {
|
||||
#[allow(trivial_casts)]
|
||||
if let Some(Node::Item(item)) = get_parent_node(cx.tcx, owner_id.into())
|
||||
&& let Some(trait_ref) = cx.tcx.impl_trait_ref(item.owner_id)
|
||||
&& let Some(trait_ref) = cx.tcx.impl_trait_ref(item.owner_id).map(|t| t.subst_identity())
|
||||
&& let Some(trait_item_id) = cx.tcx.associated_item(owner_id).trait_item_def_id
|
||||
{
|
||||
(
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
|
|||
then {
|
||||
// `self_ty` is the semantic self type of `impl <trait> for <type>`. This cannot be
|
||||
// `Self`.
|
||||
let self_ty = impl_trait_ref.self_ty();
|
||||
let self_ty = impl_trait_ref.subst_identity().self_ty();
|
||||
|
||||
// `trait_method_sig` is the signature of the function, how it is declared in the
|
||||
// trait, not in the impl of the trait.
|
||||
|
|
|
|||
|
|
@ -17,9 +17,12 @@ error[E0412]: cannot find type `VAL` in this scope
|
|||
--> $DIR/ice-6252.rs:10:63
|
||||
|
|
||||
LL | impl<N, M> TypeVal<usize> for Multiply<N, M> where N: TypeVal<VAL> {}
|
||||
| - ^^^ not found in this scope
|
||||
| |
|
||||
| help: you might be missing a type parameter: `, VAL`
|
||||
| ^^^ not found in this scope
|
||||
|
|
||||
help: you might be missing a type parameter
|
||||
|
|
||||
LL | impl<N, M, VAL> TypeVal<usize> for Multiply<N, M> where N: TypeVal<VAL> {}
|
||||
| +++++
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `VAL`
|
||||
--> $DIR/ice-6252.rs:10:1
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ pub trait Copy {}
|
|||
pub unsafe trait Freeze {}
|
||||
|
||||
#[lang = "start"]
|
||||
fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8) -> isize {
|
||||
fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpipe: u8) -> isize {
|
||||
0
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ fn main() {
|
|||
}
|
||||
|
||||
// test `stat`
|
||||
assert_eq!(fs::metadata("foo.txt").unwrap_err().kind(), ErrorKind::PermissionDenied);
|
||||
let err = fs::metadata("foo.txt").unwrap_err();
|
||||
assert_eq!(err.kind(), ErrorKind::PermissionDenied);
|
||||
// check that it is the right kind of `PermissionDenied`
|
||||
assert_eq!(Error::last_os_error().raw_os_error(), Some(libc::EACCES));
|
||||
assert_eq!(err.raw_os_error(), Some(libc::EACCES));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ license = "MIT OR Apache-2.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
clap = "3.1.1"
|
||||
clap = "4.0.32"
|
||||
env_logger = "0.7.1"
|
||||
|
||||
[dependencies.mdbook]
|
||||
version = "0.4.21"
|
||||
version = "0.4.25"
|
||||
default-features = false
|
||||
features = ["search"]
|
||||
|
|
|
|||
|
|
@ -9,18 +9,21 @@ use mdbook::errors::Result as Result3;
|
|||
use mdbook::MDBook;
|
||||
|
||||
fn main() {
|
||||
let crate_version = format!("v{}", crate_version!());
|
||||
let crate_version = concat!("v", crate_version!());
|
||||
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("warn")).init();
|
||||
let d_arg = arg!(-d --"dest-dir" <DEST_DIR>
|
||||
"The output directory for your book\n(Defaults to ./book when omitted)")
|
||||
.required(false);
|
||||
let dir_arg = arg!([dir]
|
||||
"A directory for your book\n(Defaults to Current Directory when omitted)");
|
||||
.required(false)
|
||||
.value_parser(clap::value_parser!(PathBuf));
|
||||
|
||||
let dir_arg = arg!([dir] "Root directory for the book\n\
|
||||
(Defaults to the current directory when omitted)")
|
||||
.value_parser(clap::value_parser!(PathBuf));
|
||||
|
||||
let matches = Command::new("rustbook")
|
||||
.about("Build a book with mdBook")
|
||||
.author("Steve Klabnik <steve@steveklabnik.com>")
|
||||
.version(&*crate_version)
|
||||
.version(crate_version)
|
||||
.subcommand_required(true)
|
||||
.arg_required_else_help(true)
|
||||
.subcommand(
|
||||
|
|
@ -60,8 +63,8 @@ pub fn build(args: &ArgMatches) -> Result3<()> {
|
|||
// Set this to allow us to catch bugs in advance.
|
||||
book.config.build.create_missing = false;
|
||||
|
||||
if let Some(dest_dir) = args.value_of("dest-dir") {
|
||||
book.config.build.build_dir = PathBuf::from(dest_dir);
|
||||
if let Some(dest_dir) = args.get_one::<PathBuf>("dest-dir") {
|
||||
book.config.build.build_dir = dest_dir.into();
|
||||
}
|
||||
|
||||
book.build()?;
|
||||
|
|
@ -76,10 +79,9 @@ fn test(args: &ArgMatches) -> Result3<()> {
|
|||
}
|
||||
|
||||
fn get_book_dir(args: &ArgMatches) -> PathBuf {
|
||||
if let Some(dir) = args.value_of("dir") {
|
||||
if let Some(p) = args.get_one::<PathBuf>("dir") {
|
||||
// Check if path is relative from current dir, or absolute...
|
||||
let p = Path::new(dir);
|
||||
if p.is_relative() { env::current_dir().unwrap().join(dir) } else { p.to_path_buf() }
|
||||
if p.is_relative() { env::current_dir().unwrap().join(p) } else { p.to_path_buf() }
|
||||
} else {
|
||||
env::current_dir().unwrap()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ autobins = false
|
|||
|
||||
[dependencies]
|
||||
cargo_metadata = "0.14"
|
||||
cargo-platform = "0.1.2"
|
||||
regex = "1"
|
||||
miropt-test-tools = { path = "../miropt-test-tools" }
|
||||
lazy_static = "1"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
//! Checks the licenses of third-party dependencies.
|
||||
|
||||
use cargo_metadata::{Metadata, Package, PackageId, Resolve};
|
||||
use std::collections::{BTreeSet, HashSet};
|
||||
use cargo_metadata::{DepKindInfo, Metadata, Package, PackageId};
|
||||
use std::collections::HashSet;
|
||||
use std::path::Path;
|
||||
|
||||
/// These are licenses that are allowed for all crates, including the runtime,
|
||||
|
|
@ -98,14 +98,12 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"autocfg",
|
||||
"bitflags",
|
||||
"block-buffer",
|
||||
"bumpalo", // Included in Cargo's dep graph but only activated on wasm32-*-unknown.
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"chalk-derive",
|
||||
"chalk-engine",
|
||||
"chalk-ir",
|
||||
"chalk-solve",
|
||||
"chrono",
|
||||
"convert_case", // dependency of derive_more
|
||||
"compiler_builtins",
|
||||
"cpufeatures",
|
||||
|
|
@ -124,11 +122,9 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"dlmalloc",
|
||||
"either",
|
||||
"ena",
|
||||
"env_logger",
|
||||
"expect-test",
|
||||
"fallible-iterator", // dependency of `thorin`
|
||||
"fastrand",
|
||||
"filetime",
|
||||
"fixedbitset",
|
||||
"flate2",
|
||||
"fluent-bundle",
|
||||
|
|
@ -142,13 +138,11 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"gsgdt",
|
||||
"hashbrown",
|
||||
"hermit-abi",
|
||||
"humantime",
|
||||
"icu_list",
|
||||
"icu_locid",
|
||||
"icu_provider",
|
||||
"icu_provider_adapters",
|
||||
"icu_provider_macros",
|
||||
"if_chain",
|
||||
"indexmap",
|
||||
"instant",
|
||||
"intl-memoizer",
|
||||
|
|
@ -156,7 +150,6 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"itertools",
|
||||
"itoa",
|
||||
"jobserver",
|
||||
"js-sys", // Included in Cargo's dep graph but only activated on wasm32-*-unknown.
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"libloading",
|
||||
|
|
@ -171,8 +164,6 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"memmap2",
|
||||
"memoffset",
|
||||
"miniz_oxide",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
"num_cpus",
|
||||
"object",
|
||||
"odht",
|
||||
|
|
@ -190,7 +181,6 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"proc-macro2",
|
||||
"psm",
|
||||
"punycode",
|
||||
"quick-error",
|
||||
"quote",
|
||||
"rand",
|
||||
"rand_chacha",
|
||||
|
|
@ -217,7 +207,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"sha-1",
|
||||
"sha1",
|
||||
"sha2",
|
||||
"sharded-slab",
|
||||
"smallvec",
|
||||
|
|
@ -235,7 +225,6 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"thiserror-impl",
|
||||
"thorin-dwp",
|
||||
"thread_local",
|
||||
"time",
|
||||
"tinystr",
|
||||
"tinyvec",
|
||||
"tinyvec_macros",
|
||||
|
|
@ -268,13 +257,6 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
|||
"valuable",
|
||||
"version_check",
|
||||
"wasi",
|
||||
// vvv Included in Cargo's dep graph but only activated on wasm32-*-unknown.
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-macro",
|
||||
"wasm-bindgen-macro-support",
|
||||
"wasm-bindgen-shared",
|
||||
// ^^^ Included in Cargo's dep graph but only activated on wasm32-*-unknown.
|
||||
"winapi",
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-util",
|
||||
|
|
@ -485,75 +467,57 @@ fn check_permitted_dependencies(
|
|||
restricted_dependency_crates: &[&'static str],
|
||||
bad: &mut bool,
|
||||
) {
|
||||
let mut deps = HashSet::new();
|
||||
for to_check in restricted_dependency_crates {
|
||||
let to_check = pkg_from_name(metadata, to_check);
|
||||
use cargo_platform::Cfg;
|
||||
use std::str::FromStr;
|
||||
// We don't expect the compiler to ever run on wasm32, so strip
|
||||
// out those dependencies to avoid polluting the permitted list.
|
||||
deps_of_filtered(metadata, &to_check.id, &mut deps, &|dep_kinds| {
|
||||
dep_kinds.iter().any(|dep_kind| {
|
||||
dep_kind
|
||||
.target
|
||||
.as_ref()
|
||||
.map(|target| {
|
||||
!target.matches(
|
||||
"wasm32-unknown-unknown",
|
||||
&[
|
||||
Cfg::from_str("target_arch=\"wasm32\"").unwrap(),
|
||||
Cfg::from_str("target_os=\"unknown\"").unwrap(),
|
||||
],
|
||||
)
|
||||
})
|
||||
.unwrap_or(true)
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// Check that the PERMITTED_DEPENDENCIES does not have unused entries.
|
||||
for name in permitted_dependencies {
|
||||
if !metadata.packages.iter().any(|p| p.name == *name) {
|
||||
for permitted in permitted_dependencies {
|
||||
if !deps.iter().any(|dep_id| &pkg_from_id(metadata, dep_id).name == permitted) {
|
||||
tidy_error!(
|
||||
bad,
|
||||
"could not find allowed package `{}`\n\
|
||||
"could not find allowed package `{permitted}`\n\
|
||||
Remove from PERMITTED_DEPENDENCIES list if it is no longer used.",
|
||||
name
|
||||
);
|
||||
}
|
||||
}
|
||||
// Get the list in a convenient form.
|
||||
|
||||
// Get in a convenient form.
|
||||
let permitted_dependencies: HashSet<_> = permitted_dependencies.iter().cloned().collect();
|
||||
|
||||
// Check dependencies.
|
||||
let mut visited = BTreeSet::new();
|
||||
let mut unapproved = BTreeSet::new();
|
||||
for &krate in restricted_dependency_crates.iter() {
|
||||
let pkg = pkg_from_name(metadata, krate);
|
||||
let mut bad =
|
||||
check_crate_dependencies(&permitted_dependencies, metadata, &mut visited, pkg);
|
||||
unapproved.append(&mut bad);
|
||||
}
|
||||
|
||||
if !unapproved.is_empty() {
|
||||
tidy_error!(bad, "Dependencies for {} not explicitly permitted:", descr);
|
||||
for dep in unapproved {
|
||||
println!("* {dep}");
|
||||
for dep in deps {
|
||||
let dep = pkg_from_id(metadata, dep);
|
||||
// If this path is in-tree, we don't require it to be explicitly permitted.
|
||||
if dep.source.is_some() {
|
||||
if !permitted_dependencies.contains(dep.name.as_str()) {
|
||||
tidy_error!(bad, "Dependency for {descr} not explicitly permitted: {}", dep.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Checks the dependencies of the given crate from the given cargo metadata to see if they are on
|
||||
/// the list of permitted dependencies. Returns a list of disallowed dependencies.
|
||||
fn check_crate_dependencies<'a>(
|
||||
permitted_dependencies: &'a HashSet<&'static str>,
|
||||
metadata: &'a Metadata,
|
||||
visited: &mut BTreeSet<&'a PackageId>,
|
||||
krate: &'a Package,
|
||||
) -> BTreeSet<&'a PackageId> {
|
||||
// This will contain bad deps.
|
||||
let mut unapproved = BTreeSet::new();
|
||||
|
||||
// Check if we have already visited this crate.
|
||||
if visited.contains(&krate.id) {
|
||||
return unapproved;
|
||||
}
|
||||
|
||||
visited.insert(&krate.id);
|
||||
|
||||
// If this path is in-tree, we don't require it to be explicitly permitted.
|
||||
if krate.source.is_some() {
|
||||
// If this dependency is not on `PERMITTED_DEPENDENCIES`, add to bad set.
|
||||
if !permitted_dependencies.contains(krate.name.as_str()) {
|
||||
unapproved.insert(&krate.id);
|
||||
}
|
||||
}
|
||||
|
||||
// Do a DFS in the crate graph.
|
||||
let to_check = deps_of(metadata, &krate.id);
|
||||
|
||||
for dep in to_check {
|
||||
let mut bad = check_crate_dependencies(permitted_dependencies, metadata, visited, dep);
|
||||
unapproved.append(&mut bad);
|
||||
}
|
||||
|
||||
unapproved
|
||||
}
|
||||
|
||||
/// Prevents multiple versions of some expensive crates.
|
||||
fn check_crate_duplicate(
|
||||
metadata: &Metadata,
|
||||
|
|
@ -588,24 +552,6 @@ fn check_crate_duplicate(
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns a list of dependencies for the given package.
|
||||
fn deps_of<'a>(metadata: &'a Metadata, pkg_id: &'a PackageId) -> Vec<&'a Package> {
|
||||
let resolve = metadata.resolve.as_ref().unwrap();
|
||||
let node = resolve
|
||||
.nodes
|
||||
.iter()
|
||||
.find(|n| &n.id == pkg_id)
|
||||
.unwrap_or_else(|| panic!("could not find `{pkg_id}` in resolve"));
|
||||
node.deps
|
||||
.iter()
|
||||
.map(|dep| {
|
||||
metadata.packages.iter().find(|pkg| pkg.id == dep.pkg).unwrap_or_else(|| {
|
||||
panic!("could not find dep `{}` for pkg `{}` in resolve", dep.pkg, pkg_id)
|
||||
})
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Finds a package with the given name.
|
||||
fn pkg_from_name<'a>(metadata: &'a Metadata, name: &'static str) -> &'a Package {
|
||||
let mut i = metadata.packages.iter().filter(|p| p.name == name);
|
||||
|
|
@ -615,41 +561,57 @@ fn pkg_from_name<'a>(metadata: &'a Metadata, name: &'static str) -> &'a Package
|
|||
result
|
||||
}
|
||||
|
||||
fn pkg_from_id<'a>(metadata: &'a Metadata, id: &PackageId) -> &'a Package {
|
||||
metadata.packages.iter().find(|p| &p.id == id).unwrap()
|
||||
}
|
||||
|
||||
/// Finds all the packages that are in the rust runtime.
|
||||
fn compute_runtime_crates<'a>(metadata: &'a Metadata) -> HashSet<&'a PackageId> {
|
||||
let resolve = metadata.resolve.as_ref().unwrap();
|
||||
let mut result = HashSet::new();
|
||||
for name in RUNTIME_CRATES {
|
||||
let id = &pkg_from_name(metadata, name).id;
|
||||
normal_deps_of_r(resolve, id, &mut result);
|
||||
deps_of_filtered(metadata, id, &mut result, &|_| true);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
/// Recursively find all normal dependencies.
|
||||
fn normal_deps_of_r<'a>(
|
||||
resolve: &'a Resolve,
|
||||
/// Recursively find all dependencies.
|
||||
fn deps_of_filtered<'a>(
|
||||
metadata: &'a Metadata,
|
||||
pkg_id: &'a PackageId,
|
||||
result: &mut HashSet<&'a PackageId>,
|
||||
filter: &dyn Fn(&[DepKindInfo]) -> bool,
|
||||
) {
|
||||
if !result.insert(pkg_id) {
|
||||
return;
|
||||
}
|
||||
let node = resolve
|
||||
let node = metadata
|
||||
.resolve
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.nodes
|
||||
.iter()
|
||||
.find(|n| &n.id == pkg_id)
|
||||
.unwrap_or_else(|| panic!("could not find `{pkg_id}` in resolve"));
|
||||
for dep in &node.deps {
|
||||
normal_deps_of_r(resolve, &dep.pkg, result);
|
||||
if !filter(&dep.dep_kinds) {
|
||||
continue;
|
||||
}
|
||||
deps_of_filtered(metadata, &dep.pkg, result, filter);
|
||||
}
|
||||
}
|
||||
|
||||
fn direct_deps_of<'a>(metadata: &'a Metadata, pkg_id: &'a PackageId) -> Vec<&'a Package> {
|
||||
let resolve = metadata.resolve.as_ref().unwrap();
|
||||
let node = resolve.nodes.iter().find(|n| &n.id == pkg_id).unwrap();
|
||||
node.deps.iter().map(|dep| pkg_from_id(metadata, &dep.pkg)).collect()
|
||||
}
|
||||
|
||||
fn check_rustfix(metadata: &Metadata, bad: &mut bool) {
|
||||
let cargo = pkg_from_name(metadata, "cargo");
|
||||
let compiletest = pkg_from_name(metadata, "compiletest");
|
||||
let cargo_deps = deps_of(metadata, &cargo.id);
|
||||
let compiletest_deps = deps_of(metadata, &compiletest.id);
|
||||
let cargo_deps = direct_deps_of(metadata, &cargo.id);
|
||||
let compiletest_deps = direct_deps_of(metadata, &compiletest.id);
|
||||
let cargo_rustfix = cargo_deps.iter().find(|p| p.name == "rustfix").unwrap();
|
||||
let compiletest_rustfix = compiletest_deps.iter().find(|p| p.name == "rustfix").unwrap();
|
||||
if cargo_rustfix.version != compiletest_rustfix.version {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue