2018-10-04 08:31:35 -05:00
|
|
|
// normalize-stderr-test: "existed:.*\(" -> "existed: $$FILE_NOT_FOUND_MSG ("
|
2018-08-10 05:27:46 -05:00
|
|
|
|
2014-01-17 08:53:10 -06:00
|
|
|
// test that errors in a (selection) of macros don't kill compilation
|
|
|
|
// immediately, so that we get more errors listed at a time.
|
|
|
|
|
2014-04-03 18:24:21 -05:00
|
|
|
#![feature(trace_macros, concat_idents)]
|
2022-04-05 20:21:10 -05:00
|
|
|
#![feature(stmt_expr_attributes)]
|
2014-01-17 08:53:10 -06:00
|
|
|
|
2021-12-10 18:11:26 -06:00
|
|
|
use std::arch::asm;
|
|
|
|
|
2021-07-17 00:05:57 -05:00
|
|
|
#[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,
|
|
|
|
}
|
|
|
|
|
2021-06-29 19:22:52 -05:00
|
|
|
#[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]
|
2021-07-17 00:05:57 -05:00
|
|
|
Foo {}, //~ ERROR the `#[default]` attribute may only be used on unit enum variants
|
2021-06-29 19:22:52 -05:00
|
|
|
Bar,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
enum NonExhaustiveDefault {
|
|
|
|
#[default]
|
|
|
|
#[non_exhaustive]
|
|
|
|
Foo, //~ ERROR default variant must be exhaustive
|
|
|
|
Bar,
|
|
|
|
}
|
2014-01-17 08:53:10 -06:00
|
|
|
|
|
|
|
fn main() {
|
2020-02-20 03:19:48 -06:00
|
|
|
asm!(invalid); //~ ERROR
|
2020-02-14 10:54:40 -06:00
|
|
|
llvm_asm!(invalid); //~ ERROR
|
2014-01-17 08:53:10 -06:00
|
|
|
|
|
|
|
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
|
2014-12-21 15:57:09 -06:00
|
|
|
include_bytes!(invalid); //~ ERROR
|
|
|
|
include_bytes!("i'd be quite surprised if a file with this name existed"); //~ ERROR
|
2014-01-17 08:53:10 -06:00
|
|
|
|
|
|
|
trace_macros!(invalid); //~ ERROR
|
|
|
|
}
|
2022-09-15 11:56:12 -05:00
|
|
|
|
|
|
|
/// 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>>;
|
|
|
|
};
|