Auto merge of #75238 - JohnTitor:rollup-llbk0sq, r=JohnTitor
Rollup of 12 pull requests Successful merges: - #74888 (compiletest: ignore-endian-big, fixes #74829, fixes #74885) - #75175 (Make doctests of Ipv4Addr::from(u32) easier to read) - #75179 (Remove unused FromInner impl for Ipv4Addr) - #75181 (Fix typo in `librustc_feature/active.rs`) - #75183 (Label rustfmt toolstate issues with A-rustfmt) - #75188 (Handle fieldless tuple structs in diagnostic code) - #75190 (Clean up E0746 explanation) - #75210 (Change the type of `AssertModuleSource::available_cgus`.) - #75211 (Note about endianness of returned value of {integer}::from_be_bytes and friends) - #75217 (Clean up E0747 explanation) - #75232 (Fix typo "TraitObligatiom" -> "TraitObligation") - #75236 (Fix typo "biset" -> "bitset") Failed merges: r? @ghost
This commit is contained in:
commit
6396dbbd62
21 changed files with 83 additions and 44 deletions
|
@ -4383,8 +4383,8 @@ assert_eq!(
|
|||
}
|
||||
|
||||
doc_comment! {
|
||||
concat!("Create an integer value from its representation as a byte array in
|
||||
big endian.
|
||||
concat!("Create a native endian integer value from its representation
|
||||
as a byte array in big endian.
|
||||
",
|
||||
$from_xe_bytes_doc,
|
||||
"
|
||||
|
@ -4416,8 +4416,8 @@ fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT),
|
|||
|
||||
doc_comment! {
|
||||
concat!("
|
||||
Create an integer value from its representation as a byte array in
|
||||
little endian.
|
||||
Create a native endian integer value from its representation
|
||||
as a byte array in little endian.
|
||||
",
|
||||
$from_xe_bytes_doc,
|
||||
"
|
||||
|
@ -4448,8 +4448,8 @@ fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT),
|
|||
}
|
||||
|
||||
doc_comment! {
|
||||
concat!("Create an integer value from its memory representation as a byte
|
||||
array in native endianness.
|
||||
concat!("Create a native endian integer value from its memory representation
|
||||
as a byte array in native endianness.
|
||||
|
||||
As the target platform's native endianness is used, portable code
|
||||
likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
|
||||
|
|
|
@ -961,11 +961,6 @@ impl AsInner<c::in_addr> for Ipv4Addr {
|
|||
&self.inner
|
||||
}
|
||||
}
|
||||
impl FromInner<c::in_addr> for Ipv4Addr {
|
||||
fn from_inner(addr: c::in_addr) -> Ipv4Addr {
|
||||
Ipv4Addr { inner: addr }
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "ip_u32", since = "1.1.0")]
|
||||
impl From<Ipv4Addr> for u32 {
|
||||
|
@ -976,8 +971,8 @@ impl From<Ipv4Addr> for u32 {
|
|||
/// ```
|
||||
/// use std::net::Ipv4Addr;
|
||||
///
|
||||
/// let addr = Ipv4Addr::new(13, 12, 11, 10);
|
||||
/// assert_eq!(0x0d0c0b0au32, u32::from(addr));
|
||||
/// let addr = Ipv4Addr::new(0xca, 0xfe, 0xba, 0xbe);
|
||||
/// assert_eq!(0xcafebabe, u32::from(addr));
|
||||
/// ```
|
||||
fn from(ip: Ipv4Addr) -> u32 {
|
||||
let ip = ip.octets();
|
||||
|
@ -994,8 +989,8 @@ impl From<u32> for Ipv4Addr {
|
|||
/// ```
|
||||
/// use std::net::Ipv4Addr;
|
||||
///
|
||||
/// let addr = Ipv4Addr::from(0x0d0c0b0au32);
|
||||
/// assert_eq!(Ipv4Addr::new(13, 12, 11, 10), addr);
|
||||
/// let addr = Ipv4Addr::from(0xcafebabe);
|
||||
/// assert_eq!(Ipv4Addr::new(0xca, 0xfe, 0xba, 0xbe), addr);
|
||||
/// ```
|
||||
fn from(ip: u32) -> Ipv4Addr {
|
||||
Ipv4Addr::from(ip.to_be_bytes())
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Return types cannot be `dyn Trait`s as they must be `Sized`.
|
||||
An unboxed trait object was used as a return value.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
|
@ -13,11 +13,13 @@ impl T for S {
|
|||
|
||||
// Having the trait `T` as return type is invalid because
|
||||
// unboxed trait objects do not have a statically known size:
|
||||
fn foo() -> dyn T {
|
||||
fn foo() -> dyn T { // error!
|
||||
S(42)
|
||||
}
|
||||
```
|
||||
|
||||
Return types cannot be `dyn Trait`s as they must be `Sized`.
|
||||
|
||||
To avoid the error there are a couple of options.
|
||||
|
||||
If there is a single type involved, you can use [`impl Trait`]:
|
||||
|
@ -32,7 +34,7 @@ If there is a single type involved, you can use [`impl Trait`]:
|
|||
# }
|
||||
// The compiler will select `S(usize)` as the materialized return type of this
|
||||
// function, but callers will only know that the return type implements `T`.
|
||||
fn foo() -> impl T {
|
||||
fn foo() -> impl T { // ok!
|
||||
S(42)
|
||||
}
|
||||
```
|
||||
|
@ -57,7 +59,7 @@ impl T for O {
|
|||
|
||||
// This now returns a "trait object" and callers are only be able to access
|
||||
// associated items from `T`.
|
||||
fn foo(x: bool) -> Box<dyn T> {
|
||||
fn foo(x: bool) -> Box<dyn T> { // ok!
|
||||
if x {
|
||||
Box::new(S(42))
|
||||
} else {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Generic arguments must be provided in the same order as the corresponding
|
||||
Generic arguments were not provided in the same order as the corresponding
|
||||
generic parameters are declared.
|
||||
|
||||
Erroneous code example:
|
||||
|
@ -11,7 +11,7 @@ type X = S<(), 'static>; // error: the type argument is provided before the
|
|||
```
|
||||
|
||||
The argument order should be changed to match the parameter declaration
|
||||
order, as in the following.
|
||||
order, as in the following:
|
||||
|
||||
```
|
||||
struct S<'a, T>(&'a T);
|
||||
|
|
|
@ -576,7 +576,7 @@ declare_features! (
|
|||
/// Lazily evaluate constants. This allows constants to depend on type parameters.
|
||||
(active, lazy_normalization_consts, "1.46.0", Some(72219), None),
|
||||
|
||||
/// Alloc calling `transmute` in const fn
|
||||
/// Allows calling `transmute` in const fn
|
||||
(active, const_fn_transmute, "1.46.0", Some(53605), None),
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
@ -39,8 +39,8 @@ pub fn assert_module_sources(tcx: TyCtxt<'_>) {
|
|||
.collect_and_partition_mono_items(LOCAL_CRATE)
|
||||
.1
|
||||
.iter()
|
||||
.map(|cgu| cgu.name())
|
||||
.collect::<BTreeSet<Symbol>>();
|
||||
.map(|cgu| cgu.name().to_string())
|
||||
.collect::<BTreeSet<String>>();
|
||||
|
||||
let ams = AssertModuleSource { tcx, available_cgus };
|
||||
|
||||
|
@ -52,7 +52,7 @@ pub fn assert_module_sources(tcx: TyCtxt<'_>) {
|
|||
|
||||
struct AssertModuleSource<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
available_cgus: BTreeSet<Symbol>,
|
||||
available_cgus: BTreeSet<String>,
|
||||
}
|
||||
|
||||
impl AssertModuleSource<'tcx> {
|
||||
|
@ -121,12 +121,11 @@ impl AssertModuleSource<'tcx> {
|
|||
|
||||
debug!("mapping '{}' to cgu name '{}'", self.field(attr, sym::module), cgu_name);
|
||||
|
||||
if !self.available_cgus.contains(&cgu_name) {
|
||||
if !self.available_cgus.contains(&*cgu_name.as_str()) {
|
||||
self.tcx.sess.span_err(
|
||||
attr.span,
|
||||
&format!(
|
||||
"no module named `{}` (mangled: {}). \
|
||||
Available modules: {}",
|
||||
"no module named `{}` (mangled: {}). Available modules: {}",
|
||||
user_path,
|
||||
cgu_name,
|
||||
self.available_cgus
|
||||
|
|
|
@ -1075,10 +1075,9 @@ impl<'a> Resolver<'a> {
|
|||
) = binding.kind
|
||||
{
|
||||
let def_id = (&*self).parent(ctor_def_id).expect("no parent for a constructor");
|
||||
if let Some(fields) = self.field_names.get(&def_id) {
|
||||
let first_field = fields.first().expect("empty field list in the map");
|
||||
return Some(fields.iter().fold(first_field.span, |acc, field| acc.to(field.span)));
|
||||
}
|
||||
let fields = self.field_names.get(&def_id)?;
|
||||
let first_field = fields.first()?; // Handle `struct Foo()`
|
||||
return Some(fields.iter().fold(first_field.span, |acc, field| acc.to(field.span)));
|
||||
}
|
||||
None
|
||||
}
|
||||
|
|
|
@ -440,7 +440,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
obligation
|
||||
);
|
||||
|
||||
// `previous_stack` stores a `TraitObligatiom`, while `obligation` is
|
||||
// `previous_stack` stores a `TraitObligation`, while `obligation` is
|
||||
// a `PredicateObligation`. These are distinct types, so we can't
|
||||
// use any `Option` combinator method that would force them to be
|
||||
// the same.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// ignore-endian-big
|
||||
extern "C" {
|
||||
static X: i32;
|
||||
}
|
||||
|
||||
static Y: i32 = 42;
|
||||
|
||||
// EMIT_MIR const_promotion_extern_static.BAR.PromoteTemps.diff
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// ignore-endian-big
|
||||
// EMIT_MIR_FOR_EACH_BIT_WIDTH
|
||||
|
||||
static FOO: &[(Option<i32>, &[&str])] =
|
||||
&[(None, &[]), (None, &["foo", "bar"]), (Some(42), &["meh", "mop", "möp"])];
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// ignore-endian-big
|
||||
// EMIT_MIR_FOR_EACH_BIT_WIDTH
|
||||
|
||||
// EMIT_MIR const_allocation2.main.ConstProp.after.mir
|
||||
fn main() {
|
||||
FOO;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// ignore-endian-big
|
||||
// EMIT_MIR_FOR_EACH_BIT_WIDTH
|
||||
|
||||
// EMIT_MIR const_allocation3.main.ConstProp.after.mir
|
||||
fn main() {
|
||||
FOO;
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
// ignore-endian-big
|
||||
// ignore-wasm32-bare compiled with panic=abort by default
|
||||
// compile-flags: -Z mir-opt-level=3
|
||||
// EMIT_MIR_FOR_EACH_BIT_WIDTH
|
||||
#![feature(box_syntax)]
|
||||
|
||||
// EMIT_MIR inline_into_box_place.main.Inline.diff
|
||||
fn main() {
|
||||
let _x: Box<Vec<u32>> = box Vec::new();
|
||||
|
|
10
src/test/ui/privacy/issue-75062-fieldless-tuple-struct.rs
Normal file
10
src/test/ui/privacy/issue-75062-fieldless-tuple-struct.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
// Regression test for issue #75062
|
||||
// Tests that we don't ICE on a privacy error for a fieldless tuple struct.
|
||||
|
||||
mod foo {
|
||||
struct Bar();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo::Bar(); //~ ERROR tuple struct
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
error[E0603]: tuple struct `Bar` is private
|
||||
--> $DIR/issue-75062-fieldless-tuple-struct.rs:9:10
|
||||
|
|
||||
LL | foo::Bar();
|
||||
| ^^^ private tuple struct
|
||||
|
|
||||
note: the tuple struct `Bar` is defined here
|
||||
--> $DIR/issue-75062-fieldless-tuple-struct.rs:5:5
|
||||
|
|
||||
LL | struct Bar();
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0603`.
|
|
@ -2,6 +2,7 @@
|
|||
#![allow(non_camel_case_types)]
|
||||
|
||||
// ignore-emscripten
|
||||
// ignore-endian-big behavior of simd_bitmask is endian-specific
|
||||
|
||||
// Test that the simd_bitmask intrinsic produces correct results.
|
||||
|
||||
|
|
|
@ -2,10 +2,7 @@
|
|||
#![allow(non_camel_case_types)]
|
||||
|
||||
// ignore-emscripten
|
||||
// ignore-mips behavior of simd_select_bitmask is endian-specific
|
||||
// ignore-mips64 behavior of simd_select_bitmask is endian-specific
|
||||
// ignore-powerpc behavior of simd_select_bitmask is endian-specific
|
||||
// ignore-powerpc64 behavior of simd_select_bitmask is endian-specific
|
||||
// ignore-endian-big behavior of simd_select_bitmask is endian-specific
|
||||
|
||||
// Test that the simd_select intrinsics produces correct results.
|
||||
|
||||
|
|
|
@ -827,6 +827,7 @@ impl Config {
|
|||
name == util::get_pointer_width(&self.target) || // pointer width
|
||||
name == self.stage_id.split('-').next().unwrap() || // stage
|
||||
(self.target != self.host && name == "cross-compile") ||
|
||||
(name == "endian-big" && util::is_big_endian(&self.target)) ||
|
||||
(self.remote_test_client.is_some() && name == "remote") ||
|
||||
match self.compare_mode {
|
||||
Some(CompareMode::Nll) => name == "compare-mode-nll",
|
||||
|
|
|
@ -99,6 +99,20 @@ pub const MSAN_SUPPORTED_TARGETS: &'static [&'static str] =
|
|||
pub const TSAN_SUPPORTED_TARGETS: &'static [&'static str] =
|
||||
&["aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];
|
||||
|
||||
const BIG_ENDIAN: &'static [&'static str] = &[
|
||||
"armebv7r",
|
||||
"mips",
|
||||
"mips64",
|
||||
"mipsisa32r6",
|
||||
"mipsisa64r6",
|
||||
"powerpc",
|
||||
"powerpc64",
|
||||
"s390x",
|
||||
"sparc",
|
||||
"sparc64",
|
||||
"sparcv9",
|
||||
];
|
||||
|
||||
pub fn matches_os(triple: &str, name: &str) -> bool {
|
||||
// For the wasm32 bare target we ignore anything also ignored on emscripten
|
||||
// and then we also recognize `wasm32-bare` as the os for the target
|
||||
|
@ -125,6 +139,12 @@ pub fn get_arch(triple: &str) -> &'static str {
|
|||
panic!("Cannot determine Architecture from triple");
|
||||
}
|
||||
|
||||
/// Determine the endianness from `triple`
|
||||
pub fn is_big_endian(triple: &str) -> bool {
|
||||
let triple_arch = triple.split('-').next().unwrap();
|
||||
BIG_ENDIAN.contains(&triple_arch)
|
||||
}
|
||||
|
||||
pub fn matches_env(triple: &str, name: &str) -> bool {
|
||||
if let Some(env) = triple.split('-').nth(3) { env.starts_with(name) } else { false }
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ MAINTAINERS = {
|
|||
LABELS = {
|
||||
'miri': ['A-miri', 'C-bug'],
|
||||
'rls': ['A-rls', 'C-bug'],
|
||||
'rustfmt': ['C-bug'],
|
||||
'rustfmt': ['A-rustfmt', 'C-bug'],
|
||||
'book': ['C-bug'],
|
||||
'nomicon': ['C-bug'],
|
||||
'reference': ['C-bug'],
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
//! We have two separate encoding schemes: a skiplist-like approach, and a
|
||||
//! compressed bitset. The datasets we consider mostly use the skiplist (it's
|
||||
//! smaller) but the lowercase and uppercase sets are sufficiently sparse for
|
||||
//! the bitset to be worthwhile -- for those sets the biset is a 2x size win.
|
||||
//! the bitset to be worthwhile -- for those sets the bitset is a 2x size win.
|
||||
//! Since the bitset is also faster, this seems an obvious choice. (As a
|
||||
//! historical note, the bitset was also the prior implementation, so its
|
||||
//! relative complexity had already been paid).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue