forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add test for restriction of anonymous types on validation
- Loading branch information
Showing
2 changed files
with
227 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`. |