about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeremyLetang <letang.jeremy@gmail.com>2014-01-28 19:54:19 -0500
committerAlex Crichton <alex@alexcrichton.com>2014-01-31 21:43:08 -0800
commit4f24caae110b712e02f058d9ff88ef35f568ef2d (patch)
tree295b9fc282b2f7ba337bed11876df0b33caec2f9
parentb9a026afba1513ab7847dcb19446463895b6cd3e (diff)
downloadrust-4f24caae110b712e02f058d9ff88ef35f568ef2d.tar.gz
rust-4f24caae110b712e02f058d9ff88ef35f568ef2d.zip
Add test case for issue 7911
-rw-r--r--src/test/run-pass/issue-7911.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-7911.rs b/src/test/run-pass/issue-7911.rs
new file mode 100644
index 00000000000..a21e6e04abc
--- /dev/null
+++ b/src/test/run-pass/issue-7911.rs
@@ -0,0 +1,48 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// xfail-pretty
+
+// (Closes #7911) Test that we can use the same self expression 
+// with different mutability in macro in two methods
+
+#[allow(unused_variable)]; // unused foobar_immut + foobar_mut
+#[feature(macro_rules)];
+
+trait FooBar {}
+struct Bar(i32);
+struct Foo { bar: Bar }
+
+impl FooBar for Bar {}
+
+trait Test {
+    fn get_immut<'r>(&'r self) -> &'r FooBar;
+    fn get_mut<'r>(&'r mut self) -> &'r mut FooBar;
+}
+
+macro_rules! generate_test(($type_:path, $field:expr) => (
+    impl Test for $type_ {
+        fn get_immut<'r>(&'r self) -> &'r FooBar {
+            &$field as &FooBar
+        }
+
+        fn get_mut<'r>(&'r mut self) -> &'r mut FooBar {
+            &mut $field as &mut FooBar
+        }
+    }
+))
+
+generate_test!(Foo, 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(); }
+}