diff options
author | Giuliano Procida <gprocida@google.com> | 2024-01-09 15:20:16 +0000 |
---|---|---|
committer | Giuliano Procida <gprocida@google.com> | 2024-02-09 12:50:12 +0000 |
commit | 076c015b073efc6bc131b555c2a39e2ddfc07701 (patch) | |
tree | b117b11ffad71d732c48aa9d41eb1ddce9cc5457 | |
parent | 0b672c187f86da91958e783c8d0695c2b4dba0a1 (diff) | |
download | stg-076c015b073efc6bc131b555c2a39e2ddfc07701.tar.gz |
test cases: add template value parameter test
C++ admits many kinds of template value parameters, not all of which are
well represented or represented at all in DWARF. There is also no
standard naming for these parameters.
This test exercises compiler DWARF generation. It is also a prerequisite
for experimenting with `clang -gsimple-template-names`.
PiperOrigin-RevId: 596925206
Change-Id: If3f7c0ce9043730b5629c0e159d28be2793da966
-rw-r--r-- | test_cases/info_tests/template/expected/value_parameter_cc.elf_stg | 231 | ||||
-rw-r--r-- | test_cases/info_tests/template/value_parameter.cc | 41 |
2 files changed, 272 insertions, 0 deletions
diff --git a/test_cases/info_tests/template/expected/value_parameter_cc.elf_stg b/test_cases/info_tests/template/expected/value_parameter_cc.elf_stg new file mode 100644 index 0000000..24f9d2d --- /dev/null +++ b/test_cases/info_tests/template/expected/value_parameter_cc.elf_stg @@ -0,0 +1,231 @@ +version: 0x00000002 +root_id: 0x84ea5130 +special { + id: 0x48b5725f + kind: VOID +} +pointer_reference { + id: 0xc3b63b14 + kind: LVALUE_REFERENCE + pointee_type_id: 0x10985193 +} +pointer_reference { + id: 0xf6e6592a + kind: LVALUE_REFERENCE + pointee_type_id: 0xc5d9d969 +} +qualified { + id: 0xc5d9d969 + qualifier: CONST + qualified_type_id: 0x6720d32f +} +primitive { + id: 0x6720d32f + name: "int" + encoding: SIGNED_INTEGER + bytesize: 0x00000004 +} +struct_union { + id: 0x04d4366e + kind: STRUCT + name: "S<&H::i2>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x8fd5ff58 + kind: STRUCT + name: "S<&H::j2>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0xe4d3d1c9 + kind: STRUCT + name: "S<&a>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x3a75138f + kind: STRUCT + name: "S<&d>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x31dac610 + kind: STRUCT + name: "S<&e>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x54943dbe + kind: STRUCT + name: "S<\'p\'>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x2119c209 + kind: STRUCT + name: "S<(K)0>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x3bb4a383 + kind: STRUCT + name: "S<15>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x0e0f27de + kind: STRUCT + name: "S<4>" + definition { + bytesize: 1 + } +} +struct_union { + id: 0x0257c3b9 + kind: STRUCT + name: "S<nullptr>" + definition { + bytesize: 1 + } +} +function { + id: 0x10985193 + return_type_id: 0x48b5725f +} +elf_symbol { + id: 0x65e66866 + name: "_Z1ev" + is_defined: true + symbol_type: FUNCTION + type_id: 0x10985193 + full_name: "e" +} +elf_symbol { + id: 0x2230fb28 + name: "c" + is_defined: true + symbol_type: OBJECT + type_id: 0xf6e6592a + full_name: "c" +} +elf_symbol { + id: 0xe0778f95 + name: "f" + is_defined: true + symbol_type: OBJECT + type_id: 0xc3b63b14 + full_name: "f" +} +elf_symbol { + id: 0xea07c015 + name: "v_char" + is_defined: true + symbol_type: OBJECT + type_id: 0x54943dbe + full_name: "v_char" +} +elf_symbol { + id: 0xc31d4af7 + name: "v_enumerator" + is_defined: true + symbol_type: OBJECT + type_id: 0x2119c209 + full_name: "v_enumerator" +} +elf_symbol { + id: 0x87e5aa8a + name: "v_function_pointer" + is_defined: true + symbol_type: OBJECT + type_id: 0x3a75138f + full_name: "v_function_pointer" +} +elf_symbol { + id: 0x2c4cacfa + name: "v_function_reference" + is_defined: true + symbol_type: OBJECT + type_id: 0x31dac610 + full_name: "v_function_reference" +} +elf_symbol { + id: 0x40715147 + name: "v_int" + is_defined: true + symbol_type: OBJECT + type_id: 0x3bb4a383 + full_name: "v_int" +} +elf_symbol { + id: 0x575714fe + name: "v_int_pointer" + is_defined: true + symbol_type: OBJECT + type_id: 0xe4d3d1c9 + full_name: "v_int_pointer" +} +elf_symbol { + id: 0xe323633f + name: "v_int_reference" + is_defined: true + symbol_type: OBJECT + type_id: 0x0e0f27de + full_name: "v_int_reference" +} +elf_symbol { + id: 0x481dfc0e + name: "v_nullptr" + is_defined: true + symbol_type: OBJECT + type_id: 0x0257c3b9 + full_name: "v_nullptr" +} +elf_symbol { + id: 0xcb9e41aa + name: "v_pointer_to_member" + is_defined: true + symbol_type: OBJECT + type_id: 0x04d4366e + full_name: "v_pointer_to_member" +} +elf_symbol { + id: 0x3dc86173 + name: "v_pointer_to_method" + is_defined: true + symbol_type: OBJECT + type_id: 0x8fd5ff58 + full_name: "v_pointer_to_method" +} +interface { + id: 0x84ea5130 + symbol_id: 0x65e66866 + symbol_id: 0x2230fb28 + symbol_id: 0xe0778f95 + symbol_id: 0xea07c015 + symbol_id: 0xc31d4af7 + symbol_id: 0x87e5aa8a + symbol_id: 0x2c4cacfa + symbol_id: 0x40715147 + symbol_id: 0x575714fe + symbol_id: 0xe323633f + symbol_id: 0x481dfc0e + symbol_id: 0xcb9e41aa + symbol_id: 0x3dc86173 +} diff --git a/test_cases/info_tests/template/value_parameter.cc b/test_cases/info_tests/template/value_parameter.cc new file mode 100644 index 0000000..3aa7b1f --- /dev/null +++ b/test_cases/info_tests/template/value_parameter.cc @@ -0,0 +1,41 @@ +template<auto V> struct S {}; + +S<15> v_int; +S<'p'> v_char; +// Not supported by Clang yet. +//S<4.2> v_double; + +extern const int a; +S<&a> v_int_pointer; + +const int b = 4; +const int& c = b; +S<c> v_int_reference; + +extern void d(); +S<&d> v_function_pointer; + +void e() {} +void (&f)() = e; +S<f> v_function_reference; + +struct H { + int i1; + int i2; + void j1(); + void j2(); +}; +S<&H::i2> v_pointer_to_member; +S<&H::j2> v_pointer_to_method; + +enum class K { l }; +S<K::l> v_enumerator; + +S<nullptr> v_nullptr; + +// C++20 only. +//int m[2] = { 10, 4 }; +//S<&(m[1])> v_pointer_to_subobject; + +// C++20 only and cannot appear in ABI anyway. +//S<[](){}> v_lambda; |