Rollup merge of #126045 - olafes:master, r=compiler-errors

check_expr_struct_fields: taint context with errors if struct definit…

Taint errors while checking `struct { field: 1 }` below if struct definition has duplicated fields so that we don't pass it to const eval.

fixes #125842, fixes #124464, fixes #124552
```rust
struct Struct {
    field: Option<u8>,
    field: u8,
}

static STATIC: Struct = Struct {
    field: 1,
};

pub fn main() {}
```
(This was #125947 but i messed something up, sorry)
r? ``@compiler-errors``
This commit is contained in:
Matthias Krüger 2024-06-06 04:17:27 +02:00 committed by GitHub
commit 3121a5ca3b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 68 additions and 13 deletions

View file

@ -1671,6 +1671,15 @@ fn check_expr_struct_fields(
let mut error_happened = false;
if variant.fields.len() != remaining_fields.len() {
// Some field is defined more than once. Make sure we don't try to
// instantiate this struct in static/const context.
let guar =
self.dcx().span_delayed_bug(expr.span, "struct fields have non-unique names");
self.set_tainted_by_errors(guar);
error_happened = true;
}
// Type-check each field.
for (idx, field) in hir_fields.iter().enumerate() {
let ident = tcx.adjust_ident(field.ident, variant.def_id);

View file

@ -1,12 +0,0 @@
//@ known-bug: rust-lang/rust#124552
struct B;
struct Foo {
b: u32,
b: B,
}
static BAR: Foo = Foo { b: B };
fn main() {}

View file

@ -1,12 +1,16 @@
//@ known-bug: rust-lang/rust #124464
// Don't const eval fields with ambiguous layout.
// See issues #125842 and #124464.
enum TestOption<T> {
TestSome(T),
TestSome(T),
//~^ ERROR the name `TestSome` is defined multiple times
}
pub struct Request {
bar: TestOption<u64>,
bar: u8,
//~^ ERROR field `bar` is already declared
}
fn default_instance() -> &'static Request {

View file

@ -0,0 +1,22 @@
error[E0428]: the name `TestSome` is defined multiple times
--> $DIR/duplicated-fields-issue-124464.rs:6:5
|
LL | TestSome(T),
| ----------- previous definition of the type `TestSome` here
LL | TestSome(T),
| ^^^^^^^^^^^ `TestSome` redefined here
|
= note: `TestSome` must be defined only once in the type namespace of this enum
error[E0124]: field `bar` is already declared
--> $DIR/duplicated-fields-issue-124464.rs:12:5
|
LL | bar: TestOption<u64>,
| -------------------- `bar` first declared here
LL | bar: u8,
| ^^^^^^^ field already declared
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0124, E0428.
For more information about an error, try `rustc --explain E0124`.

View file

@ -0,0 +1,21 @@
// Do not try to evaluate static initalizers that reference
// ill-defined types. This used to be an ICE.
// See issues #125842 and #124464.
struct Struct {
field: Option<u8>,
field: u8,
//~^ ERROR field `field` is already declared
}
static STATIC_A: Struct = Struct {
field: 1
};
static STATIC_B: Struct = {
let field = 1;
Struct {
field,
}
};
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0124]: field `field` is already declared
--> $DIR/duplicated-fields-issue-125842.rs:6:5
|
LL | field: Option<u8>,
| ----------------- `field` first declared here
LL | field: u8,
| ^^^^^^^^^ field already declared
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0124`.