Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/tests/simple.rs')
-rw-r--r--crates/hir-ty/src/tests/simple.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs
index e6ef56b80d..5f0f341f39 100644
--- a/crates/hir-ty/src/tests/simple.rs
+++ b/crates/hir-ty/src/tests/simple.rs
@@ -3720,3 +3720,85 @@ fn test() -> bool {
"#]],
);
}
+
+#[test]
+fn macro_semitransparent_hygiene() {
+ check_types(
+ r#"
+macro_rules! m {
+ () => { let bar: i32; };
+}
+fn foo() {
+ let bar: bool;
+ m!();
+ bar;
+ // ^^^ bool
+}
+ "#,
+ );
+}
+
+#[test]
+fn macro_expansion_can_refer_variables_defined_before_macro_definition() {
+ check_types(
+ r#"
+fn foo() {
+ let v: i32 = 0;
+ macro_rules! m {
+ () => { v };
+ }
+ let v: bool = true;
+ m!();
+ // ^^^^ i32
+}
+ "#,
+ );
+}
+
+#[test]
+fn macro_rules_shadowing_works_with_hygiene() {
+ check_types(
+ r#"
+fn foo() {
+ let v: bool;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ bool
+
+ let v: char;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ char
+
+ {
+ let v: u8;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ u8
+
+ let v: i8;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ i8
+
+ let v: i16;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ i16
+
+ {
+ let v: u32;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ u32
+
+ let v: u64;
+ macro_rules! m { () => { v } }
+ m!();
+ // ^^^^ u64
+ }
+ }
+}
+ "#,
+ );
+}