diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs
index 5d12c158460..af5b22d1c63 100644
--- a/crates/ra_hir_expand/src/db.rs
+++ b/crates/ra_hir_expand/src/db.rs
@@ -190,7 +190,6 @@ fn to_fragment_kind(db: &dyn AstDatabase, macro_call_id: MacroCallId) -> Fragmen
         TUPLE_EXPR => FragmentKind::Expr,
         PAREN_EXPR => FragmentKind::Expr,
 
-        // FIXME: Add tests for following cases in hir_ty
         FOR_EXPR => FragmentKind::Expr,
         PATH_EXPR => FragmentKind::Expr,
         LAMBDA_EXPR => FragmentKind::Expr,
diff --git a/crates/ra_hir_ty/src/tests/macros.rs b/crates/ra_hir_ty/src/tests/macros.rs
index 69c695cc8f1..9d09d93a7c6 100644
--- a/crates/ra_hir_ty/src/tests/macros.rs
+++ b/crates/ra_hir_ty/src/tests/macros.rs
@@ -135,6 +135,87 @@ fn main() {
     );
 }
 
+#[test]
+fn expr_macro_expanded_in_various_places() {
+    assert_snapshot!(
+        infer(r#"
+macro_rules! spam {
+    () => (1isize);
+}
+
+fn spam() {
+    spam!();
+    (spam!());
+    spam!().spam(spam!());
+    for _ in spam!() {}
+    || spam!();
+    while spam!() {}
+    break spam!();
+    return spam!();
+    match spam!() {
+        _ if spam!() => spam!(),
+    }
+    spam!()(spam!());
+    Spam { spam: spam!() };
+    spam!()[spam!()];
+    await spam!();
+    spam!() as usize;
+    &spam!();
+    -spam!();
+    spam!()..spam!();
+    spam!() + spam!();
+}
+"#),
+        @r###"
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    ![0; 6) '1isize': isize
+    [54; 457) '{     ...!(); }': !
+    [88; 109) 'spam!(...am!())': {unknown}
+    [115; 134) 'for _ ...!() {}': ()
+    [119; 120) '_': {unknown}
+    [132; 134) '{}': ()
+    [139; 149) '|| spam!()': || -> isize
+    [155; 171) 'while ...!() {}': ()
+    [169; 171) '{}': ()
+    [176; 189) 'break spam!()': !
+    [195; 209) 'return spam!()': !
+    [215; 269) 'match ...     }': isize
+    [239; 240) '_': isize
+    [274; 290) 'spam!(...am!())': {unknown}
+    [296; 318) 'Spam {...m!() }': {unknown}
+    [324; 340) 'spam!(...am!()]': {unknown}
+    [365; 381) 'spam!(... usize': usize
+    [387; 395) '&spam!()': &isize
+    [401; 409) '-spam!()': isize
+    [415; 431) 'spam!(...pam!()': {unknown}
+    [437; 454) 'spam!(...pam!()': isize
+    "###
+    );
+}
+
 #[test]
 fn infer_type_value_macro_having_same_name() {
     assert_snapshot!(