mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // normalize-stderr-test: "existed:.*\(" -> "existed: $$FILE_NOT_FOUND_MSG ("
 | |
| 
 | |
| // test that errors in a (selection) of macros don't kill compilation
 | |
| // immediately, so that we get more errors listed at a time.
 | |
| 
 | |
| #![feature(trace_macros, concat_idents)]
 | |
| #![feature(stmt_expr_attributes)]
 | |
| 
 | |
| use std::arch::asm;
 | |
| 
 | |
| #[derive(Default)]
 | |
| struct DefaultInnerAttrStruct {
 | |
|     #[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
|     foo: (),
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| struct DefaultInnerAttrTupleStruct(#[default] ());
 | |
| //~^ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
| 
 | |
| #[derive(Default)]
 | |
| #[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
| struct DefaultOuterAttrStruct {}
 | |
| 
 | |
| #[derive(Default)]
 | |
| #[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
| enum DefaultOuterAttrEnum {
 | |
|     #[default]
 | |
|     Foo,
 | |
| }
 | |
| 
 | |
| #[rustfmt::skip] // needs some work to handle this case
 | |
| #[repr(u8)]
 | |
| #[derive(Default)]
 | |
| enum AttrOnInnerExpression {
 | |
|     Foo = #[default] 0, //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
|     Bar([u8; #[default] 1]), //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
|     #[default]
 | |
|     Baz,
 | |
| }
 | |
| 
 | |
| #[derive(Default)] //~ ERROR no default declared
 | |
| enum NoDeclaredDefault {
 | |
|     Foo,
 | |
|     Bar,
 | |
| }
 | |
| 
 | |
| #[derive(Default)] //~ ERROR multiple declared defaults
 | |
| enum MultipleDefaults {
 | |
|     #[default]
 | |
|     Foo,
 | |
|     #[default]
 | |
|     Bar,
 | |
|     #[default]
 | |
|     Baz,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| enum ExtraDeriveTokens {
 | |
|     #[default = 1] //~ ERROR `#[default]` attribute does not accept a value
 | |
|     Foo,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| enum TwoDefaultAttrs {
 | |
|     #[default]
 | |
|     #[default]
 | |
|     Foo, //~ERROR multiple `#[default]` attributes
 | |
|     Bar,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| enum ManyDefaultAttrs {
 | |
|     #[default]
 | |
|     #[default]
 | |
|     #[default]
 | |
|     #[default]
 | |
|     Foo, //~ERROR multiple `#[default]` attributes
 | |
|     Bar,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| enum DefaultHasFields {
 | |
|     #[default]
 | |
|     Foo {}, //~ ERROR the `#[default]` attribute may only be used on unit enum variants
 | |
|     Bar,
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| enum NonExhaustiveDefault {
 | |
|     #[default]
 | |
|     #[non_exhaustive]
 | |
|     Foo, //~ ERROR default variant must be exhaustive
 | |
|     Bar,
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     asm!(invalid); //~ ERROR
 | |
|     llvm_asm!(invalid); //~ ERROR
 | |
| 
 | |
|     concat_idents!("not", "idents"); //~ ERROR
 | |
| 
 | |
|     option_env!(invalid); //~ ERROR
 | |
|     env!(invalid); //~ ERROR
 | |
|     env!(foo, abr, baz); //~ ERROR
 | |
|     env!("RUST_HOPEFULLY_THIS_DOESNT_EXIST"); //~ ERROR
 | |
| 
 | |
|     format!(invalid); //~ ERROR
 | |
| 
 | |
|     include!(invalid); //~ ERROR
 | |
| 
 | |
|     include_str!(invalid); //~ ERROR
 | |
|     include_str!("i'd be quite surprised if a file with this name existed"); //~ ERROR
 | |
|     include_bytes!(invalid); //~ ERROR
 | |
|     include_bytes!("i'd be quite surprised if a file with this name existed"); //~ ERROR
 | |
| 
 | |
|     trace_macros!(invalid); //~ ERROR
 | |
| }
 | |
| 
 | |
| /// Check that `#[derive(Default)]` does use a `T : Default` bound when the
 | |
| /// `#[default]` variant is `#[non_exhaustive]` (should this end up allowed).
 | |
| const _: () = {
 | |
|     #[derive(Default)]
 | |
|     enum NonExhaustiveDefaultGeneric<T> {
 | |
|         #[default]
 | |
|         #[non_exhaustive]
 | |
|         Foo, //~ ERROR default variant must be exhaustive
 | |
|         Bar(T),
 | |
|     }
 | |
| 
 | |
|     fn assert_impls_default<T: Default>() {}
 | |
| 
 | |
|     enum NotDefault {}
 | |
| 
 | |
|     // Note: the `derive(Default)` currently bails early enough for trait-checking
 | |
|     // not to happen. Should it bail late enough, or even pass, make sure to
 | |
|     // assert that the following line fails.
 | |
|     let _ = assert_impls_default::<NonExhaustiveDefaultGeneric<NotDefault>>;
 | |
| };
 | 
