Skip to content

Commit

Permalink
Rollup merge of rust-lang#126045 - olafes:master, r=compiler-errors
Browse files Browse the repository at this point in the history
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 rust-lang#125842, fixes rust-lang#124464, fixes rust-lang#124552
```rust
struct Struct {
    field: Option<u8>,
    field: u8,
}

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

pub fn main() {}
```
(This was rust-lang#125947 but i messed something up, sorry)
r? `@compiler-errors`
  • Loading branch information
matthiaskrgr authored Jun 5, 2024
2 parents 2519053 + 743c417 commit ec6a80f
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 13 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_hir_typeck/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

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);
Expand Down
12 changes: 0 additions & 12 deletions tests/crashes/124552.rs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
22 changes: 22 additions & 0 deletions tests/ui/static/duplicated-fields-issue-124464.stderr
Original file line number Diff line number Diff line change
@@ -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`.
21 changes: 21 additions & 0 deletions tests/ui/static/duplicated-fields-issue-125842.rs
Original file line number Diff line number Diff line change
@@ -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() {}
11 changes: 11 additions & 0 deletions tests/ui/static/duplicated-fields-issue-125842.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit ec6a80f

Please sign in to comment.