Auto merge of #115940 - matthiaskrgr:rollup-5ps9ln1, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #109409 (Add `minmax{,_by,_by_key}` functions to `core::cmp`) - #115494 (get rid of duplicate primitive_docs) - #115663 (ci: actions/checkout@v3 to actions/checkout@v4) - #115762 (Explain revealing of opaque types in layout_of ParamEnv) - #115891 (simplify inject_impl_of_structural_trait) - #115932 (Expand infra-ci reviewer list) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
65ea825f40
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
@ -67,7 +67,7 @@ jobs:
|
||||
- name: disable git crlf conversion
|
||||
run: git config --global core.autocrlf false
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: configure the PR in which the error message will be posted
|
||||
@ -435,7 +435,7 @@ jobs:
|
||||
- name: disable git crlf conversion
|
||||
run: git config --global core.autocrlf false
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: configure the PR in which the error message will be posted
|
||||
@ -555,7 +555,7 @@ jobs:
|
||||
- name: disable git crlf conversion
|
||||
run: git config --global core.autocrlf false
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: configure the PR in which the error message will be posted
|
||||
@ -662,7 +662,7 @@ jobs:
|
||||
if: "github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'rust-lang-ci/rust'"
|
||||
steps:
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: publish toolstate
|
||||
|
4
.github/workflows/dependencies.yml
vendored
4
.github/workflows/dependencies.yml
vendored
@ -50,7 +50,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: install the bootstrap toolchain
|
||||
@ -87,7 +87,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: download Cargo.lock from update job
|
||||
uses: actions/download-artifact@v3
|
||||
|
@ -18,6 +18,20 @@ pub fn expand_deriving_eq(
|
||||
is_const: bool,
|
||||
) {
|
||||
let span = cx.with_def_site_ctxt(span);
|
||||
|
||||
let structural_trait_def = TraitDef {
|
||||
span,
|
||||
path: path_std!(marker::StructuralEq),
|
||||
skip_path_as_bound: true, // crucial!
|
||||
needs_copy_as_bound_if_packed: false,
|
||||
additional_bounds: Vec::new(),
|
||||
supports_unions: true,
|
||||
methods: Vec::new(),
|
||||
associated_types: Vec::new(),
|
||||
is_const: false,
|
||||
};
|
||||
structural_trait_def.expand(cx, mitem, item, push);
|
||||
|
||||
let trait_def = TraitDef {
|
||||
span,
|
||||
path: path_std!(cmp::Eq),
|
||||
@ -44,9 +58,6 @@ pub fn expand_deriving_eq(
|
||||
associated_types: Vec::new(),
|
||||
is_const,
|
||||
};
|
||||
|
||||
super::inject_impl_of_structural_trait(cx, span, item, path_std!(marker::StructuralEq), push);
|
||||
|
||||
trait_def.expand_ext(cx, mitem, item, push, true)
|
||||
}
|
||||
|
||||
|
@ -72,13 +72,20 @@ fn cs_eq(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOr
|
||||
BlockOrExpr::new_expr(expr)
|
||||
}
|
||||
|
||||
super::inject_impl_of_structural_trait(
|
||||
cx,
|
||||
let structural_trait_def = TraitDef {
|
||||
span,
|
||||
item,
|
||||
path_std!(marker::StructuralPartialEq),
|
||||
push,
|
||||
);
|
||||
path: path_std!(marker::StructuralPartialEq),
|
||||
skip_path_as_bound: true, // crucial!
|
||||
needs_copy_as_bound_if_packed: false,
|
||||
additional_bounds: Vec::new(),
|
||||
// We really don't support unions, but that's already checked by the impl generated below;
|
||||
// a second check here would lead to redundant error messages.
|
||||
supports_unions: true,
|
||||
methods: Vec::new(),
|
||||
associated_types: Vec::new(),
|
||||
is_const: false,
|
||||
};
|
||||
structural_trait_def.expand(cx, mitem, item, push);
|
||||
|
||||
// No need to generate `ne`, the default suffices, and not generating it is
|
||||
// faster.
|
||||
|
@ -711,7 +711,9 @@ fn create_derived_impl(
|
||||
.collect();
|
||||
|
||||
// Require the current trait.
|
||||
if !self.skip_path_as_bound {
|
||||
bounds.push(cx.trait_bound(trait_path.clone(), self.is_const));
|
||||
}
|
||||
|
||||
// Add a `Copy` bound if required.
|
||||
if is_packed && self.needs_copy_as_bound_if_packed {
|
||||
@ -722,6 +724,7 @@ fn create_derived_impl(
|
||||
));
|
||||
}
|
||||
|
||||
if !bounds.is_empty() {
|
||||
let predicate = ast::WhereBoundPredicate {
|
||||
span: self.span,
|
||||
bound_generic_params: field_ty_param.bound_generic_params,
|
||||
@ -735,6 +738,7 @@ fn create_derived_impl(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let trait_generics = Generics { params, where_clause, span };
|
||||
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::{GenericArg, Impl, ItemKind, MetaItem};
|
||||
use rustc_ast::{GenericArg, MetaItem};
|
||||
use rustc_expand::base::{Annotatable, ExpandResult, ExtCtxt, MultiItemModifier};
|
||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_span::Span;
|
||||
use thin_vec::{thin_vec, ThinVec};
|
||||
|
||||
@ -116,100 +116,6 @@ fn call_unreachable(cx: &ExtCtxt<'_>, span: Span) -> P<ast::Expr> {
|
||||
}))
|
||||
}
|
||||
|
||||
// Injects `impl<...> Structural for ItemType<...> { }`. In particular,
|
||||
// does *not* add `where T: Structural` for parameters `T` in `...`.
|
||||
// (That's the main reason we cannot use TraitDef here.)
|
||||
fn inject_impl_of_structural_trait(
|
||||
cx: &mut ExtCtxt<'_>,
|
||||
span: Span,
|
||||
item: &Annotatable,
|
||||
structural_path: generic::ty::Path,
|
||||
push: &mut dyn FnMut(Annotatable),
|
||||
) {
|
||||
let Annotatable::Item(item) = item else {
|
||||
unreachable!();
|
||||
};
|
||||
|
||||
let generics = match &item.kind {
|
||||
ItemKind::Struct(_, generics) | ItemKind::Enum(_, generics) => generics,
|
||||
// Do not inject `impl Structural for Union`. (`PartialEq` does not
|
||||
// support unions, so we will see error downstream.)
|
||||
ItemKind::Union(..) => return,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
// Create generics param list for where clauses and impl headers
|
||||
let mut generics = generics.clone();
|
||||
|
||||
let ctxt = span.ctxt();
|
||||
|
||||
// Create the type of `self`.
|
||||
//
|
||||
// in addition, remove defaults from generic params (impls cannot have them).
|
||||
let self_params: Vec<_> = generics
|
||||
.params
|
||||
.iter_mut()
|
||||
.map(|param| match &mut param.kind {
|
||||
ast::GenericParamKind::Lifetime => ast::GenericArg::Lifetime(
|
||||
cx.lifetime(param.ident.span.with_ctxt(ctxt), param.ident),
|
||||
),
|
||||
ast::GenericParamKind::Type { default } => {
|
||||
*default = None;
|
||||
ast::GenericArg::Type(cx.ty_ident(param.ident.span.with_ctxt(ctxt), param.ident))
|
||||
}
|
||||
ast::GenericParamKind::Const { ty: _, kw_span: _, default } => {
|
||||
*default = None;
|
||||
ast::GenericArg::Const(
|
||||
cx.const_ident(param.ident.span.with_ctxt(ctxt), param.ident),
|
||||
)
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let type_ident = item.ident;
|
||||
|
||||
let trait_ref = cx.trait_ref(structural_path.to_path(cx, span, type_ident, &generics));
|
||||
let self_type = cx.ty_path(cx.path_all(span, false, vec![type_ident], self_params));
|
||||
|
||||
// It would be nice to also encode constraint `where Self: Eq` (by adding it
|
||||
// onto `generics` cloned above). Unfortunately, that strategy runs afoul of
|
||||
// rust-lang/rust#48214. So we perform that additional check in the compiler
|
||||
// itself, instead of encoding it here.
|
||||
|
||||
// Keep the lint and stability attributes of the original item, to control
|
||||
// how the generated implementation is linted.
|
||||
let mut attrs = ast::AttrVec::new();
|
||||
attrs.extend(
|
||||
item.attrs
|
||||
.iter()
|
||||
.filter(|a| {
|
||||
[sym::allow, sym::warn, sym::deny, sym::forbid, sym::stable, sym::unstable]
|
||||
.contains(&a.name_or_empty())
|
||||
})
|
||||
.cloned(),
|
||||
);
|
||||
// Mark as `automatically_derived` to avoid some silly lints.
|
||||
attrs.push(cx.attr_word(sym::automatically_derived, span));
|
||||
|
||||
let newitem = cx.item(
|
||||
span,
|
||||
Ident::empty(),
|
||||
attrs,
|
||||
ItemKind::Impl(Box::new(Impl {
|
||||
unsafety: ast::Unsafe::No,
|
||||
polarity: ast::ImplPolarity::Positive,
|
||||
defaultness: ast::Defaultness::Final,
|
||||
constness: ast::Const::No,
|
||||
generics,
|
||||
of_trait: Some(trait_ref),
|
||||
self_ty: self_type,
|
||||
items: ThinVec::new(),
|
||||
})),
|
||||
);
|
||||
|
||||
push(Annotatable::Item(newitem));
|
||||
}
|
||||
|
||||
fn assert_ty_bounds(
|
||||
cx: &mut ExtCtxt<'_>,
|
||||
stmts: &mut ThinVec<ast::Stmt>,
|
||||
|
@ -36,6 +36,9 @@ fn layout_of<'tcx>(
|
||||
let (param_env, ty) = query.into_parts();
|
||||
debug!(?ty);
|
||||
|
||||
// Optimization: We convert to RevealAll and convert opaque types in the where bounds
|
||||
// to their hidden types. This reduces overall uncached invocations of `layout_of` and
|
||||
// is thus a small performance improvement.
|
||||
let param_env = param_env.with_reveal_all_normalized(tcx);
|
||||
let unnormalized_ty = ty;
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
../std/boxed/struct.Box.html#method.into_raw
|
@ -1 +0,0 @@
|
||||
../std/fs/struct.File.html
|
@ -1 +0,0 @@
|
||||
../std/io/trait.BufRead.html
|
@ -1 +0,0 @@
|
||||
../std/io/trait.Read.html
|
@ -1 +0,0 @@
|
||||
../std/io/trait.Seek.html
|
@ -1 +0,0 @@
|
||||
../std/io/trait.Write.html
|
@ -1 +0,0 @@
|
||||
../std/net/trait.ToSocketAddrs.html
|
@ -1 +0,0 @@
|
||||
../std/process/fn.exit.html
|
@ -1 +0,0 @@
|
||||
../std/string/struct.String.html
|
@ -1289,6 +1289,91 @@ pub fn max_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T {
|
||||
max_by(v1, v2, |v1, v2| f(v1).cmp(&f(v2)))
|
||||
}
|
||||
|
||||
/// Compares and sorts two values, returning minimum and maximum.
|
||||
///
|
||||
/// Returns `[v1, v2]` if the comparison determines them to be equal.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(cmp_minmax)]
|
||||
/// use std::cmp;
|
||||
///
|
||||
/// assert_eq!(cmp::minmax(1, 2), [1, 2]);
|
||||
/// assert_eq!(cmp::minmax(2, 2), [2, 2]);
|
||||
///
|
||||
/// // You can destructure the result using array patterns
|
||||
/// let [min, max] = cmp::minmax(42, 17);
|
||||
/// assert_eq!(min, 17);
|
||||
/// assert_eq!(max, 42);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[must_use]
|
||||
#[unstable(feature = "cmp_minmax", issue = "115939")]
|
||||
pub fn minmax<T>(v1: T, v2: T) -> [T; 2]
|
||||
where
|
||||
T: Ord,
|
||||
{
|
||||
if v1 <= v2 { [v1, v2] } else { [v2, v1] }
|
||||
}
|
||||
|
||||
/// Returns minimum and maximum values with respect to the specified comparison function.
|
||||
///
|
||||
/// Returns `[v1, v2]` if the comparison determines them to be equal.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(cmp_minmax)]
|
||||
/// use std::cmp;
|
||||
///
|
||||
/// assert_eq!(cmp::minmax_by(-2, 1, |x: &i32, y: &i32| x.abs().cmp(&y.abs())), [1, -2]);
|
||||
/// assert_eq!(cmp::minmax_by(-2, 2, |x: &i32, y: &i32| x.abs().cmp(&y.abs())), [-2, 2]);
|
||||
///
|
||||
/// // You can destructure the result using array patterns
|
||||
/// let [min, max] = cmp::minmax_by(-42, 17, |x: &i32, y: &i32| x.abs().cmp(&y.abs()));
|
||||
/// assert_eq!(min, 17);
|
||||
/// assert_eq!(max, -42);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[must_use]
|
||||
#[unstable(feature = "cmp_minmax", issue = "115939")]
|
||||
pub fn minmax_by<T, F>(v1: T, v2: T, compare: F) -> [T; 2]
|
||||
where
|
||||
F: FnOnce(&T, &T) -> Ordering,
|
||||
{
|
||||
if compare(&v1, &v2).is_le() { [v1, v2] } else { [v2, v1] }
|
||||
}
|
||||
|
||||
/// Returns minimum and maximum values with respect to the specified key function.
|
||||
///
|
||||
/// Returns `[v1, v2]` if the comparison determines them to be equal.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(cmp_minmax)]
|
||||
/// use std::cmp;
|
||||
///
|
||||
/// assert_eq!(cmp::minmax_by_key(-2, 1, |x: &i32| x.abs()), [1, -2]);
|
||||
/// assert_eq!(cmp::minmax_by_key(-2, 2, |x: &i32| x.abs()), [-2, 2]);
|
||||
///
|
||||
/// // You can destructure the result using array patterns
|
||||
/// let [min, max] = cmp::minmax_by_key(-42, 17, |x: &i32| x.abs());
|
||||
/// assert_eq!(min, 17);
|
||||
/// assert_eq!(max, -42);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[must_use]
|
||||
#[unstable(feature = "cmp_minmax", issue = "115939")]
|
||||
pub fn minmax_by_key<T, F, K>(v1: T, v2: T, mut f: F) -> [T; 2]
|
||||
where
|
||||
F: FnMut(&T) -> K,
|
||||
K: Ord,
|
||||
{
|
||||
minmax_by(v1, v2, |v1, v2| f(v1).cmp(&f(v2)))
|
||||
}
|
||||
|
||||
// Implementation of PartialEq, Eq, PartialOrd and Ord for primitive types
|
||||
mod impls {
|
||||
use crate::cmp::Ordering::{self, Equal, Greater, Less};
|
||||
|
@ -1,6 +1,3 @@
|
||||
// `library/{std,core}/src/primitive_docs.rs` should have the same contents.
|
||||
// These are different files so that relative links work properly without
|
||||
// having to have `CARGO_PKG_NAME` set, but conceptually they should always be the same.
|
||||
#[rustc_doc_primitive = "bool"]
|
||||
#[doc(alias = "true")]
|
||||
#[doc(alias = "false")]
|
||||
@ -106,7 +103,7 @@ mod prim_bool {}
|
||||
/// behaviour of the `!` type - expressions with type `!` will coerce into any other type.
|
||||
///
|
||||
/// [`u32`]: prim@u32
|
||||
#[doc = concat!("[`exit`]: ", include_str!("../primitive_docs/process_exit.md"))]
|
||||
/// [`exit`]: ../std/process/fn.exit.html
|
||||
///
|
||||
/// # `!` and generics
|
||||
///
|
||||
@ -191,7 +188,7 @@ mod prim_bool {}
|
||||
/// because `!` coerces to `Result<!, ConnectionError>` automatically.
|
||||
///
|
||||
/// [`String::from_str`]: str::FromStr::from_str
|
||||
#[doc = concat!("[`String`]: ", include_str!("../primitive_docs/string_string.md"))]
|
||||
/// [`String`]: ../std/string/struct.String.html
|
||||
/// [`FromStr`]: str::FromStr
|
||||
///
|
||||
/// # `!` and traits
|
||||
@ -267,7 +264,7 @@ mod prim_bool {}
|
||||
/// `impl` for this which simply panics, but the same is true for any type (we could `impl
|
||||
/// Default` for (eg.) [`File`] by just making [`default()`] panic.)
|
||||
///
|
||||
#[doc = concat!("[`File`]: ", include_str!("../primitive_docs/fs_file.md"))]
|
||||
/// [`File`]: ../std/fs/struct.File.html
|
||||
/// [`Debug`]: fmt::Debug
|
||||
/// [`default()`]: Default::default
|
||||
///
|
||||
@ -355,7 +352,7 @@ mod prim_never {}
|
||||
/// assert_eq!(5, s.len() * std::mem::size_of::<u8>());
|
||||
/// ```
|
||||
///
|
||||
#[doc = concat!("[`String`]: ", include_str!("../primitive_docs/string_string.md"))]
|
||||
/// [`String`]: ../std/string/struct.String.html
|
||||
///
|
||||
/// As always, remember that a human intuition for 'character' might not map to
|
||||
/// Unicode's definitions. For example, despite looking similar, the 'é'
|
||||
@ -572,7 +569,7 @@ impl Copy for () {
|
||||
/// [`null_mut`]: ptr::null_mut
|
||||
/// [`is_null`]: pointer::is_null
|
||||
/// [`offset`]: pointer::offset
|
||||
#[doc = concat!("[`into_raw`]: ", include_str!("../primitive_docs/box_into_raw.md"))]
|
||||
/// [`into_raw`]: ../std/boxed/struct.Box.html#method.into_raw
|
||||
/// [`write`]: ptr::write
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_pointer {}
|
||||
@ -1361,7 +1358,7 @@ mod prim_usize {}
|
||||
///
|
||||
/// [`std::fmt`]: fmt
|
||||
/// [`Hash`]: hash::Hash
|
||||
#[doc = concat!("[`ToSocketAddrs`]: ", include_str!("../primitive_docs/net_tosocketaddrs.md"))]
|
||||
/// [`ToSocketAddrs`]: ../std/net/trait.ToSocketAddrs.html
|
||||
///
|
||||
/// `&mut T` references get all of the above except `ToSocketAddrs`, plus the following, if `T`
|
||||
/// implements that trait:
|
||||
@ -1381,10 +1378,10 @@ mod prim_usize {}
|
||||
///
|
||||
/// [`FusedIterator`]: iter::FusedIterator
|
||||
/// [`TrustedLen`]: iter::TrustedLen
|
||||
#[doc = concat!("[`Seek`]: ", include_str!("../primitive_docs/io_seek.md"))]
|
||||
#[doc = concat!("[`BufRead`]: ", include_str!("../primitive_docs/io_bufread.md"))]
|
||||
#[doc = concat!("[`Read`]: ", include_str!("../primitive_docs/io_read.md"))]
|
||||
#[doc = concat!("[`io::Write`]: ", include_str!("../primitive_docs/io_write.md"))]
|
||||
/// [`Seek`]: ../std/io/trait.Seek.html
|
||||
/// [`BufRead`]: ../std/io/trait.BufRead.html
|
||||
/// [`Read`]: ../std/io/trait.Read.html
|
||||
/// [`io::Write`]: ../std/io/trait.Write.html
|
||||
///
|
||||
/// Note that due to method call deref coercion, simply calling a trait method will act like they
|
||||
/// work on references as well as they do on owned values! The implementations described here are
|
||||
|
@ -1,4 +1,4 @@
|
||||
// See src/libstd/primitive_docs.rs for documentation.
|
||||
// See core/src/primitive_docs.rs for documentation.
|
||||
|
||||
use crate::cmp::Ordering::{self, *};
|
||||
use crate::marker::ConstParamTy;
|
||||
|
@ -1 +0,0 @@
|
||||
Box::into_raw
|
@ -1 +0,0 @@
|
||||
fs::File
|
@ -1 +0,0 @@
|
||||
io::BufRead
|
@ -1 +0,0 @@
|
||||
io::Read
|
@ -1 +0,0 @@
|
||||
io::Seek
|
@ -1 +0,0 @@
|
||||
io::Write
|
@ -1 +0,0 @@
|
||||
net::ToSocketAddrs
|
@ -1 +0,0 @@
|
||||
process::exit
|
@ -1 +0,0 @@
|
||||
string::String
|
@ -673,7 +673,7 @@ pub mod arch {
|
||||
// Include a number of private modules that exist solely to provide
|
||||
// the rustdoc documentation for primitive types. Using `include!`
|
||||
// because rustdoc only looks for these modules at the crate level.
|
||||
include!("primitive_docs.rs");
|
||||
include!("../../core/src/primitive_docs.rs");
|
||||
|
||||
// Include a number of private modules that exist solely to provide
|
||||
// the rustdoc documentation for the existing keywords. Using `include!`
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -114,7 +114,7 @@ x--expand-yaml-anchors--remove:
|
||||
run: git config --global core.autocrlf false
|
||||
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
@ -707,7 +707,7 @@ jobs:
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'rust-lang-ci/rust'
|
||||
steps:
|
||||
- name: checkout the source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
|
@ -63,7 +63,6 @@ fn tidy_error(bad: &mut bool, args: impl Display) -> std::io::Result<()> {
|
||||
pub mod fluent_alphabetical;
|
||||
pub mod mir_opt_tests;
|
||||
pub mod pal;
|
||||
pub mod primitive_docs;
|
||||
pub mod rustdoc_css_themes;
|
||||
pub mod rustdoc_gui_tests;
|
||||
pub mod style;
|
||||
|
@ -112,7 +112,6 @@ macro_rules! check {
|
||||
|
||||
// Checks that only make sense for the std libs.
|
||||
check!(pal, &library_path);
|
||||
check!(primitive_docs, &library_path);
|
||||
|
||||
// Checks that need to be done for both the compiler and std libraries.
|
||||
check!(unit_tests, &src_path);
|
||||
|
@ -1,17 +0,0 @@
|
||||
//! Tidy check to make sure `library/{std,core}/src/primitive_docs.rs` are the same file. These are
|
||||
//! different files so that relative links work properly without having to have `CARGO_PKG_NAME`
|
||||
//! set, but conceptually they should always be the same.
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
pub fn check(library_path: &Path, bad: &mut bool) {
|
||||
let std_name = "std/src/primitive_docs.rs";
|
||||
let core_name = "core/src/primitive_docs.rs";
|
||||
let std_contents = std::fs::read_to_string(library_path.join(std_name))
|
||||
.unwrap_or_else(|e| panic!("failed to read library/{std_name}: {e}"));
|
||||
let core_contents = std::fs::read_to_string(library_path.join(core_name))
|
||||
.unwrap_or_else(|e| panic!("failed to read library/{core_name}: {e}"));
|
||||
if std_contents != core_contents {
|
||||
tidy_error!(bad, "library/{core_name} and library/{std_name} have different contents");
|
||||
}
|
||||
}
|
@ -621,6 +621,7 @@ bootstrap = [
|
||||
]
|
||||
infra-ci = [
|
||||
"@Mark-Simulacrum",
|
||||
"@Kobzol",
|
||||
]
|
||||
rustdoc = [
|
||||
"@jsha",
|
||||
|
Loading…
Reference in New Issue
Block a user