declare !foo !0 !bar !{!"baz"} !qux !{!2} void @f1()

define void @f2() !foo !0 !bar !{!"baz"} !qux !{!2} {
  ret void
}

; --- [ Metadata definitions ] -------------------------------------------------

; Empty named metadata definition.
!foo = !{}

; Plain named metadata definition.
!bar = !{!0}

; Multiple metadata IDs.
!baz = !{!0, !1, !15}

; !vars = !{!9, !10, !11}
; Empty metadata definition.
!0 = !{}

; Plain metadata definition.
!1 = !{!0}

; Multiple metadata IDs.
!2 = !{!0, !1}

; Distinct.
!3 = distinct !{!2}

; Nested metadata.
!4 = !{!{!{!0}}}

; Metadata string.
!5 = !{!"foo"}

; Metadata constant.
!6 = !{i32 42}

; Metadata constant.
!7 = !{!{!"bar"}}

!15 = !{ !9, !10, !8, !11}

!8 = distinct !DISubprogram(name: "foo", scope: !9)
!9 = !DIFile(filename: "path/to/file", directory: "/path/to/dir")

!10 = !DILexicalBlock(scope: !8, file: !9, line: 7, column: 35)

!11 = !DINamespace(name: "Namespace", scope: !10)