gdb: Print cv qualifiers if class attributes are substituted
authorChristina Schimpe <christina.schimpe@intel.com>
Tue, 16 Nov 2021 09:58:10 +0000 (10:58 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Fri, 19 Nov 2021 11:29:43 +0000 (11:29 +0000)
Make ptype print const/volatile qualifiers when template or typedef
attributes are substituted.

For a programm like
~~~
template<typename DataT>
class Cfoo
{
  typedef float myfloat;
public:
  DataT me0;
  const DataT me1=1;
  const myfloat me2=2.0;
};

int main()
{
  Cfoo<int> cfoo;
  return 0;
}
~~~

gdb outputs the following type for cfoo's attributes:

~~~
(gdb) b 14
Breakpoint 1 at 0x1170: file tmp.cc, line 14.
(gdb) run
Starting program: /tmp

Breakpoint 1, main () at tmp.cc:14
14        return 0;
(gdb) ptype cfoo
type = class Cfoo<int> [with DataT = int] {
  public:
    DataT me0;
    DataT me1;
    myfloat me2;

  private:
    typedef float myfloat;
}

~~~

The cv qualifiers (const in this case) are ignored for me1 and me2.

After:
~~~
(gdb) ptype cfoo
type = class Cfoo<int> [with DataT = int] {
  public:
    DataT me0;
    const DataT me1;
    const myfloat me2;

  private:
    typedef float myfloat;
}
~~~

gdb/ChangeLog:
2021-11-16  Christina Schimpe  <christina.schimpe@intel.com>

* gdb/c-typeprint.c: Print cv qualifiers in case of parameter
  substitution.

gdb/testsuite/ChangeLog:
2021-11-16  Christina Schimpe  <christina.schimpe@intel.com>

* gdb.cp/templates.cc:  New template class Cfoo with const,
  template, typdef and integer attributes.
* gdb.cp/templates.exp: Add new test using ptype and ptype/r
  commmands for template class CFoo.

gdb/c-typeprint.c
gdb/testsuite/gdb.cp/templates.cc
gdb/testsuite/gdb.cp/templates.exp

index 5f20233c78ac0823c6ae702bbd557a8cb19116fb..a6228248e9ebd24efec1cf6ac5889c7365837257 100644 (file)
@@ -119,6 +119,7 @@ c_print_type_1 (struct type *type,
   code = type->code ();
   if (local_name != NULL)
     {
+      c_type_print_modifier (type, stream, 0, 1, language);
       fputs_filtered (local_name, stream);
       if (varstring != NULL && *varstring != '\0')
        fputs_filtered (" ", stream);
index d6120e2dd1c5b85884a57cafe1a7786653c5031b..d5b24af3a4ecc3b09182280f942699ac33596a90 100644 (file)
@@ -690,6 +690,18 @@ int gf2 (int a) {
 
 char string[3];
 
+// Template class with typedefs and const attributes.
+template<typename DataT>
+class Cfoo
+{
+  typedef float myfloat;
+public:
+  DataT me0;
+  const DataT me1=1;
+  const myfloat me2=2.0;
+  const int me3=0;
+};
+
 
 // Template for nested instantiations
 
@@ -778,6 +790,8 @@ int main()
   sic.spec ('c');
   siip.spec (&x);
 
+  Cfoo<double> cfoo;
+
   Garply<int> f;
   Garply<char> fc;
   f.x = 13;
index 8370beb95b5e508bd0bd11562b9341d2668176c3..5f0538d8d4b5db30f2ea80f73cddb450675a2f6c 100644 (file)
@@ -547,6 +547,42 @@ gdb_test_multiple "ptype/r siip" "ptype siip" {
     }
 }
 
+# Check cv qualifiers and substitute parameters.
+
+if {[test_compiler_info {clang-*}]} {
+       setup_kfail "llvm/52262 " "*-*-*"
+}
+gdb_test "ptype cfoo" [multi_line \
+"type = (class |)Cfoo<double> \\\[with DataT = double\\\] \\{" \
+  "\[ \t\]*public:" \
+    "\[ \t\]*DataT me0;" \
+    "\[ \t\]*const DataT me1;" \
+    "\[ \t\]*const myfloat me2;" \
+    "\[ \t\]*const int me3;" \
+    "" \
+  "\[ \t\]*private:" \
+    "\[ \t\]*typedef float myfloat;" \
+"\\}" \
+] "print type of cfoo"
+
+# Check cv qualifiers and do not substitute.
+
+if {[test_compiler_info {clang-*}]} {
+       setup_kfail "llvm/52262 " "*-*-*"
+}
+gdb_test "ptype/r cfoo" [multi_line \
+"type = (class |)Cfoo<double> \\{" \
+  "\[ \t\]*public:" \
+    "\[ \t\]*double me0;" \
+    "\[ \t\]*const double me1;" \
+    "\[ \t\]*const Cfoo<double>::myfloat me2;" \
+    "\[ \t\]*const int me3;" \
+    "" \
+  "\[ \t\]*private:" \
+    "\[ \t\]*typedef float myfloat;" \
+"\\}" \
+] "print raw type of cfoo"
+
 # pt Garply<int>
 
 gdb_test_multiple "ptype/r Garply<int>" "ptype Garply<int>" {