| // RUN: fir-opt --add-debug-info --mlir-print-debuginfo %s | FileCheck %s | |
| // The line of a DIModuleAttr comes from the location of the module's | |
| // `fir.module_debug_imports`, which is that of the MODULE statement. A module | |
| // without one is not defined in this compilation unit, so it is described as a | |
| // declaration and carries no line at all. | |
| module { | |
| // A module whose MODULE statement is on line 4, well before its first | |
| // member on line 20. The region is empty because the module has no USE. | |
| fir.module_debug_imports "no_use" { | |
| } loc(#loc_no_use) | |
| fir.global @_QMno_useEx : i32 { | |
| %0 = fir.zero_bits i32 | |
| fir.has_value %0 : i32 | |
| } loc(#loc_x) | |
| // A module with no members of its own, only used by `with_use` below. | |
| fir.module_debug_imports "other_mod" { | |
| } loc(#loc_other) | |
| // Same as `no_use`, but with a USE statement in the region. | |
| fir.module_debug_imports "with_use" { | |
| fir.use_stmt "other_mod" | |
| } loc(#loc_with_use) | |
| fir.global @_QMwith_useEy : i32 { | |
| %0 = fir.zero_bits i32 | |
| fir.has_value %0 : i32 | |
| } loc(#loc_y) | |
| // No `fir.module_debug_imports`, so this module is only used here. | |
| fir.global @_QMlegacyEz : i32 { | |
| %0 = fir.zero_bits i32 | |
| fir.has_value %0 : i32 | |
| } loc(#loc_z) | |
| } | |
| #loc_no_use = loc("mod.f90":4:1) | |
| #loc_x = loc("mod.f90":20:14) | |
| #loc_other = loc("mod.f90":6:1) | |
| #loc_with_use = loc("mod.f90":8:1) | |
| #loc_y = loc("mod.f90":24:14) | |
| #loc_z = loc("mod.f90":30:14) | |
| // The MODULE statement line is used, not 19 as guessed from the member. | |
| // CHECK-DAG: #llvm.di_module<{{.*}}name = "no_use", line = 4> | |
| // CHECK-DAG: #llvm.di_module<{{.*}}name = "with_use", line = 8> | |
| // CHECK-DAG: #llvm.di_module<name = "legacy", isDecl = true> |