about summary refs log tree commit diff
path: root/tests/ui/macros/macro-self-mutability-7911.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/macros/macro-self-mutability-7911.rs')
-rw-r--r--tests/ui/macros/macro-self-mutability-7911.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/macros/macro-self-mutability-7911.rs b/tests/ui/macros/macro-self-mutability-7911.rs
new file mode 100644
index 00000000000..5313f86d97f
--- /dev/null
+++ b/tests/ui/macros/macro-self-mutability-7911.rs
@@ -0,0 +1,38 @@
+// https://github.com/rust-lang/rust/issues/7911
+//@ run-pass
+// (Closes #7911) Test that we can use the same self expression
+// with different mutability in macro in two methods
+
+#![allow(unused_variables)] // unused foobar_immut + foobar_mut
+trait FooBar {
+    fn dummy(&self) { } //~ WARN method `dummy` is never used
+}
+struct Bar(#[allow(dead_code)] i32);
+struct Foo { bar: Bar }
+
+impl FooBar for Bar {}
+
+trait Test {
+    fn get_immut(&self) -> &dyn FooBar;
+    fn get_mut(&mut self) -> &mut dyn FooBar;
+}
+
+macro_rules! generate_test { ($type_:path, $slf:ident, $field:expr) => (
+    impl Test for $type_ {
+        fn get_immut(&$slf) -> &dyn FooBar {
+            &$field as &dyn FooBar
+        }
+
+        fn get_mut(&mut $slf) -> &mut dyn FooBar {
+            &mut $field as &mut dyn FooBar
+        }
+    }
+)}
+
+generate_test!(Foo, self, self.bar);
+
+pub fn main() {
+    let mut foo: Foo = Foo { bar: Bar(42) };
+    { let foobar_immut = foo.get_immut(); }
+    { let foobar_mut = foo.get_mut(); }
+}