llvm/llvm/test/tools/llvm-debuginfo-analyzer/COFF/03-coff-incorrect-lexical-scope-typedef.test

; REQUIRES: x86-registered-target

; Test case 3 - Incorrect lexical scope for typedef.

; pr-44884.cpp
;  1  int bar(float Input) { return (int)Input; }
;  2
;  3  unsigned foo(char Param) {
;  4    typedef int INT;                // ** Definition for INT **
;  5    INT Value = Param;
;  6    {
;  7      typedef float FLOAT;          // ** Definition for FLOAT **
;  8      {
;  9        FLOAT Added = Value + Param;
; 10        Value = bar(Added);
; 11      }
; 12    }
; 13    return Value + Param;
; 14  }

; The lines 4 and 7 contains 2 typedefs, defined at different lexical
; scopes.

; The above test is used to illustrates a scope issue found in the
; Clang compiler.
; PR44884: https://bugs.llvm.org/show_bug.cgi?id=44884
; PR44229: https://github.com/llvm/llvm-project/issues/44229

; In the following logical views, we can see that the Clang compiler
; emits both typedefs at the same lexical scope (3), which is wrong.
; GCC and MSVC emit correct lexical scope for both typedefs.

; RUN: llvm-debuginfo-analyzer --attribute=level,format,producer \
; RUN:                         --output-sort=kind \
; RUN:                         --print=symbols,types,lines \
; RUN:                         %p/Inputs/pr-44884-codeview-clang.o \
; RUN:                         %p/Inputs/pr-44884-codeview-msvc.o 2>&1 | \
; RUN: FileCheck --strict-whitespace -check-prefix=ONE %s

; ONE:      Logical View:
; ONE-NEXT: [000]           {File} 'pr-44884-codeview-clang.o' -> COFF-x86-64
; ONE-EMPTY:
; ONE-NEXT: [001]             {CompileUnit} 'pr-44884.cpp'
; ONE-NEXT: [002]               {Producer} 'clang version 15.0.0 {{.*}}'
; ONE-NEXT: [002]               {Function} extern not_inlined 'bar' -> 'int'
; ONE-NEXT: [003]                 {Parameter} 'Input' -> 'float'
; ONE-NEXT: [003]     1           {Line}
; ONE-NEXT: [002]               {Function} extern not_inlined 'foo' -> 'unsigned'
; ONE-NEXT: [003]                 {Block}
; ONE-NEXT: [004]                   {Variable} 'Added' -> 'float'
; ONE-NEXT: [004]     9             {Line}
; ONE-NEXT: [004]    10             {Line}
; ONE-NEXT: [003]                 {Parameter} 'Param' -> 'char'
; ONE-NEXT: [003]                 {TypeAlias} 'FLOAT' -> 'float'
; ONE-NEXT: [003]                 {TypeAlias} 'INT' -> 'int'
; ONE-NEXT: [003]                 {Variable} 'Value' -> 'int'
; ONE-NEXT: [003]     3           {Line}
; ONE-NEXT: [003]     5           {Line}
; ONE-NEXT: [003]    13           {Line}
; ONE-EMPTY:
; ONE-NEXT: Logical View:
; ONE-NEXT: [000]           {File} 'pr-44884-codeview-msvc.o' -> COFF-x86-64
; ONE-EMPTY:
; ONE-NEXT: [001]             {CompileUnit} 'pr-44884.cpp'
; ONE-NEXT: [002]               {Producer} 'Microsoft (R) Optimizing Compiler'
; ONE-NEXT: [002]               {Function} extern not_inlined 'bar' -> 'int'
; ONE-NEXT: [003]                 {Variable} 'Input' -> 'float'
; ONE-NEXT: [003]     1           {Line}
; ONE-NEXT: [002]               {Function} extern not_inlined 'foo' -> 'unsigned'
; ONE-NEXT: [003]                 {Block}
; ONE-NEXT: [004]                   {Block}
; ONE-NEXT: [005]                     {Variable} 'Added' -> 'float'
; ONE-NEXT: [004]                   {TypeAlias} 'FLOAT' -> 'float'
; ONE-NEXT: [004]     9             {Line}
; ONE-NEXT: [004]    10             {Line}
; ONE-NEXT: [003]                 {TypeAlias} 'INT' -> 'int'
; ONE-NEXT: [003]                 {Variable} 'Param' -> 'char'
; ONE-NEXT: [003]                 {Variable} 'Value' -> 'int'
; ONE-NEXT: [003]     3           {Line}
; ONE-NEXT: [003]     5           {Line}
; ONE-NEXT: [003]    13           {Line}
; ONE-NEXT: [003]    14           {Line}

; Using the selection facilities, we can produce a simple tabular
; output showing just the logical types that are 'Typedef'.

; RUN: llvm-debuginfo-analyzer --attribute=level,format \
; RUN:                         --output-sort=name \
; RUN:                         --select-types=Typedef \
; RUN:                         --report=list \
; RUN:                         --print=types \
; RUN:                         %p/Inputs/pr-44884-*.o 2>&1 | \
; RUN: FileCheck --strict-whitespace -check-prefix=TWO %s

; TWO:      Logical View:
; TWO-NEXT: [000]           {File} 'pr-44884-codeview-clang.o' -> COFF-x86-64
; TWO-EMPTY:
; TWO-NEXT: [001]           {CompileUnit} 'pr-44884.cpp'
; TWO-NEXT: [003]           {TypeAlias} 'FLOAT' -> 'float'
; TWO-NEXT: [003]           {TypeAlias} 'INT' -> 'int'
; TWO-EMPTY:
; TWO-NEXT: Logical View:
; TWO-NEXT: [000]           {File} 'pr-44884-codeview-msvc.o' -> COFF-x86-64
; TWO-EMPTY:
; TWO-NEXT: [001]           {CompileUnit} 'pr-44884.cpp'
; TWO-NEXT: [004]           {TypeAlias} 'FLOAT' -> 'float'
; TWO-NEXT: [003]           {TypeAlias} 'INT' -> 'int'