18557ec5dSBrock Wyma // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -debug-info-kind=limited -S -emit-llvm -std=c++11 -o - %s | FileCheck --check-prefix LINUX %s
28557ec5dSBrock Wyma // RUN: %clang_cc1 -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -S -emit-llvm -std=c++11 -o - %s | FileCheck --check-prefix MSVC %s
38557ec5dSBrock Wyma 
main(int argc,char * argv[],char * arge[])48557ec5dSBrock Wyma int main(int argc, char* argv[], char* arge[]) {
58557ec5dSBrock Wyma   //
68557ec5dSBrock Wyma   // In CodeView, the LF_MFUNCTION entry for "bar()" refers to the forward
78557ec5dSBrock Wyma   // reference of the unnamed struct. Visual Studio requires a unique
88557ec5dSBrock Wyma   // identifier to match the LF_STRUCTURE forward reference to the definition.
98557ec5dSBrock Wyma   //
108557ec5dSBrock Wyma   struct { void bar() {} } one;
118557ec5dSBrock Wyma   //
128557ec5dSBrock Wyma   // LINUX:      !{{[0-9]+}} = !DILocalVariable(name: "one"
138557ec5dSBrock Wyma   // LINUX-SAME:     type: [[TYPE_OF_ONE:![0-9]+]]
148557ec5dSBrock Wyma   // LINUX-SAME:     )
158557ec5dSBrock Wyma   // LINUX:      [[TYPE_OF_ONE]] = distinct !DICompositeType(
168557ec5dSBrock Wyma   // LINUX-SAME:     tag: DW_TAG_structure_type
178557ec5dSBrock Wyma   // LINUX-NOT:      name:
188557ec5dSBrock Wyma   // LINUX-NOT:      identifier:
198557ec5dSBrock Wyma   // LINUX-SAME:     )
208557ec5dSBrock Wyma   //
218557ec5dSBrock Wyma   // MSVC:       !{{[0-9]+}} = !DILocalVariable(name: "one"
228557ec5dSBrock Wyma   // MSVC-SAME:      type: [[TYPE_OF_ONE:![0-9]+]]
238557ec5dSBrock Wyma   // MSVC-SAME:      )
248557ec5dSBrock Wyma   // MSVC:       [[TYPE_OF_ONE]] = distinct !DICompositeType
258557ec5dSBrock Wyma   // MSVC-SAME:      tag: DW_TAG_structure_type
268557ec5dSBrock Wyma   // MSVC-SAME:      name: "<unnamed-type-one>"
278557ec5dSBrock Wyma   // MSVC-SAME:      identifier: ".?AU<unnamed-type-one>@?1??main@@9@"
288557ec5dSBrock Wyma   // MSVC-SAME:      )
298557ec5dSBrock Wyma 
308557ec5dSBrock Wyma 
318557ec5dSBrock Wyma   // In CodeView, the LF_POINTER entry for "ptr2unnamed" refers to the forward
328557ec5dSBrock Wyma   // reference of the unnamed struct. Visual Studio requires a unique
338557ec5dSBrock Wyma   // identifier to match the LF_STRUCTURE forward reference to the definition.
348557ec5dSBrock Wyma   //
358557ec5dSBrock Wyma   struct { int bar; } two = { 42 };
368557ec5dSBrock Wyma   int decltype(two)::*ptr2unnamed = &decltype(two)::bar;
378557ec5dSBrock Wyma   //
388557ec5dSBrock Wyma   // LINUX:      !{{[0-9]+}} = !DILocalVariable(name: "two"
398557ec5dSBrock Wyma   // LINUX-SAME:     type: [[TYPE_OF_TWO:![0-9]+]]
408557ec5dSBrock Wyma   // LINUX-SAME:     )
418557ec5dSBrock Wyma   // LINUX:      [[TYPE_OF_TWO]] = distinct !DICompositeType(
428557ec5dSBrock Wyma   // LINUX-SAME:     tag: DW_TAG_structure_type
438557ec5dSBrock Wyma   // LINUX-NOT:      name:
448557ec5dSBrock Wyma   // LINUX-NOT:      identifier:
458557ec5dSBrock Wyma   // LINUX-SAME:     )
468557ec5dSBrock Wyma   //
478557ec5dSBrock Wyma   // MSVC:       !{{[0-9]+}} = !DILocalVariable(name: "two"
488557ec5dSBrock Wyma   // MSVC-SAME:      type: [[TYPE_OF_TWO:![0-9]+]]
498557ec5dSBrock Wyma   // MSVC-SAME:      )
508557ec5dSBrock Wyma   // MSVC:       [[TYPE_OF_TWO]] = distinct !DICompositeType
518557ec5dSBrock Wyma   // MSVC-SAME:      tag: DW_TAG_structure_type
528557ec5dSBrock Wyma   // MSVC-SAME:      name: "<unnamed-type-two>"
538557ec5dSBrock Wyma   // MSVC-SAME:      identifier: ".?AU<unnamed-type-two>@?2??main@@9@"
548557ec5dSBrock Wyma   // MSVC-SAME:      )
558557ec5dSBrock Wyma 
568557ec5dSBrock Wyma 
578557ec5dSBrock Wyma   // In DWARF, named structures which are not externally visibile do not
588557ec5dSBrock Wyma   // require an identifier.  In CodeView, named structures are given an
598557ec5dSBrock Wyma   // identifier.
608557ec5dSBrock Wyma   //
618557ec5dSBrock Wyma   struct named { int bar; int named::* p2mem; } three = { 42, &named::bar };
628557ec5dSBrock Wyma   //
638557ec5dSBrock Wyma   // LINUX:      !{{[0-9]+}} = !DILocalVariable(name: "three"
648557ec5dSBrock Wyma   // LINUX-SAME:     type: [[TYPE_OF_THREE:![0-9]+]]
658557ec5dSBrock Wyma   // LINUX-SAME:     )
668557ec5dSBrock Wyma   // LINUX:      [[TYPE_OF_THREE]] = distinct !DICompositeType(
678557ec5dSBrock Wyma   // LINUX-SAME:     tag: DW_TAG_structure_type
688557ec5dSBrock Wyma   // LINUX-SAME:     name: "named"
698557ec5dSBrock Wyma   // LINUX-NOT:      identifier:
708557ec5dSBrock Wyma   // LINUX-SAME:     )
718557ec5dSBrock Wyma   //
728557ec5dSBrock Wyma   // MSVC:       !{{[0-9]+}} = !DILocalVariable(name: "three"
738557ec5dSBrock Wyma   // MSVC-SAME:      type: [[TYPE_OF_THREE:![0-9]+]]
748557ec5dSBrock Wyma   // MSVC-SAME:      )
758557ec5dSBrock Wyma   // MSVC:       [[TYPE_OF_THREE]] = distinct !DICompositeType
768557ec5dSBrock Wyma   // MSVC-SAME:      tag: DW_TAG_structure_type
778557ec5dSBrock Wyma   // MSVC-SAME:      name: "named"
788557ec5dSBrock Wyma   // MSVC-SAME:      identifier: ".?AUnamed@?1??main@@9@"
798557ec5dSBrock Wyma   // MSVC-SAME:      )
808557ec5dSBrock Wyma 
818557ec5dSBrock Wyma 
828557ec5dSBrock Wyma   // In CodeView, the LF_MFUNCTION entry for the lambda "operator()" routine
838557ec5dSBrock Wyma   // refers to the forward reference of the unnamed LF_CLASS for the lambda.
848557ec5dSBrock Wyma   // Visual Studio requires a unique identifier to match the forward reference
858557ec5dSBrock Wyma   // of the LF_CLASS to its definition.
868557ec5dSBrock Wyma   //
878557ec5dSBrock Wyma   auto four = [argc](int i) -> int { return argc == i ? 1 : 0; };
888557ec5dSBrock Wyma   //
898557ec5dSBrock Wyma   // LINUX:      !{{[0-9]+}} = !DILocalVariable(name: "four"
908557ec5dSBrock Wyma   // LINUX-SAME:     type: [[TYPE_OF_FOUR:![0-9]+]]
918557ec5dSBrock Wyma   // LINUX-SAME:     )
928557ec5dSBrock Wyma   // LINUX:      [[TYPE_OF_FOUR]] = distinct !DICompositeType(
938557ec5dSBrock Wyma   // LINUX-SAME:     tag: DW_TAG_class_type
948557ec5dSBrock Wyma   // LINUX-NOT:      name:
958557ec5dSBrock Wyma   // LINUX-NOT:      identifier:
968557ec5dSBrock Wyma   // LINUX-SAME:     )
978557ec5dSBrock Wyma   //
988557ec5dSBrock Wyma   // MSVC:       !{{[0-9]+}} = !DILocalVariable(name: "four"
998557ec5dSBrock Wyma   // MSVC-SAME:      type: [[TYPE_OF_FOUR:![0-9]+]]
1008557ec5dSBrock Wyma   // MSVC-SAME:      )
1018557ec5dSBrock Wyma   // MSVC:       [[TYPE_OF_FOUR]] = distinct !DICompositeType
1028557ec5dSBrock Wyma   // MSVC-SAME:      tag: DW_TAG_class_type
103*d5f5deeeSAmy Huang   // MSVC-SAME:      name: "<lambda_0>"
1048557ec5dSBrock Wyma   // MSVC-SAME:      identifier: ".?AV<lambda_0>@?0??main@@9@"
1058557ec5dSBrock Wyma   // MSVC-SAME:      )
1068557ec5dSBrock Wyma 
1078557ec5dSBrock Wyma   return 0;
1088557ec5dSBrock Wyma }
109