xref: /llvm-project/llvm/test/DebugInfo/COFF/function-options.ll (revision 3a05e01d1a76984fe1532bd237edbbb7ed9db6ea)
1; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s
2; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s
3
4; RUN: llc --try-experimental-debuginfo-iterators < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s
5; RUN: llc --try-experimental-debuginfo-iterators < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s
6;
7; Command to generate function-options.ll
8; $ clang++ function-options.cpp -S -emit-llvm -g -gcodeview -o function-options.ll
9;
10; #define DEFINE_FUNCTION(T) \
11;   T Func_##T(T &arg) { return arg; }
12;
13; class AClass {};
14; DEFINE_FUNCTION(AClass); // Expect: FO = None
15;
16; class BClass {
17; private:
18;   explicit BClass(); // Expect ctor: FO = Constructor
19; };
20; DEFINE_FUNCTION(BClass); // Expect: FO = CxxReturnUdt
21;
22; class C1Class {
23; public:
24;   C1Class() = default; // Note: Clang generates one defaulted ctor (FO = None) while MSVC doesn't.
25; };
26; DEFINE_FUNCTION(C1Class); // Expect: FO = None
27;
28; class C2Class { // Note: MSVC-specific dtor, i.e. __vecDelDtor won't be verified in this case.
29; public:
30;   ~C2Class() {} // Expect ~C2Class: FO = None
31; };
32; DEFINE_FUNCTION(C2Class); // Expect: FO = CxxReturnUdt
33;
34; class DClass : public BClass {}; // Note: MSVC yields one compiler-generated ctor for DClass while clang doesn't.
35; DEFINE_FUNCTION(DClass); // Expect: FO = CxxReturnUdt
36;
37; class FClass {
38;   static int x;
39;   AClass Member_AClass(AClass &);
40;   BClass Member_BClass(BClass &);
41; };
42; DEFINE_FUNCTION(FClass); // Expect FO = None
43;
44; struct AStruct {};
45; DEFINE_FUNCTION(AStruct); // Expect FO = None
46;
47; struct BStruct { BStruct(); }; // Expect ctor: FO = Constructor
48; DEFINE_FUNCTION(BStruct); // Expect FO = CxxReturnUdt
49;
50; union AUnion {};
51; DEFINE_FUNCTION(AUnion); // Expect FO = None
52;
53; union BUnion { BUnion() = default; }; // Note: Clang generates one defaulted ctor (FO = None) while MSVC does not.
54; DEFINE_FUNCTION(BUnion); // Expect FO = None
55
56
57; CHECK: Format: COFF-x86-64
58; CHECK: Arch: x86_64
59; CHECK: AddressSize: 64bit
60; CHECK: CodeViewTypes [
61; CHECK:   Section: .debug$T ({{.*}})
62; CHECK:   Magic: 0x4
63; CHECK:   Procedure ([[SP_A:.*]]) {
64; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
65; CHECK:     ReturnType: AClass ({{.*}})
66; CHECK:     CallingConvention: NearC (0x0)
67; CHECK:     FunctionOptions [ (0x0)
68; CHECK:     ]
69; CHECK:     NumParameters: 1
70; CHECK:     ArgListType: (AClass&) ({{.*}})
71; CHECK:   }
72; CHECK:   FuncId ({{.*}}) {
73; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
74; CHECK:     ParentScope: 0x0
75; CHECK:     FunctionType: AClass (AClass&) ([[SP_A]])
76; CHECK:     Name: Func_AClass
77; CHECK:   }
78; CHECK:   Procedure ([[SP_B:.*]]) {
79; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
80; CHECK:     ReturnType: BClass ({{.*}})
81; CHECK:     CallingConvention: NearC (0x0)
82; CHECK:     FunctionOptions [ (0x1)
83; CHECK:       CxxReturnUdt (0x1)
84; CHECK:     ]
85; CHECK:     NumParameters: 1
86; CHECK:     ArgListType: (BClass&) ({{.*}})
87; CHECK:   }
88; CHECK:   MemberFunction ([[CTOR_B:.*]]) {
89; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
90; CHECK:     ReturnType: void (0x3)
91; CHECK:     ClassType: BClass ({{.*}})
92; CHECK:     ThisType: BClass* {{.*}}
93; CHECK:     CallingConvention: NearC (0x0)
94; CHECK:     FunctionOptions [ (0x2)
95; CHECK:       Constructor (0x2)
96; CHECK:     ]
97; CHECK:     NumParameters: 0
98; CHECK:     ArgListType: () ({{.*}})
99; CHECK:     ThisAdjustment: 0
100; CHECK:   }
101; CHECK:   FieldList ({{.*}}) {
102; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
103; CHECK:     OneMethod {
104; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
105; CHECK:       AccessSpecifier: Private (0x1)
106; CHECK:       Type: void BClass::() ([[CTOR_B]])
107; CHECK:       Name: BClass
108; CHECK:     }
109; CHECK:   }
110; CHECK:   FuncId ({{.*}}) {
111; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
112; CHECK:     ParentScope: 0x0
113; CHECK:     FunctionType: BClass (BClass&) ([[SP_B]])
114; CHECK:     Name: Func_BClass
115; CHECK:   }
116; CHECK:   Procedure ([[SP_C1:.*]]) {
117; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
118; CHECK:     ReturnType: C1Class ({{.*}})
119; CHECK:     CallingConvention: NearC (0x0)
120; CHECK:     FunctionOptions [ (0x0)
121; CHECK:     ]
122; CHECK:     NumParameters: 1
123; CHECK:     ArgListType: (C1Class&) ({{.*}})
124; CHECK:   }
125; CHECK:   MemberFunction ([[CTOR_C1:.*]]) {
126; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
127; CHECK:     ReturnType: void (0x3)
128; CHECK:     ClassType: C1Class ({{.*}})
129; CHECK:     ThisType: C1Class* {{.*}}
130; CHECK:     CallingConvention: NearC (0x0)
131; CHECK:     FunctionOptions [ (0x0)
132; CHECK:     ]
133; CHECK:     NumParameters: 0
134; CHECK:     ArgListType: () ({{.*}})
135; CHECK:     ThisAdjustment: 0
136; CHECK:   }
137; CHECK:   FieldList ({{.*}}) {
138; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
139; CHECK:     OneMethod {
140; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
141; CHECK:       AccessSpecifier: Public (0x3)
142; CHECK:       Type: void C1Class::() ([[CTOR_C1]])
143; CHECK:       Name: C1Class
144; CHECK:     }
145; CHECK:   }
146; CHECK:   FuncId ({{.*}}) {
147; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
148; CHECK:     ParentScope: 0x0
149; CHECK:     FunctionType: C1Class (C1Class&) ([[SP_C1]])
150; CHECK:     Name: Func_C1Class
151; CHECK:   }
152; CHECK:   Procedure ([[SP_C2:.*]]) {
153; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
154; CHECK:     ReturnType: C2Class ({{.*}})
155; CHECK:     CallingConvention: NearC (0x0)
156; CHECK:     FunctionOptions [ (0x1)
157; CHECK:       CxxReturnUdt (0x1)
158; CHECK:     ]
159; CHECK:     NumParameters: 1
160; CHECK:     ArgListType: (C2Class&) ({{.*}})
161; CHECK:   }
162; CHECK:   MemberFunction ([[CTOR_C2:.*]]) {
163; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
164; CHECK:     ReturnType: void (0x3)
165; CHECK:     ClassType: C2Class ({{.*}})
166; CHECK:     ThisType: C2Class* {{.*}}
167; CHECK:     CallingConvention: NearC (0x0)
168; CHECK:     FunctionOptions [ (0x0)
169; CHECK:     ]
170; CHECK:     NumParameters: 0
171; CHECK:     ArgListType: () ({{.*}})
172; CHECK:     ThisAdjustment: 0
173; CHECK:   }
174; CHECK:   FieldList ({{.*}}) {
175; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
176; CHECK:     OneMethod {
177; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
178; CHECK:       AccessSpecifier: Public (0x3)
179; CHECK:       Type: void C2Class::() ([[CTOR_C2]])
180; CHECK:       Name: ~C2Class
181; CHECK:     }
182; CHECK:   }
183; CHECK:   FuncId ({{.*}}) {
184; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
185; CHECK:     ParentScope: 0x0
186; CHECK:     FunctionType: C2Class (C2Class&) ([[SP_C2]])
187; CHECK:     Name: Func_C2Class
188; CHECK:   }
189; CHECK:   Procedure ([[SP_D:.*]]) {
190; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
191; CHECK:     ReturnType: DClass ({{.*}})
192; CHECK:     CallingConvention: NearC (0x0)
193; CHECK:     FunctionOptions [ (0x1)
194; CHECK:       CxxReturnUdt (0x1)
195; CHECK:     ]
196; CHECK:     NumParameters: 1
197; CHECK:     ArgListType: (DClass&) ({{.*}})
198; CHECK:   }
199; CHECK:   FieldList ({{.*}}) {
200; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
201; CHECK:     BaseClass {
202; CHECK:       TypeLeafKind: LF_BCLASS (0x1400)
203; CHECK:       AccessSpecifier: Public (0x3)
204; CHECK:       BaseType: BClass ({{.*}})
205; CHECK:       BaseOffset: 0x0
206; CHECK:     }
207; CHECK:   }
208; CHECK:   FuncId ({{.*}}) {
209; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
210; CHECK:     ParentScope: 0x0
211; CHECK:     FunctionType: DClass (DClass&) ([[SP_D]])
212; CHECK:     Name: Func_DClass
213; CHECK:   }
214; CHECK:   Procedure ([[SP_F:.*]]) {
215; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
216; CHECK:     ReturnType: FClass ({{.*}})
217; CHECK:     CallingConvention: NearC (0x0)
218; CHECK:     FunctionOptions [ (0x0)
219; CHECK:     ]
220; CHECK:     NumParameters: 1
221; CHECK:     ArgListType: (FClass&) ({{.*}})
222; CHECK:   }
223; CHECK:   MemberFunction ([[MF_A:.*]]) {
224; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
225; CHECK:     ReturnType: AClass ({{.*}})
226; CHECK:     ClassType: FClass ({{.*}})
227; CHECK:     ThisType: FClass* {{.*}}
228; CHECK:     CallingConvention: NearC (0x0)
229; CHECK:     FunctionOptions [ (0x1)
230; CHECK:       CxxReturnUdt (0x1)
231; CHECK:     ]
232; CHECK:     NumParameters: 1
233; CHECK:     ArgListType: (AClass&) ({{.*}})
234; CHECK:     ThisAdjustment: 0
235; CHECK:   }
236; CHECK:   MemberFunction ([[MF_B:.*]]) {
237; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
238; CHECK:     ReturnType: BClass ({{.*}})
239; CHECK:     ClassType: FClass ({{.*}})
240; CHECK:     ThisType: FClass* {{.*}}
241; CHECK:     CallingConvention: NearC (0x0)
242; CHECK:     FunctionOptions [ (0x1)
243; CHECK:       CxxReturnUdt (0x1)
244; CHECK:     ]
245; CHECK:     NumParameters: 1
246; CHECK:     ArgListType: (BClass&) ({{.*}})
247; CHECK:     ThisAdjustment: 0
248; CHECK:   }
249; CHECK:   FieldList ({{.*}}) {
250; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
251; CHECK:     StaticDataMember {
252; CHECK:       TypeLeafKind: LF_STMEMBER (0x150E)
253; CHECK:       AccessSpecifier: Private (0x1)
254; CHECK:       Type: int (0x74)
255; CHECK:       Name: x
256; CHECK:     }
257; CHECK:     OneMethod {
258; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
259; CHECK:       AccessSpecifier: Private (0x1)
260; CHECK:       Type: AClass FClass::(AClass&) ([[MF_A]])
261; CHECK:       Name: Member_AClass
262; CHECK:     }
263; CHECK:     OneMethod {
264; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
265; CHECK:       AccessSpecifier: Private (0x1)
266; CHECK:       Type: BClass FClass::(BClass&) ([[MF_B]])
267; CHECK:       Name: Member_BClass
268; CHECK:     }
269; CHECK:   }
270; CHECK:   FuncId ({{.*}}) {
271; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
272; CHECK:     ParentScope: 0x0
273; CHECK:     FunctionType: FClass (FClass&) ([[SP_F]])
274; CHECK:     Name: Func_FClass
275; CHECK:   }
276; CHECK:   Procedure ([[SP_AS:.*]]) {
277; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
278; CHECK:     ReturnType: AStruct ({{.*}})
279; CHECK:     CallingConvention: NearC (0x0)
280; CHECK:     FunctionOptions [ (0x0)
281; CHECK:     ]
282; CHECK:     NumParameters: 1
283; CHECK:     ArgListType: (AStruct&) ({{.*}})
284; CHECK:   }
285; CHECK:   FuncId ({{.*}}) {
286; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
287; CHECK:     ParentScope: 0x0
288; CHECK:     FunctionType: AStruct (AStruct&) ([[SP_AS]])
289; CHECK:     Name: Func_AStruct
290; CHECK:   }
291; CHECK:   Procedure ([[SP_BS:.*]]) {
292; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
293; CHECK:     ReturnType: BStruct ({{.*}})
294; CHECK:     CallingConvention: NearC (0x0)
295; CHECK:     FunctionOptions [ (0x1)
296; CHECK:       CxxReturnUdt (0x1)
297; CHECK:     ]
298; CHECK:     NumParameters: 1
299; CHECK:     ArgListType: (BStruct&) ({{.*}})
300; CHECK:   }
301; CHECK:   MemberFunction ([[CTOR_BS:.*]]) {
302; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
303; CHECK:     ReturnType: void (0x3)
304; CHECK:     ClassType: BStruct ({{.*}})
305; CHECK:     ThisType: BStruct* {{.*}}
306; CHECK:     CallingConvention: NearC (0x0)
307; CHECK:     FunctionOptions [ (0x2)
308; CHECK:       Constructor (0x2)
309; CHECK:     ]
310; CHECK:     NumParameters: 0
311; CHECK:     ArgListType: () ({{.*}})
312; CHECK:     ThisAdjustment: 0
313; CHECK:   }
314; CHECK:   FieldList ({{.*}}) {
315; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
316; CHECK:     OneMethod {
317; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
318; CHECK:       AccessSpecifier: Public (0x3)
319; CHECK:       Type: void BStruct::() ([[CTOR_BS]])
320; CHECK:       Name: BStruct
321; CHECK:     }
322; CHECK:   }
323; CHECK:   FuncId ({{.*}}) {
324; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
325; CHECK:     ParentScope: 0x0
326; CHECK:     FunctionType: BStruct (BStruct&) ([[SP_BS]])
327; CHECK:     Name: Func_BStruct
328; CHECK:   }
329; CHECK:   Procedure ([[SP_AU:.*]]) {
330; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
331; CHECK:     ReturnType: AUnion ({{.*}})
332; CHECK:     CallingConvention: NearC (0x0)
333; CHECK:     FunctionOptions [ (0x0)
334; CHECK:     ]
335; CHECK:     NumParameters: 1
336; CHECK:     ArgListType: (AUnion&) ({{.*}})
337; CHECK:   }
338; CHECK:   FuncId ({{.*}}) {
339; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
340; CHECK:     ParentScope: 0x0
341; CHECK:     FunctionType: AUnion (AUnion&) ([[SP_AU]])
342; CHECK:     Name: Func_AUnion
343; CHECK:   }
344; CHECK:   Procedure ([[SP_BU:.*]]) {
345; CHECK:     TypeLeafKind: LF_PROCEDURE (0x1008)
346; CHECK:     ReturnType: BUnion ({{.*}})
347; CHECK:     CallingConvention: NearC (0x0)
348; CHECK:     FunctionOptions [ (0x0)
349; CHECK:     ]
350; CHECK:     NumParameters: 1
351; CHECK:     ArgListType: (BUnion&) ({{.*}})
352; CHECK:   }
353; CHECK:   MemberFunction ([[CTOR_BU:.*]]) {
354; CHECK:     TypeLeafKind: LF_MFUNCTION (0x1009)
355; CHECK:     ReturnType: void (0x3)
356; CHECK:     ClassType: BUnion ({{.*}})
357; CHECK:     ThisType: BUnion* {{.*}}
358; CHECK:     CallingConvention: NearC (0x0)
359; CHECK:     FunctionOptions [ (0x0)
360; CHECK:     ]
361; CHECK:     NumParameters: 0
362; CHECK:     ArgListType: () ({{.*}})
363; CHECK:     ThisAdjustment: 0
364; CHECK:   }
365; CHECK:   FieldList ({{.*}}) {
366; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
367; CHECK:     OneMethod {
368; CHECK:       TypeLeafKind: LF_ONEMETHOD (0x1511)
369; CHECK:       AccessSpecifier: Public (0x3)
370; CHECK:       Type: void BUnion::() ([[CTOR_BU]])
371; CHECK:       Name: BUnion
372; CHECK:     }
373; CHECK:   }
374; CHECK:   FuncId ({{.*}}) {
375; CHECK:     TypeLeafKind: LF_FUNC_ID (0x1601)
376; CHECK:     ParentScope: 0x0
377; CHECK:     FunctionType: BUnion (BUnion&) ([[SP_BU]])
378; CHECK:     Name: Func_BUnion
379; CHECK:   }
380; CHECK: ]
381
382; CHECK-LABEL: FunctionType: Func_AClass (0x1008)
383; CHECK-NEXT:  CodeOffset: ?Func_AClass@@YA?AVAClass@@AEAV1@@Z+0x0
384; CHECK-NEXT:  Segment: 0x0
385; CHECK-NEXT:  Flags [ (0xC0)
386; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
387; CHECK-NEXT:    IsNoInline (0x40)
388; CHECK-NEXT:  ]
389; CHECK-NEXT:  DisplayName: Func_AClass
390; CHECK-NEXT:  LinkageName: ?Func_AClass@@YA?AVAClass@@AEAV1@@Z
391; CHECK-LABEL: FunctionType: Func_BClass (0x1013)
392; CHECK-NEXT:  CodeOffset: ?Func_BClass@@YA?AVBClass@@AEAV1@@Z+0x0
393; CHECK-NEXT:  Segment: 0x0
394; CHECK-NEXT:  Flags [ (0xC0)
395; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
396; CHECK-NEXT:    IsNoInline (0x40)
397; CHECK-NEXT:  ]
398; CHECK-NEXT:  DisplayName: Func_BClass
399; CHECK-NEXT:  LinkageName: ?Func_BClass@@YA?AVBClass@@AEAV1@@Z
400; CHECK-LABEL: FunctionType: Func_C1Class (0x101D)
401; CHECK-NEXT:  CodeOffset: ?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z+0x0
402; CHECK-NEXT:  Segment: 0x0
403; CHECK-NEXT:  Flags [ (0xC0)
404; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
405; CHECK-NEXT:    IsNoInline (0x40)
406; CHECK-NEXT:  ]
407; CHECK-NEXT:  DisplayName: Func_C1Class
408; CHECK-NEXT:  LinkageName: ?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z
409; CHECK-LABEL: FunctionType: Func_C2Class (0x1027)
410; CHECK-NEXT:  CodeOffset: ?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z+0x0
411; CHECK-NEXT:  Segment: 0x0
412; CHECK-NEXT:  Flags [ (0xC0)
413; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
414; CHECK-NEXT:    IsNoInline (0x40)
415; CHECK-NEXT:  ]
416; CHECK-NEXT:  DisplayName: Func_C2Class
417; CHECK-NEXT:  LinkageName: ?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z
418; CHECK-LABEL: FunctionType: Func_DClass (0x102F)
419; CHECK-NEXT:  CodeOffset: ?Func_DClass@@YA?AVDClass@@AEAV1@@Z+0x0
420; CHECK-NEXT:  Segment: 0x0
421; CHECK-NEXT:  Flags [ (0xC0)
422; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
423; CHECK-NEXT:    IsNoInline (0x40)
424; CHECK-NEXT:  ]
425; CHECK-NEXT:  DisplayName: Func_DClass
426; CHECK-NEXT:  LinkageName: ?Func_DClass@@YA?AVDClass@@AEAV1@@Z
427; CHECK-LABEL: FunctionType: Func_FClass (0x103A)
428; CHECK-NEXT:  CodeOffset: ?Func_FClass@@YA?AVFClass@@AEAV1@@Z+0x0
429; CHECK-NEXT:  Segment: 0x0
430; CHECK-NEXT:  Flags [ (0xC0)
431; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
432; CHECK-NEXT:    IsNoInline (0x40)
433; CHECK-NEXT:  ]
434; CHECK-NEXT:  DisplayName: Func_FClass
435; CHECK-NEXT:  LinkageName: ?Func_FClass@@YA?AVFClass@@AEAV1@@Z
436; CHECK-LABEL: FunctionType: Func_AStruct (0x1041)
437; CHECK-NEXT:  CodeOffset: ?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z+0x0
438; CHECK-NEXT:  Segment: 0x0
439; CHECK-NEXT:  Flags [ (0xC0)
440; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
441; CHECK-NEXT:    IsNoInline (0x40)
442; CHECK-NEXT:  ]
443; CHECK-NEXT:  DisplayName: Func_AStruct
444; CHECK-NEXT:  LinkageName: ?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z
445; CHECK-LABEL: FunctionType: Func_BStruct (0x104B)
446; CHECK-NEXT:  CodeOffset: ?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z+0x0
447; CHECK-NEXT:  Segment: 0x0
448; CHECK-NEXT:  Flags [ (0xC0)
449; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
450; CHECK-NEXT:    IsNoInline (0x40)
451; CHECK-NEXT:  ]
452; CHECK-NEXT:  DisplayName: Func_BStruct
453; CHECK-NEXT:  LinkageName: ?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z
454; CHECK-LABEL: FunctionType: Func_AUnion (0x1052)
455; CHECK-NEXT:  CodeOffset: ?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z+0x0
456; CHECK-NEXT:  Segment: 0x0
457; CHECK-NEXT:  Flags [ (0xC0)
458; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
459; CHECK-NEXT:    IsNoInline (0x40)
460; CHECK-NEXT:  ]
461; CHECK-NEXT:  DisplayName: Func_AUnion
462; CHECK-NEXT:  LinkageName: ?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z
463; CHECK-LABEL: FunctionType: Func_BUnion (0x105C)
464; CHECK-NEXT:  CodeOffset: ?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z+0x0
465; CHECK-NEXT:  Segment: 0x0
466; CHECK-NEXT:  Flags [ (0xC0)
467; CHECK-NEXT:    HasOptimizedDebugInfo (0x80)
468; CHECK-NEXT:    IsNoInline (0x40)
469; CHECK-NEXT:  ]
470; CHECK-NEXT:  DisplayName: Func_BUnion
471; CHECK-NEXT:  LinkageName: ?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z
472
473; ModuleID = 't.cpp'
474source_filename = "t.cpp"
475target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
476target triple = "x86_64-pc-windows-msvc19.23.28106"
477
478%class.AClass = type { i8 }
479%class.BClass = type { i8 }
480%class.C1Class = type { i8 }
481%class.C2Class = type { i8 }
482%class.DClass = type { i8 }
483%class.FClass = type { i8 }
484%struct.AStruct = type { i8 }
485%struct.BStruct = type { i8 }
486%union.AUnion = type { i8 }
487%union.BUnion = type { i8 }
488
489; Function Attrs: noinline nounwind optnone uwtable
490define dso_local i8 @"?Func_AClass@@YA?AVAClass@@AEAV1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !8 {
491entry:
492  %retval = alloca %class.AClass, align 1
493  %arg.addr = alloca ptr, align 8
494  store ptr %arg, ptr %arg.addr, align 8
495  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !13, metadata !DIExpression()), !dbg !14
496  %0 = load ptr, ptr %arg.addr, align 8, !dbg !14
497  %coerce.dive = getelementptr inbounds %class.AClass, ptr %retval, i32 0, i32 0, !dbg !14
498  %1 = load i8, ptr %coerce.dive, align 1, !dbg !14
499  ret i8 %1, !dbg !14
500}
501
502; Function Attrs: nounwind readnone speculatable willreturn
503declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
504
505; Function Attrs: noinline nounwind optnone uwtable
506define dso_local void @"?Func_BClass@@YA?AVBClass@@AEAV1@@Z"(ptr noalias sret(%class.BClass) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !15 {
507entry:
508  %result.ptr = alloca ptr, align 8
509  %arg.addr = alloca ptr, align 8
510  %0 = bitcast ptr %agg.result to ptr
511  store ptr %0, ptr %result.ptr, align 8
512  store ptr %arg, ptr %arg.addr, align 8
513  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !25, metadata !DIExpression()), !dbg !26
514  %1 = load ptr, ptr %arg.addr, align 8, !dbg !26
515  ret void, !dbg !26
516}
517
518; Function Attrs: noinline nounwind optnone uwtable
519define dso_local void @"?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z"(ptr noalias sret(%class.C1Class) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !27 {
520entry:
521  %result.ptr = alloca ptr, align 8
522  %arg.addr = alloca ptr, align 8
523  %0 = bitcast ptr %agg.result to ptr
524  store ptr %0, ptr %result.ptr, align 8
525  store ptr %arg, ptr %arg.addr, align 8
526  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !37, metadata !DIExpression()), !dbg !38
527  %1 = load ptr, ptr %arg.addr, align 8, !dbg !38
528  ret void, !dbg !38
529}
530
531; Function Attrs: noinline nounwind optnone uwtable
532define dso_local void @"?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z"(ptr noalias sret(%class.C2Class) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !39 {
533entry:
534  %result.ptr = alloca ptr, align 8
535  %arg.addr = alloca ptr, align 8
536  %0 = bitcast ptr %agg.result to ptr
537  store ptr %0, ptr %result.ptr, align 8
538  store ptr %arg, ptr %arg.addr, align 8
539  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !49, metadata !DIExpression()), !dbg !50
540  %1 = load ptr, ptr %arg.addr, align 8, !dbg !50
541  ret void, !dbg !50
542}
543
544; Function Attrs: noinline nounwind optnone uwtable
545define dso_local void @"?Func_DClass@@YA?AVDClass@@AEAV1@@Z"(ptr noalias sret(%class.DClass) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !51 {
546entry:
547  %result.ptr = alloca ptr, align 8
548  %arg.addr = alloca ptr, align 8
549  %0 = bitcast ptr %agg.result to ptr
550  store ptr %0, ptr %result.ptr, align 8
551  store ptr %arg, ptr %arg.addr, align 8
552  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !58, metadata !DIExpression()), !dbg !59
553  %1 = load ptr, ptr %arg.addr, align 8, !dbg !59
554  ret void, !dbg !59
555}
556
557; Function Attrs: noinline nounwind optnone uwtable
558define dso_local i8 @"?Func_FClass@@YA?AVFClass@@AEAV1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !60 {
559entry:
560  %retval = alloca %class.FClass, align 1
561  %arg.addr = alloca ptr, align 8
562  store ptr %arg, ptr %arg.addr, align 8
563  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !75, metadata !DIExpression()), !dbg !76
564  %0 = load ptr, ptr %arg.addr, align 8, !dbg !76
565  %coerce.dive = getelementptr inbounds %class.FClass, ptr %retval, i32 0, i32 0, !dbg !76
566  %1 = load i8, ptr %coerce.dive, align 1, !dbg !76
567  ret i8 %1, !dbg !76
568}
569
570; Function Attrs: noinline nounwind optnone uwtable
571define dso_local i8 @"?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !77 {
572entry:
573  %retval = alloca %struct.AStruct, align 1
574  %arg.addr = alloca ptr, align 8
575  store ptr %arg, ptr %arg.addr, align 8
576  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !82, metadata !DIExpression()), !dbg !83
577  %0 = load ptr, ptr %arg.addr, align 8, !dbg !83
578  %coerce.dive = getelementptr inbounds %struct.AStruct, ptr %retval, i32 0, i32 0, !dbg !83
579  %1 = load i8, ptr %coerce.dive, align 1, !dbg !83
580  ret i8 %1, !dbg !83
581}
582
583; Function Attrs: noinline nounwind optnone uwtable
584define dso_local void @"?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z"(ptr noalias sret(%struct.BStruct) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !84 {
585entry:
586  %result.ptr = alloca ptr, align 8
587  %arg.addr = alloca ptr, align 8
588  %0 = bitcast ptr %agg.result to ptr
589  store ptr %0, ptr %result.ptr, align 8
590  store ptr %arg, ptr %arg.addr, align 8
591  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !94, metadata !DIExpression()), !dbg !95
592  %1 = load ptr, ptr %arg.addr, align 8, !dbg !95
593  ret void, !dbg !95
594}
595
596; Function Attrs: noinline nounwind optnone uwtable
597define dso_local i8 @"?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !96 {
598entry:
599  %retval = alloca %union.AUnion, align 1
600  %arg.addr = alloca ptr, align 8
601  store ptr %arg, ptr %arg.addr, align 8
602  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !101, metadata !DIExpression()), !dbg !102
603  %0 = load ptr, ptr %arg.addr, align 8, !dbg !102
604  %coerce.dive = getelementptr inbounds %union.AUnion, ptr %retval, i32 0, i32 0, !dbg !102
605  %1 = load i8, ptr %coerce.dive, align 1, !dbg !102
606  ret i8 %1, !dbg !102
607}
608
609; Function Attrs: noinline nounwind optnone uwtable
610define dso_local void @"?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z"(ptr noalias sret(%union.BUnion) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !103 {
611entry:
612  %result.ptr = alloca ptr, align 8
613  %arg.addr = alloca ptr, align 8
614  %0 = bitcast ptr %agg.result to ptr
615  store ptr %0, ptr %result.ptr, align 8
616  store ptr %arg, ptr %arg.addr, align 8
617  call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !113, metadata !DIExpression()), !dbg !114
618  %1 = load ptr, ptr %arg.addr, align 8, !dbg !114
619  ret void, !dbg !114
620}
621
622; Function Attrs: noinline norecurse nounwind optnone uwtable
623define dso_local i32 @main() #2 !dbg !115 {
624entry:
625  %retval = alloca i32, align 4
626  store i32 0, ptr %retval, align 4
627  ret i32 0, !dbg !118
628}
629
630attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
631attributes #1 = { nounwind readnone speculatable willreturn }
632attributes #2 = { noinline norecurse nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
633
634!llvm.dbg.cu = !{!0}
635!llvm.module.flags = !{!3, !4, !5, !6}
636!llvm.ident = !{!7}
637
638!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 11.0.0 (https://github.com/llvm/llvm-project.git 48992717b0e3466cf8814a188e9568c9d71b59c2)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
639!1 = !DIFile(filename: "t.cpp", directory: "C:\\src\\tests\\duplicate-types\\llvm-test", checksumkind: CSK_MD5, checksum: "c4c61c0e2135d713d0c99a1ba9ab568b")
640!2 = !{}
641!3 = !{i32 2, !"CodeView", i32 1}
642!4 = !{i32 2, !"Debug Info Version", i32 3}
643!5 = !{i32 1, !"wchar_size", i32 2}
644!6 = !{i32 7, !"PIC Level", i32 2}
645!7 = !{!"clang version 11.0.0 (https://github.com/llvm/llvm-project.git 48992717b0e3466cf8814a188e9568c9d71b59c2)"}
646!8 = distinct !DISubprogram(name: "Func_AClass", linkageName: "?Func_AClass@@YA?AVAClass@@AEAV1@@Z", scope: !1, file: !1, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
647!9 = !DISubroutineType(types: !10)
648!10 = !{!11, !12}
649!11 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "AClass", file: !1, line: 4, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?AVAClass@@")
650!12 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !11, size: 64)
651!13 = !DILocalVariable(name: "arg", arg: 1, scope: !8, file: !1, line: 5, type: !12)
652!14 = !DILocation(line: 5, scope: !8)
653!15 = distinct !DISubprogram(name: "Func_BClass", linkageName: "?Func_BClass@@YA?AVBClass@@AEAV1@@Z", scope: !1, file: !1, line: 11, type: !16, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
654!16 = !DISubroutineType(types: !17)
655!17 = !{!18, !24}
656!18 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "BClass", file: !1, line: 7, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !19, identifier: ".?AVBClass@@")
657!19 = !{!20}
658!20 = !DISubprogram(name: "BClass", scope: !18, file: !1, line: 9, type: !21, scopeLine: 9, flags: DIFlagExplicit | DIFlagPrototyped, spFlags: 0)
659!21 = !DISubroutineType(types: !22)
660!22 = !{null, !23}
661!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
662!24 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !18, size: 64)
663!25 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 11, type: !24)
664!26 = !DILocation(line: 11, scope: !15)
665!27 = distinct !DISubprogram(name: "Func_C1Class", linkageName: "?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z", scope: !1, file: !1, line: 17, type: !28, scopeLine: 17, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
666!28 = !DISubroutineType(types: !29)
667!29 = !{!30, !36}
668!30 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C1Class", file: !1, line: 13, size: 8, flags: DIFlagTypePassByValue, elements: !31, identifier: ".?AVC1Class@@")
669!31 = !{!32}
670!32 = !DISubprogram(name: "C1Class", scope: !30, file: !1, line: 15, type: !33, scopeLine: 15, flags: DIFlagPublic | DIFlagPrototyped, spFlags: 0)
671!33 = !DISubroutineType(types: !34)
672!34 = !{null, !35}
673!35 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !30, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
674!36 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !30, size: 64)
675!37 = !DILocalVariable(name: "arg", arg: 1, scope: !27, file: !1, line: 17, type: !36)
676!38 = !DILocation(line: 17, scope: !27)
677!39 = distinct !DISubprogram(name: "Func_C2Class", linkageName: "?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z", scope: !1, file: !1, line: 23, type: !40, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
678!40 = !DISubroutineType(types: !41)
679!41 = !{!42, !48}
680!42 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C2Class", file: !1, line: 19, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !43, identifier: ".?AVC2Class@@")
681!43 = !{!44}
682!44 = !DISubprogram(name: "~C2Class", scope: !42, file: !1, line: 21, type: !45, scopeLine: 21, flags: DIFlagPublic | DIFlagPrototyped, spFlags: 0)
683!45 = !DISubroutineType(types: !46)
684!46 = !{null, !47}
685!47 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !42, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
686!48 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !42, size: 64)
687!49 = !DILocalVariable(name: "arg", arg: 1, scope: !39, file: !1, line: 23, type: !48)
688!50 = !DILocation(line: 23, scope: !39)
689!51 = distinct !DISubprogram(name: "Func_DClass", linkageName: "?Func_DClass@@YA?AVDClass@@AEAV1@@Z", scope: !1, file: !1, line: 26, type: !52, scopeLine: 26, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
690!52 = !DISubroutineType(types: !53)
691!53 = !{!54, !57}
692!54 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "DClass", file: !1, line: 25, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !55, identifier: ".?AVDClass@@")
693!55 = !{!56}
694!56 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !54, baseType: !18, flags: DIFlagPublic, extraData: i32 0)
695!57 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !54, size: 64)
696!58 = !DILocalVariable(name: "arg", arg: 1, scope: !51, file: !1, line: 26, type: !57)
697!59 = !DILocation(line: 26, scope: !51)
698!60 = distinct !DISubprogram(name: "Func_FClass", linkageName: "?Func_FClass@@YA?AVFClass@@AEAV1@@Z", scope: !1, file: !1, line: 33, type: !61, scopeLine: 33, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
699!61 = !DISubroutineType(types: !62)
700!62 = !{!63, !74}
701!63 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "FClass", file: !1, line: 28, size: 8, flags: DIFlagTypePassByValue, elements: !64, identifier: ".?AVFClass@@")
702!64 = !{!65, !67, !71}
703!65 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !63, file: !1, line: 29, baseType: !66, flags: DIFlagStaticMember)
704!66 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
705!67 = !DISubprogram(name: "Member_AClass", linkageName: "?Member_AClass@FClass@@AEAA?AVAClass@@AEAV2@@Z", scope: !63, file: !1, line: 30, type: !68, scopeLine: 30, flags: DIFlagPrototyped, spFlags: 0)
706!68 = !DISubroutineType(types: !69)
707!69 = !{!11, !70, !12}
708!70 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !63, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
709!71 = !DISubprogram(name: "Member_BClass", linkageName: "?Member_BClass@FClass@@AEAA?AVBClass@@AEAV2@@Z", scope: !63, file: !1, line: 31, type: !72, scopeLine: 31, flags: DIFlagPrototyped, spFlags: 0)
710!72 = !DISubroutineType(types: !73)
711!73 = !{!18, !70, !24}
712!74 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !63, size: 64)
713!75 = !DILocalVariable(name: "arg", arg: 1, scope: !60, file: !1, line: 33, type: !74)
714!76 = !DILocation(line: 33, scope: !60)
715!77 = distinct !DISubprogram(name: "Func_AStruct", linkageName: "?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z", scope: !1, file: !1, line: 36, type: !78, scopeLine: 36, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
716!78 = !DISubroutineType(types: !79)
717!79 = !{!80, !81}
718!80 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "AStruct", file: !1, line: 35, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?AUAStruct@@")
719!81 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !80, size: 64)
720!82 = !DILocalVariable(name: "arg", arg: 1, scope: !77, file: !1, line: 36, type: !81)
721!83 = !DILocation(line: 36, scope: !77)
722!84 = distinct !DISubprogram(name: "Func_BStruct", linkageName: "?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z", scope: !1, file: !1, line: 39, type: !85, scopeLine: 39, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
723!85 = !DISubroutineType(types: !86)
724!86 = !{!87, !93}
725!87 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "BStruct", file: !1, line: 38, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !88, identifier: ".?AUBStruct@@")
726!88 = !{!89}
727!89 = !DISubprogram(name: "BStruct", scope: !87, file: !1, line: 38, type: !90, scopeLine: 38, flags: DIFlagPrototyped, spFlags: 0)
728!90 = !DISubroutineType(types: !91)
729!91 = !{null, !92}
730!92 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !87, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
731!93 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !87, size: 64)
732!94 = !DILocalVariable(name: "arg", arg: 1, scope: !84, file: !1, line: 39, type: !93)
733!95 = !DILocation(line: 39, scope: !84)
734!96 = distinct !DISubprogram(name: "Func_AUnion", linkageName: "?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z", scope: !1, file: !1, line: 42, type: !97, scopeLine: 42, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
735!97 = !DISubroutineType(types: !98)
736!98 = !{!99, !100}
737!99 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "AUnion", file: !1, line: 41, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?ATAUnion@@")
738!100 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !99, size: 64)
739!101 = !DILocalVariable(name: "arg", arg: 1, scope: !96, file: !1, line: 42, type: !100)
740!102 = !DILocation(line: 42, scope: !96)
741!103 = distinct !DISubprogram(name: "Func_BUnion", linkageName: "?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z", scope: !1, file: !1, line: 45, type: !104, scopeLine: 45, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
742!104 = !DISubroutineType(types: !105)
743!105 = !{!106, !112}
744!106 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "BUnion", file: !1, line: 44, size: 8, flags: DIFlagTypePassByValue, elements: !107, identifier: ".?ATBUnion@@")
745!107 = !{!108}
746!108 = !DISubprogram(name: "BUnion", scope: !106, file: !1, line: 44, type: !109, scopeLine: 44, flags: DIFlagPrototyped, spFlags: 0)
747!109 = !DISubroutineType(types: !110)
748!110 = !{null, !111}
749!111 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !106, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
750!112 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !106, size: 64)
751!113 = !DILocalVariable(name: "arg", arg: 1, scope: !103, file: !1, line: 45, type: !112)
752!114 = !DILocation(line: 45, scope: !103)
753!115 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 47, type: !116, scopeLine: 47, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
754!116 = !DISubroutineType(types: !117)
755!117 = !{!66}
756!118 = !DILocation(line: 48, scope: !115)
757