summaryrefslogtreecommitdiffstats
path: root/tests/ui/macros/macros-nonfatal-errors.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
commit218caa410aa38c29984be31a5229b9fa717560ee (patch)
treec54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/ui/macros/macros-nonfatal-errors.rs
parentReleasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz
rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/macros/macros-nonfatal-errors.rs')
-rw-r--r--tests/ui/macros/macros-nonfatal-errors.rs139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/ui/macros/macros-nonfatal-errors.rs b/tests/ui/macros/macros-nonfatal-errors.rs
new file mode 100644
index 000000000..ab14c3589
--- /dev/null
+++ b/tests/ui/macros/macros-nonfatal-errors.rs
@@ -0,0 +1,139 @@
+// 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>>;
+};