Skip to content

Commit

Permalink
Add test for restriction of anonymous types on validation
Browse files Browse the repository at this point in the history
  • Loading branch information
jedel1043 committed May 16, 2021
1 parent d4ad050 commit 8a1dd69
Show file tree
Hide file tree
Showing 2 changed files with 227 additions and 0 deletions.
52 changes: 52 additions & 0 deletions src/test/ui/unnamed_fields/restrict_anonymous.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#![allow(incomplete_features)]
#![feature(unnamed_fields)]

fn f() -> struct { field: u8 } {} //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

fn f2(a: struct { field: u8 } ) {} //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

union G {
field: struct { field: u8 } //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented
}
//~| ERROR unions may not contain fields that need dropping [E0740]

struct H { _: u8 } // Should error after hir checks

struct I(struct { field: u8 }, u8); //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

enum J {
K(struct { field: u8 }), //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented
L {
_ : struct { field: u8 } //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous fields are not allowed outside of structs or unions
//~| ERROR anonymous structs are unimplemented
},
M {
_ : u8 //~ ERROR anonymous fields are not allowed outside of structs or unions
}
}

static M: union { field: u8 } = 0; //~ ERROR anonymous unions are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous unions are unimplemented

type N = union { field: u8 }; //~ ERROR anonymous unions are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous unions are unimplemented

fn main() {
const O: struct { field: u8 } = 0; //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

let p: [struct { field: u8 }; 1]; //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

let q: (struct { field: u8 }, u8); //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented

let cl = || -> struct { field: u8 } {}; //~ ERROR anonymous structs are not allowed outside of unnamed struct or union fields
//~^ ERROR anonymous structs are unimplemented
}
175 changes: 175 additions & 0 deletions src/test/ui/unnamed_fields/restrict_anonymous.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:4:11
|
LL | fn f() -> struct { field: u8 } {}
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:7:10
|
LL | fn f2(a: struct { field: u8 } ) {}
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:11:12
|
LL | field: struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:18:10
|
LL | struct I(struct { field: u8 }, u8);
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:22:7
|
LL | K(struct { field: u8 }),
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous fields are not allowed outside of structs or unions
--> $DIR/restrict_anonymous.rs:25:9
|
LL | _ : struct { field: u8 }
| -^^^^^^^^^^^^^^^^^^^^^^^
| |
| anonymous field declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:25:13
|
LL | _ : struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous fields are not allowed outside of structs or unions
--> $DIR/restrict_anonymous.rs:30:9
|
LL | _ : u8
| -^^^^^
| |
| anonymous field declared here

error: anonymous unions are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:34:11
|
LL | static M: union { field: u8 } = 0;
| ^^^^^^^^^^^^^^^^^^^ anonymous union declared here

error: anonymous unions are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:37:10
|
LL | type N = union { field: u8 };
| ^^^^^^^^^^^^^^^^^^^ anonymous union declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:41:14
|
LL | const O: struct { field: u8 } = 0;
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:44:13
|
LL | let p: [struct { field: u8 }; 1];
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:47:13
|
LL | let q: (struct { field: u8 }, u8);
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are not allowed outside of unnamed struct or union fields
--> $DIR/restrict_anonymous.rs:50:20
|
LL | let cl = || -> struct { field: u8 } {};
| ^^^^^^^^^^^^^^^^^^^^ anonymous struct declared here

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:4:11
|
LL | fn f() -> struct { field: u8 } {}
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:7:10
|
LL | fn f2(a: struct { field: u8 } ) {}
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:11:12
|
LL | field: struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:18:10
|
LL | struct I(struct { field: u8 }, u8);
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:22:7
|
LL | K(struct { field: u8 }),
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:25:13
|
LL | _ : struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous unions are unimplemented
--> $DIR/restrict_anonymous.rs:34:11
|
LL | static M: union { field: u8 } = 0;
| ^^^^^^^^^^^^^^^^^^^

error: anonymous unions are unimplemented
--> $DIR/restrict_anonymous.rs:37:10
|
LL | type N = union { field: u8 };
| ^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:44:13
|
LL | let p: [struct { field: u8 }; 1];
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:47:13
|
LL | let q: (struct { field: u8 }, u8);
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:50:20
|
LL | let cl = || -> struct { field: u8 } {};
| ^^^^^^^^^^^^^^^^^^^^

error: anonymous structs are unimplemented
--> $DIR/restrict_anonymous.rs:41:14
|
LL | const O: struct { field: u8 } = 0;
| ^^^^^^^^^^^^^^^^^^^^

error[E0740]: unions may not contain fields that need dropping
--> $DIR/restrict_anonymous.rs:11:5
|
LL | field: struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `std::mem::ManuallyDrop` can be used to wrap the type
--> $DIR/restrict_anonymous.rs:11:5
|
LL | field: struct { field: u8 }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 27 previous errors

For more information about this error, try `rustc --explain E0740`.

0 comments on commit 8a1dd69

Please sign in to comment.