mirror of
https://github.com/rust-lang/rust
synced 2024-09-30 22:04:36 +00:00
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:
commit
3121a5ca3b
|
@ -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);
|
||||
|
|
|
@ -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() {}
|
|
@ -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 {
|
22
tests/ui/static/duplicated-fields-issue-124464.stderr
Normal file
22
tests/ui/static/duplicated-fields-issue-124464.stderr
Normal 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`.
|
21
tests/ui/static/duplicated-fields-issue-125842.rs
Normal file
21
tests/ui/static/duplicated-fields-issue-125842.rs
Normal 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() {}
|
11
tests/ui/static/duplicated-fields-issue-125842.stderr
Normal file
11
tests/ui/static/duplicated-fields-issue-125842.stderr
Normal 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`.
|
Loading…
Reference in a new issue