//@ compile-flags: -Cdebuginfo=2 -Copt-level=0 -Zmir-enable-passes=+Inline // MSVC is different because of the individual allocas. //@ ignore-msvc //@ proc-macro: macro_def.rs // Find the variable. // CHECK-DAG: ![[#var_dbg:]] = !DILocalVariable(name: "n",{{( arg: 1,)?}} scope: ![[#var_scope:]] // Find both dbg_declares. These will proceed the variable metadata, of course, so we're looking // backwards. // CHECK-DAG: dbg_declare(ptr %n.dbg.spill{{[0-9]}}, ![[#var_dbg]], !DIExpression(), ![[#var_loc2:]]) // CHECK-DAG: dbg_declare(ptr %n.dbg.spill, ![[#var_dbg]], !DIExpression(), ![[#var_loc1:]]) // Find the first location definition, looking forwards again. // CHECK: ![[#var_loc1]] = !DILocation // CHECK-SAME: scope: ![[#var_scope:]], inlinedAt: ![[#var_inlinedAt1:]] // Find the first location's inlinedAt // NB: If we fail here it's *probably* because we failed to produce two // different locations and ended up reusing an earlier one. // CHECK: ![[#var_inlinedAt1]] = !DILocation // CHECK-SAME: scope: ![[var_inlinedAt1_scope:]] // Find the second location definition, still looking forwards. // NB: If we failed to produce two different locations, the test will // definitely fail by this point (if it hasn't already) because we won't // be able to find the same line again. // CHECK: ![[#var_loc2]] = !DILocation // CHECK-SAME: scope: ![[#var_scope]], inlinedAt: ![[#var_inlinedAt2:]] // Find the second location's inlinedAt. // CHECK: ![[#var_inlinedAt2]] = !DILocation // CHECK-SAME: scope: ![[#var_inlinedAt2_scope:]] // Finally, check that a discriminator was emitted for the second scope. // FIXMEkhuey ideally we would check that *either* scope has a discriminator // but I don't know that it's possible to check that with FileCheck. // CHECK: ![[#var_inlinedAt2_scope]] = !DILexicalBlockFile // CHECK-SAME: discriminator: [[#]] extern crate macro_def; use std::env; fn square(n: i32) -> i32 { n * n } fn main() { let (z1, z2) = macro_def::square_twice!(); println!("{z1} == {z2}"); }