Skip to content

Commit b26a472

Browse files
committed
Fix type mismatch caused by macros
MacroStmts should be completely transparent, but it prevented coercion. (I should maybe give `infer_expr` and `infer_expr_inner` better names.)
1 parent 8b049ec commit b26a472

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

crates/hir_ty/src/infer/expr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ impl<'a> InferenceContext<'a> {
805805
None => self.table.new_float_var(),
806806
},
807807
},
808-
Expr::MacroStmts { tail } => self.infer_expr(*tail, expected),
808+
Expr::MacroStmts { tail } => self.infer_expr_inner(*tail, expected),
809809
};
810810
// use a new type variable if we got unknown here
811811
let ty = self.insert_type_vars_shallow(ty);

crates/hir_ty/src/tests/coercion.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,3 +912,47 @@ fn test() -> i32 {
912912
"#,
913913
)
914914
}
915+
916+
#[test]
917+
fn panic_macro() {
918+
check_infer_with_mismatches(
919+
r#"
920+
mod panic {
921+
#[macro_export]
922+
pub macro panic_2015 {
923+
() => (
924+
$crate::panicking::panic("explicit panic")
925+
),
926+
}
927+
}
928+
929+
mod panicking {
930+
pub fn panic() -> ! { loop {} }
931+
}
932+
933+
#[rustc_builtin_macro = "core_panic"]
934+
macro_rules! panic {
935+
// Expands to either `$crate::panic::panic_2015` or `$crate::panic::panic_2021`
936+
// depending on the edition of the caller.
937+
($($arg:tt)*) => {
938+
/* compiler built-in */
939+
};
940+
}
941+
942+
fn main() {
943+
panic!("internal error: entered unreachable code")
944+
}
945+
"#,
946+
expect![[r#"
947+
190..201 '{ loop {} }': !
948+
192..199 'loop {}': !
949+
197..199 '{}': ()
950+
!0..24 '$crate...:panic': fn panic() -> !
951+
!0..42 '$crate...anic")': !
952+
!0..42 '$crate...anic")': !
953+
!0..70 '$crate...code")': !
954+
!25..41 '"expli...panic"': &str
955+
470..528 '{ ...de") }': ()
956+
"#]],
957+
);
958+
}

0 commit comments

Comments
 (0)