diff options
author | Pavel Labath <pavel@labath.sk> | 2024-06-06 15:39:30 +0000 |
---|---|---|
committer | Pavel Labath <pavel@labath.sk> | 2024-06-06 16:10:22 +0000 |
commit | de3f1b6d68ab8a0e827db84b328803857a4f60df (patch) | |
tree | ad71c7297f4771e9ea6dc33f32fb4cf36e2294f2 | |
parent | 7fdbc30b445286f03203e16d0be067c25c6f0df0 (diff) | |
download | llvm-de3f1b6d68ab8a0e827db84b328803857a4f60df.zip llvm-de3f1b6d68ab8a0e827db84b328803857a4f60df.tar.gz llvm-de3f1b6d68ab8a0e827db84b328803857a4f60df.tar.bz2 |
[lldb] Test case for the bug in #92328
-rw-r--r-- | lldb/test/Shell/SymbolFile/DWARF/x86/simple-template-names-context.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lldb/test/Shell/SymbolFile/DWARF/x86/simple-template-names-context.cpp b/lldb/test/Shell/SymbolFile/DWARF/x86/simple-template-names-context.cpp new file mode 100644 index 0000000..a8a4d3b --- /dev/null +++ b/lldb/test/Shell/SymbolFile/DWARF/x86/simple-template-names-context.cpp @@ -0,0 +1,44 @@ +// Test that we can correctly resolve forward declared types when they only +// differ in the template arguments of the surrounding context. The reproducer +// is sensitive to the order of declarations, so we test in both directions. + +// REQUIRES: lld + +// RUN: %clang --target=x86_64-pc-linux -c %s -o %t-a.o -g -gsimple-template-names -DFILE_A +// RUN: %clang --target=x86_64-pc-linux -c %s -o %t-b.o -g -gsimple-template-names -DFILE_B +// RUN: ld.lld %t-a.o %t-b.o -o %t +// RUN: %lldb %t -o "target variable --ptr-depth 1 --show-types both_a both_b" -o exit | FileCheck %s + +// CHECK: (lldb) target variable +// CHECK-NEXT: (ReferencesBoth<'A'>) both_a = { +// CHECK-NEXT: (Outer<'A'>::Inner *) a = 0x{{[0-9A-Fa-f]*}} {} +// CHECK-NEXT: (Outer<'A'>::Inner *) b = 0x{{[0-9A-Fa-f]*}} {} +// CHECK-NEXT: } +// CHECK-NEXT: (ReferencesBoth<'B'>) both_b = { +// CHECK-NEXT: (Outer<'A'>::Inner *) a = 0x{{[0-9A-Fa-f]*}} {} +// CHECK-NEXT: (Outer<'B'>::Inner *) b = 0x{{[0-9A-Fa-f]*}} {} +// CHECK-NEXT: } + +template<char C> +struct Outer { + struct Inner {}; +}; + +template<char C> +struct ReferencesBoth { + Outer<'A'>::Inner *a; + Outer<'B'>::Inner *b; +}; + +#ifdef FILE_A +Outer<'A'>::Inner inner_a; +extern Outer<'B'>::Inner inner_b; + +ReferencesBoth<'A'> both_a{&inner_a, &inner_b}; + +#else +extern Outer<'A'>::Inner inner_a; +Outer<'B'>::Inner inner_b; + +ReferencesBoth<'B'> both_b{&inner_a, &inner_b}; +#endif |