From c6e6e032ef33b89ec0d6e2357af63cda719a0bb1 Mon Sep 17 00:00:00 2001 From: Gino Valente Date: Sun, 14 May 2023 17:51:51 -0700 Subject: [PATCH] Added bevy_macros_compile_fail_tests crate Created with compile tests for the Deref/DerefMut derives --- Cargo.toml | 1 + .../bevy_macros_compile_fail_tests/Cargo.toml | 13 +++++++ .../bevy_macros_compile_fail_tests/README.md | 6 +++ .../bevy_macros_compile_fail_tests/src/lib.rs | 1 + .../tests/deref_derive.rs | 6 +++ .../tests/deref_derive/invalid_item.fail.rs | 9 +++++ .../deref_derive/invalid_item.fail.stderr | 15 +++++++ .../deref_derive/missing_attribute.fail.rs | 12 ++++++ .../missing_attribute.fail.stderr | 15 +++++++ .../deref_derive/multiple_attributes.fail.rs | 14 +++++++ .../multiple_attributes.fail.stderr | 11 ++++++ .../deref_derive/multiple_fields.pass.rs | 22 +++++++++++ .../tests/deref_mut_derive.rs | 6 +++ .../deref_mut_derive/invalid_item.fail.rs | 9 +++++ .../deref_mut_derive/invalid_item.fail.stderr | 15 +++++++ .../mismatched_target_type.fail.rs | 30 ++++++++++++++ .../mismatched_target_type.fail.stderr | 25 ++++++++++++ .../missing_attribute.fail.rs | 29 ++++++++++++++ .../missing_attribute.fail.stderr | 15 +++++++ .../deref_mut_derive/missing_deref.fail.rs | 13 +++++++ .../missing_deref.fail.stderr | 39 +++++++++++++++++++ .../multiple_attributes.fail.rs | 31 +++++++++++++++ .../multiple_attributes.fail.stderr | 11 ++++++ .../deref_mut_derive/multiple_fields.pass.rs | 39 +++++++++++++++++++ tools/ci/src/main.rs | 9 +++++ 25 files changed, 396 insertions(+) create mode 100644 crates/bevy_macros_compile_fail_tests/Cargo.toml create mode 100644 crates/bevy_macros_compile_fail_tests/README.md create mode 100644 crates/bevy_macros_compile_fail_tests/src/lib.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.rs create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.stderr create mode 100644 crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_fields.pass.rs diff --git a/Cargo.toml b/Cargo.toml index f7b0eb6f3986d..172ddf5091064 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ rust-version = "1.67.0" exclude = [ "benches", "crates/bevy_ecs_compile_fail_tests", + "crates/bevy_macros_compile_fail_tests", "crates/bevy_reflect_compile_fail_tests", ] members = [ diff --git a/crates/bevy_macros_compile_fail_tests/Cargo.toml b/crates/bevy_macros_compile_fail_tests/Cargo.toml new file mode 100644 index 0000000000000..e5d0d19bec361 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "bevy_macros_compile_fail_tests" +version = "0.1.0" +edition = "2021" +description = "Compile fail tests for Bevy Engine's various macros" +homepage = "https://bevyengine.org" +repository = "https://github.com/bevyengine/bevy" +license = "MIT OR Apache-2.0" +publish = false + +[dependencies] +bevy_derive = { path = "../bevy_derive" } +trybuild = "1.0.71" \ No newline at end of file diff --git a/crates/bevy_macros_compile_fail_tests/README.md b/crates/bevy_macros_compile_fail_tests/README.md new file mode 100644 index 0000000000000..b1ec35cef3789 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/README.md @@ -0,0 +1,6 @@ +# Compile fail tests for Bevy macros + +This crate is not part of the Bevy workspace in order to not fail `crater` tests for Bevy. +The tests assert on the exact compiler errors and can easily fail for new Rust versions due to updated compiler errors (e.g. changes in spans). + +The `CI` workflow executes these tests on the stable rust toolchain (see [tools/ci](../../tools/ci/src/main.rs)). diff --git a/crates/bevy_macros_compile_fail_tests/src/lib.rs b/crates/bevy_macros_compile_fail_tests/src/lib.rs new file mode 100644 index 0000000000000..d0d1683dd6b97 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/src/lib.rs @@ -0,0 +1 @@ +// Nothing here, check out the integration tests diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive.rs new file mode 100644 index 0000000000000..520f13757fa73 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive.rs @@ -0,0 +1,6 @@ +#[test] +fn test() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/deref_derive/*.fail.rs"); + t.pass("tests/deref_derive/*.pass.rs"); +} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.rs new file mode 100644 index 0000000000000..20ffe0dea7210 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.rs @@ -0,0 +1,9 @@ +use bevy_derive::Deref; + +#[derive(Deref)] +struct UnitStruct; + +#[derive(Deref)] +enum Enum {} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.stderr new file mode 100644 index 0000000000000..73fce8cb04fcc --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/invalid_item.fail.stderr @@ -0,0 +1,15 @@ +error: Deref cannot be derived on field-less structs + --> tests/deref_derive/invalid_item.fail.rs:3:10 + | +3 | #[derive(Deref)] + | ^^^^^ + | + = note: this error originates in the derive macro `Deref` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: Deref can only be derived on structs + --> tests/deref_derive/invalid_item.fail.rs:6:10 + | +6 | #[derive(Deref)] + | ^^^^^ + | + = note: this error originates in the derive macro `Deref` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.rs new file mode 100644 index 0000000000000..cb1e5a73417c5 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.rs @@ -0,0 +1,12 @@ +use bevy_derive::Deref; + +#[derive(Deref)] +struct TupleStruct(usize, String); + +#[derive(Deref)] +struct Struct { + foo: usize, + bar: String, +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.stderr new file mode 100644 index 0000000000000..537e8251d1cd1 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/missing_attribute.fail.stderr @@ -0,0 +1,15 @@ +error: deriving Deref on multi-field structs requires one field to have the `#[deref]` attribute + --> tests/deref_derive/missing_attribute.fail.rs:3:10 + | +3 | #[derive(Deref)] + | ^^^^^ + | + = note: this error originates in the derive macro `Deref` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: deriving Deref on multi-field structs requires one field to have the `#[deref]` attribute + --> tests/deref_derive/missing_attribute.fail.rs:6:10 + | +6 | #[derive(Deref)] + | ^^^^^ + | + = note: this error originates in the derive macro `Deref` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.rs new file mode 100644 index 0000000000000..f81b552410a8c --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.rs @@ -0,0 +1,14 @@ +use bevy_derive::Deref; + +#[derive(Deref)] +struct TupleStruct(#[deref] usize, #[deref] String); + +#[derive(Deref)] +struct Struct { + #[deref] + foo: usize, + #[deref] + bar: String, +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.stderr new file mode 100644 index 0000000000000..a1834cc17825e --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_attributes.fail.stderr @@ -0,0 +1,11 @@ +error: `#[deref]` attribute can only be used on a single field + --> tests/deref_derive/multiple_attributes.fail.rs:4:36 + | +4 | struct TupleStruct(#[deref] usize, #[deref] String); + | ^^^^^^^^ + +error: `#[deref]` attribute can only be used on a single field + --> tests/deref_derive/multiple_attributes.fail.rs:10:5 + | +10 | #[deref] + | ^^^^^^^^ diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs new file mode 100644 index 0000000000000..2244e89b78385 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs @@ -0,0 +1,22 @@ +use bevy_derive::Deref; + +#[derive(Deref)] +struct TupleStruct(usize, #[deref] String); + +#[derive(Deref)] +struct Struct { + foo: usize, + #[deref] + bar: String, +} + +fn main() { + let value = TupleStruct(123, "Hello world!".to_string()); + let _: &String = &*value; + + let value = Struct { + foo: 123, + bar: "Hello world!".to_string(), + }; + let _: &String = &*value; +} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive.rs new file mode 100644 index 0000000000000..71a52be670eef --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive.rs @@ -0,0 +1,6 @@ +#[test] +fn test() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/deref_mut_derive/*.fail.rs"); + t.pass("tests/deref_mut_derive/*.pass.rs"); +} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.rs new file mode 100644 index 0000000000000..f1b5da4d9257b --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.rs @@ -0,0 +1,9 @@ +use bevy_derive::DerefMut; + +#[derive(DerefMut)] +struct UnitStruct; + +#[derive(DerefMut)] +enum Enum {} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.stderr new file mode 100644 index 0000000000000..b089fc3d940fb --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/invalid_item.fail.stderr @@ -0,0 +1,15 @@ +error: DerefMut cannot be derived on field-less structs + --> tests/deref_mut_derive/invalid_item.fail.rs:3:10 + | +3 | #[derive(DerefMut)] + | ^^^^^^^^ + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: DerefMut can only be derived on structs + --> tests/deref_mut_derive/invalid_item.fail.rs:6:10 + | +6 | #[derive(DerefMut)] + | ^^^^^^^^ + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.rs new file mode 100644 index 0000000000000..fff8232bdfcf6 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.rs @@ -0,0 +1,30 @@ +use bevy_derive::DerefMut; +use std::ops::Deref; + +#[derive(DerefMut)] +struct TupleStruct(#[deref] usize, String); + +impl Deref for TupleStruct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.1 + } +} + +#[derive(DerefMut)] +struct Struct { + #[deref] + foo: usize, + bar: String, +} + +impl Deref for Struct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.bar + } +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.stderr new file mode 100644 index 0000000000000..c3c007a984be2 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/mismatched_target_type.fail.stderr @@ -0,0 +1,25 @@ +error[E0308]: mismatched types + --> tests/deref_mut_derive/mismatched_target_type.fail.rs:4:10 + | +4 | #[derive(DerefMut)] + | ^^^^^^^^ + | | + | expected `&mut String`, found `&mut usize` + | expected `&mut String` because of return type + | + = note: expected mutable reference `&mut String` + found mutable reference `&mut usize` + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0308]: mismatched types + --> tests/deref_mut_derive/mismatched_target_type.fail.rs:15:10 + | +15 | #[derive(DerefMut)] + | ^^^^^^^^ + | | + | expected `&mut String`, found `&mut usize` + | expected `&mut String` because of return type + | + = note: expected mutable reference `&mut String` + found mutable reference `&mut usize` + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.rs new file mode 100644 index 0000000000000..3a8e09dfe5ec2 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.rs @@ -0,0 +1,29 @@ +use bevy_derive::DerefMut; +use std::ops::Deref; + +#[derive(DerefMut)] +struct TupleStruct(usize, String); + +impl Deref for TupleStruct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.1 + } +} + +#[derive(DerefMut)] +struct Struct { + foo: usize, + bar: String, +} + +impl Deref for Struct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.bar + } +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.stderr new file mode 100644 index 0000000000000..ce3d17133affe --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_attribute.fail.stderr @@ -0,0 +1,15 @@ +error: deriving DerefMut on multi-field structs requires one field to have the `#[deref]` attribute + --> tests/deref_mut_derive/missing_attribute.fail.rs:4:10 + | +4 | #[derive(DerefMut)] + | ^^^^^^^^ + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: deriving DerefMut on multi-field structs requires one field to have the `#[deref]` attribute + --> tests/deref_mut_derive/missing_attribute.fail.rs:15:10 + | +15 | #[derive(DerefMut)] + | ^^^^^^^^ + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.rs new file mode 100644 index 0000000000000..1b2da5adfac87 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.rs @@ -0,0 +1,13 @@ +use bevy_derive::DerefMut; + +#[derive(DerefMut)] +struct TupleStruct(usize, #[deref] String); + +#[derive(DerefMut)] +struct Struct { + foo: usize, + #[deref] + bar: String, +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.stderr new file mode 100644 index 0000000000000..d4cfc71d7a920 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/missing_deref.fail.stderr @@ -0,0 +1,39 @@ +error[E0277]: the trait bound `TupleStruct: Deref` is not satisfied + --> tests/deref_mut_derive/missing_deref.fail.rs:4:8 + | +4 | struct TupleStruct(usize, #[deref] String); + | ^^^^^^^^^^^ the trait `Deref` is not implemented for `TupleStruct` + | +note: required by a bound in `DerefMut` + --> $RUST/core/src/ops/deref.rs + | + | pub trait DerefMut: Deref { + | ^^^^^ required by this bound in `DerefMut` + +error[E0277]: the trait bound `Struct: Deref` is not satisfied + --> tests/deref_mut_derive/missing_deref.fail.rs:7:8 + | +7 | struct Struct { + | ^^^^^^ the trait `Deref` is not implemented for `Struct` + | +note: required by a bound in `DerefMut` + --> $RUST/core/src/ops/deref.rs + | + | pub trait DerefMut: Deref { + | ^^^^^ required by this bound in `DerefMut` + +error[E0277]: the trait bound `TupleStruct: Deref` is not satisfied + --> tests/deref_mut_derive/missing_deref.fail.rs:3:10 + | +3 | #[derive(DerefMut)] + | ^^^^^^^^ the trait `Deref` is not implemented for `TupleStruct` + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0277]: the trait bound `Struct: Deref` is not satisfied + --> tests/deref_mut_derive/missing_deref.fail.rs:6:10 + | +6 | #[derive(DerefMut)] + | ^^^^^^^^ the trait `Deref` is not implemented for `Struct` + | + = note: this error originates in the derive macro `DerefMut` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.rs new file mode 100644 index 0000000000000..afe1e0a876b64 --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.rs @@ -0,0 +1,31 @@ +use bevy_derive::DerefMut; +use std::ops::Deref; + +#[derive(DerefMut)] +struct TupleStruct(#[deref] usize, #[deref] String); + +impl Deref for TupleStruct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.1 + } +} + +#[derive(DerefMut)] +struct Struct { + #[deref] + foo: usize, + #[deref] + bar: String, +} + +impl Deref for Struct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.bar + } +} + +fn main() {} diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.stderr b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.stderr new file mode 100644 index 0000000000000..3d4cabca91b1f --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_attributes.fail.stderr @@ -0,0 +1,11 @@ +error: `#[deref]` attribute can only be used on a single field + --> tests/deref_mut_derive/multiple_attributes.fail.rs:5:36 + | +5 | struct TupleStruct(#[deref] usize, #[deref] String); + | ^^^^^^^^ + +error: `#[deref]` attribute can only be used on a single field + --> tests/deref_mut_derive/multiple_attributes.fail.rs:19:5 + | +19 | #[deref] + | ^^^^^^^^ diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_fields.pass.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_fields.pass.rs new file mode 100644 index 0000000000000..c05dc808c120d --- /dev/null +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_mut_derive/multiple_fields.pass.rs @@ -0,0 +1,39 @@ +use bevy_derive::DerefMut; +use std::ops::Deref; + +#[derive(DerefMut)] +struct TupleStruct(usize, #[deref] String); + +impl Deref for TupleStruct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.1 + } +} + +#[derive(DerefMut)] +struct Struct { + foo: usize, + #[deref] + bar: String, +} + +impl Deref for Struct { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.bar + } +} + +fn main() { + let mut value = TupleStruct(123, "Hello world!".to_string()); + let _: &mut String = &mut *value; + + let mut value = Struct { + foo: 123, + bar: "Hello world!".to_string(), + }; + let _: &mut String = &mut *value; +} diff --git a/tools/ci/src/main.rs b/tools/ci/src/main.rs index e8c1608ba8c17..c0105ed54312e 100644 --- a/tools/ci/src/main.rs +++ b/tools/ci/src/main.rs @@ -106,6 +106,15 @@ fn main() { .run() .expect("Compiler errors of the Reflect compile fail tests seem to be different than expected! Check locally and compare rust versions."); } + { + // Macro Compile Fail Tests + // Run tests (they do not get executed with the workspace tests) + // - See crates/bevy_macros_compile_fail_tests/README.md + let _subdir = sh.push_dir("crates/bevy_macros_compile_fail_tests"); + cmd!(sh, "cargo test --target-dir ../../target") + .run() + .expect("Compiler errors of the macros compile fail tests seem to be different than expected! Check locally and compare rust versions."); + } } if what_to_run.contains(Check::TEST) {