Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 6 pull requests #75206

Closed
wants to merge 13 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/librustc_error_codes/error_codes/E0746.md
Original file line number Diff line number Diff line change
@@ -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:

Expand All @@ -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`]:
Expand All @@ -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)
}
```
Expand All @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_feature/active.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),

// -------------------------------------------------------------------------
Expand Down
7 changes: 3 additions & 4 deletions src/librustc_resolve/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/const-promotion-extern-static.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/const_allocation.rs
Original file line number Diff line number Diff line change
@@ -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"])];

Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/const_allocation2.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// ignore-endian-big
// EMIT_MIR_FOR_EACH_BIT_WIDTH

// EMIT_MIR const_allocation2.main.ConstProp.after.mir
fn main() {
FOO;
Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/const_allocation3.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// ignore-endian-big
// EMIT_MIR_FOR_EACH_BIT_WIDTH

// EMIT_MIR const_allocation3.main.ConstProp.after.mir
fn main() {
FOO;
Expand Down
2 changes: 1 addition & 1 deletion src/test/mir-opt/inline/inline-into-box-place.rs
Original file line number Diff line number Diff line change
@@ -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();
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/higher-rank-trait-bounds/issue-59311.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Regression test for #59311. The test is taken from
// rust-lang/rust/issues/71546#issuecomment-620638437
// as they seem to have the same cause.

// FIXME: It's not clear that this code ought to report
// an error, but the regression test is here to ensure
// that it does not ICE. See discussion on #74889 for details.

pub trait T {
fn t<F: Fn()>(&self, _: F) {}
}

pub fn crash<V>(v: &V)
where
for<'a> &'a V: T + 'static,
{
v.t(|| {}); //~ ERROR: higher-ranked subtype error
}

fn main() {}
8 changes: 8 additions & 0 deletions src/test/ui/higher-rank-trait-bounds/issue-59311.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: higher-ranked subtype error
--> $DIR/issue-59311.rs:17:9
|
LL | v.t(|| {});
| ^^^^^

error: aborting due to previous error

10 changes: 10 additions & 0 deletions src/test/ui/privacy/issue-75062-fieldless-tuple-struct.rs
Original file line number Diff line number Diff line change
@@ -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
}
15 changes: 15 additions & 0 deletions src/test/ui/privacy/issue-75062-fieldless-tuple-struct.stderr
Original file line number Diff line number Diff line change
@@ -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`.
1 change: 1 addition & 0 deletions src/test/ui/simd/simd-intrinsic-generic-bitmask.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
5 changes: 1 addition & 4 deletions src/test/ui/simd/simd-intrinsic-generic-select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
1 change: 1 addition & 0 deletions src/tools/compiletest/src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
20 changes: 20 additions & 0 deletions src/tools/compiletest/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 }
}
Expand Down
2 changes: 1 addition & 1 deletion src/tools/publish_toolstate.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
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'],
Expand Down