1; RUN: llc -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu < %s \ 2; RUN: | llvm-dwarfdump -debug-info -debug-types - | FileCheck %s 3 4; This test was originally for testing references to non-TU types from TUs, but 5; it's currently too complicated to get that right reliably - non-TU types may 6; have local linkage so declaring them in a TU is unreliable (consumers would 7; have to be context-dependent to know which CU the TU is referenced from to 8; know which type definition to match the declaration in the TU up to) 9 10; Might as well keep the complex cases here in case we revisit this (with a flag 11; on the type to indicate whether it should be in a type unit or not, distinct 12; from the mangled name indicating whether the type has linkage or not perhaps 13; (rather than checing the namespace scopes to see if any are internal (which 14; doesn't handle the linkage of, say, a template instantiated with an internal 15; type)) 16 17; Built from the following source, compiled with this command: 18; $ clang++-tot decl.cpp -g -fdebug-types-section -c 19; And modified (as noted in the comments) to produce some "simplified" and "mangled" 20; simplified template names, to ensure they get template parameters in declarations 21; created in type units. 22 23; struct non_tu { 24; virtual void f1(); 25; }; 26; void non_tu::f1() {} 27; struct tu_ref_non_tu { 28; non_tu v1; 29; }; 30; tu_ref_non_tu v1; 31; 32; // Reference internal 33; namespace { 34; struct internal {}; 35; } // namespace 36; struct ref_internal { 37; internal i; 38; }; 39; ref_internal v5; 40; 41; 42; template <typename T> 43; struct templ_non_tu; 44; 45; // Reference to (normal, non-mangled/simplified) non-tu type with template 46; // parameters. 47; template <> 48; struct templ_non_tu<int> { 49; virtual void f1(); 50; }; 51; void templ_non_tu<int>::f1() {} 52; struct ref_templ_non_tu { 53; templ_non_tu<int> v1; 54; }; 55; ref_templ_non_tu v2; 56; 57; // Modify templ_non_tu<long>'s name to be simplified (strip template parameter 58; // list from the "name" attribute) 59; template <> 60; struct templ_non_tu<long> { 61; virtual void f1(); 62; }; 63; void templ_non_tu<long>::f1() {} 64; struct ref_templ_non_tu_simple { 65; templ_non_tu<long> v1; 66; }; 67; ref_templ_non_tu_simple v3; 68; 69; // Modify templ_non_tu<bool>'s name to be mangled ('_STN|' name '|' args) 70; template <> 71; struct templ_non_tu<bool> { 72; virtual void f1(); 73; }; 74; void templ_non_tu<bool>::f1() {} 75; struct ref_templ_non_tu_mangled { 76; templ_non_tu<bool> v1; 77; }; 78; ref_templ_non_tu_mangled v4; 79 80 81 82 83; CHECK-LABEL: Type Unit: 84; CHECK: DW_TAG_class_type 85; CHECK-NOT: DW_TAG 86; CHECK: DW_AT_name {{.*}}"ref_from_ref_internal_template" 87 88 89; CHECK-LABEL: Compile Unit: 90 91; CHECK: DW_TAG_structure_type 92; CHECK-NOT: DW_TAG 93; CHECK: DW_AT_name {{.*}}"tu_ref_non_tu" 94 95; CHECK: DW_TAG_structure_type 96; CHECK-NOT: DW_TAG 97; CHECK: DW_AT_name {{.*}}"non_tu" 98 99; CHECK: DW_TAG_structure_type 100; CHECK-NOT: DW_TAG 101; CHECK: DW_AT_name {{.*}}"ref_internal" 102; CHECK-NOT: DW_TAG 103; CHECK: DW_AT_byte_size 104 105; CHECK: DW_TAG_namespace 106; CHECK-NOT: {{DW_TAG|DW_AT}} 107; CHECK: DW_TAG_structure_type 108; CHECK-NOT: DW_TAG 109; CHECK: DW_AT_name {{.*}}"internal" 110 111; CHECK: DW_TAG_structure_type 112; CHECK-NOT: DW_TAG 113; CHECK: DW_AT_name {{.*}}"internal_template<ref_from_ref_internal_template>" 114 115; CHECK: DW_TAG_structure_type 116; CHECK-NOT: DW_TAG 117; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu" 118; CHECK: DW_TAG_structure_type 119; CHECK-NOT: DW_TAG 120; CHECK: DW_AT_name {{.*}}"_STN|templ_non_tu|<int>" 121 122; CHECK: DW_TAG_structure_type 123; CHECK-NOT: DW_TAG 124; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu_simple" 125; CHECK: DW_TAG_structure_type 126; CHECK-NOT: DW_TAG 127; CHECK: DW_AT_name ("templ_non_tu") 128; CHECK-NOT: DW_TAG 129; CHECK: DW_TAG_template_type_parameter 130; CHECK-NEXT: DW_AT_type {{.*}}"long" 131 132; CHECK: DW_TAG_structure_type 133; CHECK-NOT: DW_TAG 134; CHECK: DW_AT_name {{.*}}"ref_templ_non_tu_mangled" 135; CHECK: DW_TAG_structure_type 136; CHECK-NOT: DW_TAG 137; CHECK: DW_AT_name ("_STN|templ_non_tu|<bool>") 138; CHECK-NOT: DW_TAG 139; CHECK: DW_TAG_template_type_parameter 140; CHECK-NEXT: DW_AT_type {{.*}}"bool" 141; CHECK: DW_TAG_class_type 142; CHECK-NOT: DW_TAG 143; CHECK: DW_AT_name {{.*}}"ref_internal_template" 144; CHECK: DW_TAG_class_type 145; CHECK-NEXT: DW_AT_declaration (true) 146; CHECK-NEXT: DW_AT_signature (0x30c4e2370930c7ad) 147 148%struct.ref_internal = type { %"struct.(anonymous namespace)::internal" } 149%"struct.(anonymous namespace)::internal" = type { i8 } 150%class.ref_internal_template = type { %"struct.(anonymous namespace)::internal_template" } 151%"struct.(anonymous namespace)::internal_template" = type { i8 } 152%class.ref_from_ref_internal_template = type { i8 } 153%struct.non_tu = type { ptr } 154%struct.templ_non_tu = type { ptr } 155%struct.templ_non_tu.0 = type { ptr } 156%struct.templ_non_tu.1 = type { ptr } 157 158@_ZTV6non_tu = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI6non_tu, ptr @_ZN6non_tu2f1Ev] }, align 8 159@v1 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV6non_tu, i32 0, i32 0, i32 2) } }, align 8, !dbg !0 160@v5 = dso_local global %struct.ref_internal zeroinitializer, align 1, !dbg !5 161@_ZTV12templ_non_tuIiE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIiE, ptr @_ZN12templ_non_tuIiE2f1Ev] }, align 8 162@v2 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIiE, i32 0, i32 0, i32 2) } }, align 8, !dbg !13 163@_ZTV12templ_non_tuIlE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIlE, ptr @_ZN12templ_non_tuIlE2f1Ev] }, align 8 164@v3 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIlE, i32 0, i32 0, i32 2) } }, align 8, !dbg !32 165@_ZTV12templ_non_tuIbE = dso_local unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI12templ_non_tuIbE, ptr @_ZN12templ_non_tuIbE2f1Ev] }, align 8 166@v4 = dso_local global { { ptr } } { { ptr } { ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV12templ_non_tuIbE, i32 0, i32 0, i32 2) } }, align 8, !dbg !46 167@v6 = dso_local global %class.ref_internal_template zeroinitializer, align 1, !dbg !60 168@v7 = dso_local global %class.ref_from_ref_internal_template zeroinitializer, align 1, !dbg !69 169@_ZTVN10__cxxabiv117__class_type_infoE = external dso_local global ptr 170@_ZTS6non_tu = dso_local constant [8 x i8] c"6non_tu\00", align 1 171@_ZTI6non_tu = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS6non_tu }, align 8 172@_ZTS12templ_non_tuIiE = dso_local constant [18 x i8] c"12templ_non_tuIiE\00", align 1 173@_ZTI12templ_non_tuIiE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIiE }, align 8 174@_ZTS12templ_non_tuIlE = dso_local constant [18 x i8] c"12templ_non_tuIlE\00", align 1 175@_ZTI12templ_non_tuIlE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIlE }, align 8 176@_ZTS12templ_non_tuIbE = dso_local constant [18 x i8] c"12templ_non_tuIbE\00", align 1 177@_ZTI12templ_non_tuIbE = dso_local constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS12templ_non_tuIbE }, align 8 178 179; Function Attrs: mustprogress noinline nounwind optnone uwtable 180define dso_local void @_ZN6non_tu2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !87 { 181entry: 182 %this.addr = alloca ptr, align 8 183 store ptr %this, ptr %this.addr, align 8 184 call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !88, metadata !DIExpression()), !dbg !90 185 %this1 = load ptr, ptr %this.addr, align 8 186 ret void, !dbg !91 187} 188 189; Function Attrs: nofree nosync nounwind readnone speculatable willreturn 190declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 191 192; Function Attrs: mustprogress noinline nounwind optnone uwtable 193define dso_local void @_ZN12templ_non_tuIiE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !92 { 194entry: 195 %this.addr = alloca ptr, align 8 196 store ptr %this, ptr %this.addr, align 8 197 call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !93, metadata !DIExpression()), !dbg !95 198 %this1 = load ptr, ptr %this.addr, align 8 199 ret void, !dbg !96 200} 201 202; Function Attrs: mustprogress noinline nounwind optnone uwtable 203define dso_local void @_ZN12templ_non_tuIlE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !97 { 204entry: 205 %this.addr = alloca ptr, align 8 206 store ptr %this, ptr %this.addr, align 8 207 call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !98, metadata !DIExpression()), !dbg !100 208 %this1 = load ptr, ptr %this.addr, align 8 209 ret void, !dbg !101 210} 211 212; Function Attrs: mustprogress noinline nounwind optnone uwtable 213define dso_local void @_ZN12templ_non_tuIbE2f1Ev(ptr noundef nonnull align 8 dereferenceable(8) %this) unnamed_addr #0 align 2 !dbg !102 { 214entry: 215 %this.addr = alloca ptr, align 8 216 store ptr %this, ptr %this.addr, align 8 217 call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !103, metadata !DIExpression()), !dbg !105 218 %this1 = load ptr, ptr %this.addr, align 8 219 ret void, !dbg !106 220} 221 222attributes #0 = { mustprogress noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } 223attributes #1 = { nofree nosync nounwind readnone speculatable willreturn } 224 225!llvm.dbg.cu = !{!2} 226!llvm.module.flags = !{!81, !82, !83, !84, !85} 227!llvm.ident = !{!86} 228 229!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) 230!1 = distinct !DIGlobalVariable(name: "v1", scope: !2, file: !3, line: 8, type: !71, isLocal: false, isDefinition: true) 231!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 15.0.0 (git@github.com:llvm/llvm-project.git 862896df6210f6660514f9f68051cd0371832f37)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None) 232!3 = !DIFile(filename: "test.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch", checksumkind: CSK_MD5, checksum: "84728cc618f91cd3bdecda0aa2d09c2d") 233!4 = !{!0, !5, !13, !32, !46, !60, !69} 234!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression()) 235!6 = distinct !DIGlobalVariable(name: "v5", scope: !2, file: !3, line: 17, type: !7, isLocal: false, isDefinition: true) 236!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_internal", file: !3, line: 14, size: 8, flags: DIFlagTypePassByValue, elements: !8, identifier: "_ZTS12ref_internal") 237!8 = !{!9} 238!9 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !7, file: !3, line: 15, baseType: !10, size: 8) 239!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "internal", scope: !11, file: !3, line: 12, size: 8, flags: DIFlagTypePassByValue, elements: !12) 240!11 = !DINamespace(scope: null) 241!12 = !{} 242!13 = !DIGlobalVariableExpression(var: !14, expr: !DIExpression()) 243!14 = distinct !DIGlobalVariable(name: "v2", scope: !2, file: !3, line: 33, type: !15, isLocal: false, isDefinition: true) 244!15 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu", file: !3, line: 30, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !16, identifier: "_ZTS16ref_templ_non_tu") 245!16 = !{!17} 246!17 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !15, file: !3, line: 31, baseType: !18, size: 64) 247!18 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_STN|templ_non_tu|<int>", file: !3, line: 26, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !19, vtableHolder: !18, templateParams: !30) 248!19 = !{!20, !26} 249!20 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$templ_non_tu", scope: !3, file: !3, baseType: !21, size: 64, flags: DIFlagArtificial) 250!21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !22, size: 64) 251!22 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: !23, size: 64) 252!23 = !DISubroutineType(types: !24) 253!24 = !{!25} 254!25 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 255!26 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIiE2f1Ev", scope: !18, file: !3, line: 27, type: !27, scopeLine: 27, containingType: !18, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual) 256!27 = !DISubroutineType(types: !28) 257!28 = !{null, !29} 258!29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 259!30 = !{!31} 260!31 = !DITemplateTypeParameter(name: "T", type: !25) 261!32 = !DIGlobalVariableExpression(var: !33, expr: !DIExpression()) 262!33 = distinct !DIGlobalVariable(name: "v3", scope: !2, file: !3, line: 45, type: !34, isLocal: false, isDefinition: true) 263!34 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu_simple", file: !3, line: 42, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !35, identifier: "_ZTS23ref_templ_non_tu_simple") 264!35 = !{!36} 265!36 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !34, file: !3, line: 43, baseType: !37, size: 64) 266!37 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "templ_non_tu", file: !3, line: 38, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !38, vtableHolder: !37, templateParams: !43) 267!38 = !{!20, !39} 268!39 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIlE2f1Ev", scope: !37, file: !3, line: 39, type: !40, scopeLine: 39, containingType: !37, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual) 269!40 = !DISubroutineType(types: !41) 270!41 = !{null, !42} 271!42 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !37, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 272!43 = !{!44} 273!44 = !DITemplateTypeParameter(name: "T", type: !45) 274!45 = !DIBasicType(name: "long", size: 64, encoding: DW_ATE_signed) 275!46 = !DIGlobalVariableExpression(var: !47, expr: !DIExpression()) 276!47 = distinct !DIGlobalVariable(name: "v4", scope: !2, file: !3, line: 56, type: !48, isLocal: false, isDefinition: true) 277!48 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "ref_templ_non_tu_mangled", file: !3, line: 53, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !49, identifier: "_ZTS24ref_templ_non_tu_mangled") 278!49 = !{!50} 279!50 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !48, file: !3, line: 54, baseType: !51, size: 64) 280!51 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_STN|templ_non_tu|<bool>", file: !3, line: 49, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !52, vtableHolder: !51, templateParams: !57) 281!52 = !{!20, !53} 282!53 = !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIbE2f1Ev", scope: !51, file: !3, line: 50, type: !54, scopeLine: 50, containingType: !51, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual) 283!54 = !DISubroutineType(types: !55) 284!55 = !{null, !56} 285!56 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !51, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 286!57 = !{!58} 287!58 = !DITemplateTypeParameter(name: "T", type: !59) 288!59 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) 289!60 = !DIGlobalVariableExpression(var: !61, expr: !DIExpression()) 290!61 = distinct !DIGlobalVariable(name: "v6", scope: !2, file: !3, line: 66, type: !62, isLocal: false, isDefinition: true) 291!62 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "ref_internal_template", file: !3, line: 63, size: 8, flags: DIFlagTypePassByValue, elements: !63, identifier: "_ZTS21ref_internal_template") 292!63 = !{!64} 293!64 = !DIDerivedType(tag: DW_TAG_member, name: "ax", scope: !62, file: !3, line: 64, baseType: !65, size: 8) 294!65 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "internal_template<ref_from_ref_internal_template>", scope: !11, file: !3, line: 59, size: 8, flags: DIFlagTypePassByValue, elements: !12, templateParams: !66) 295!66 = !{!67} 296!67 = !DITemplateTypeParameter(type: !68) 297!68 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "ref_from_ref_internal_template", file: !3, line: 61, size: 8, flags: DIFlagTypePassByValue, elements: !12, identifier: "_ZTS30ref_from_ref_internal_template") 298!69 = !DIGlobalVariableExpression(var: !70, expr: !DIExpression()) 299!70 = distinct !DIGlobalVariable(name: "v7", scope: !2, file: !3, line: 67, type: !68, isLocal: false, isDefinition: true) 300!71 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "tu_ref_non_tu", file: !3, line: 5, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !72, identifier: "_ZTS13tu_ref_non_tu") 301!72 = !{!73} 302!73 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !71, file: !3, line: 6, baseType: !74, size: 64) 303!74 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "non_tu", file: !3, line: 1, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !75, vtableHolder: !74) 304!75 = !{!76, !77} 305!76 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$non_tu", scope: !3, file: !3, baseType: !21, size: 64, flags: DIFlagArtificial) 306!77 = !DISubprogram(name: "f1", linkageName: "_ZN6non_tu2f1Ev", scope: !74, file: !3, line: 2, type: !78, scopeLine: 2, containingType: !74, virtualIndex: 0, flags: DIFlagPrototyped, spFlags: DISPFlagVirtual) 307!78 = !DISubroutineType(types: !79) 308!79 = !{null, !80} 309!80 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !74, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 310!81 = !{i32 7, !"Dwarf Version", i32 5} 311!82 = !{i32 2, !"Debug Info Version", i32 3} 312!83 = !{i32 1, !"wchar_size", i32 4} 313!84 = !{i32 7, !"uwtable", i32 2} 314!85 = !{i32 7, !"frame-pointer", i32 2} 315!86 = !{!"clang version 15.0.0 (git@github.com:llvm/llvm-project.git 862896df6210f6660514f9f68051cd0371832f37)"} 316!87 = distinct !DISubprogram(name: "f1", linkageName: "_ZN6non_tu2f1Ev", scope: !74, file: !3, line: 4, type: !78, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !77, retainedNodes: !12) 317!88 = !DILocalVariable(name: "this", arg: 1, scope: !87, type: !89, flags: DIFlagArtificial | DIFlagObjectPointer) 318!89 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !74, size: 64) 319!90 = !DILocation(line: 0, scope: !87) 320!91 = !DILocation(line: 4, column: 20, scope: !87) 321!92 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIiE2f1Ev", scope: !18, file: !3, line: 29, type: !27, scopeLine: 29, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !26, retainedNodes: !12) 322!93 = !DILocalVariable(name: "this", arg: 1, scope: !92, type: !94, flags: DIFlagArtificial | DIFlagObjectPointer) 323!94 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64) 324!95 = !DILocation(line: 0, scope: !92) 325!96 = !DILocation(line: 29, column: 31, scope: !92) 326!97 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIlE2f1Ev", scope: !37, file: !3, line: 41, type: !40, scopeLine: 41, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !39, retainedNodes: !12) 327!98 = !DILocalVariable(name: "this", arg: 1, scope: !97, type: !99, flags: DIFlagArtificial | DIFlagObjectPointer) 328!99 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !37, size: 64) 329!100 = !DILocation(line: 0, scope: !97) 330!101 = !DILocation(line: 41, column: 32, scope: !97) 331!102 = distinct !DISubprogram(name: "f1", linkageName: "_ZN12templ_non_tuIbE2f1Ev", scope: !51, file: !3, line: 52, type: !54, scopeLine: 52, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, declaration: !53, retainedNodes: !12) 332!103 = !DILocalVariable(name: "this", arg: 1, scope: !102, type: !104, flags: DIFlagArtificial | DIFlagObjectPointer) 333!104 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !51, size: 64) 334!105 = !DILocation(line: 0, scope: !102) 335!106 = !DILocation(line: 52, column: 32, scope: !102) 336