aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuliano Procida <gprocida@google.com>2024-01-09 15:20:16 +0000
committerGiuliano Procida <gprocida@google.com>2024-02-09 12:50:12 +0000
commit076c015b073efc6bc131b555c2a39e2ddfc07701 (patch)
treeb117b11ffad71d732c48aa9d41eb1ddce9cc5457
parent0b672c187f86da91958e783c8d0695c2b4dba0a1 (diff)
downloadstg-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_stg231
-rw-r--r--test_cases/info_tests/template/value_parameter.cc41
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;