mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-01 11:59:27 +08:00
gdb: Print cv qualifiers if class attributes are substituted
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.
This commit is contained in:

committed by
Andrew Burgess

parent
d3ffd7f776
commit
999a4952a2
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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>" {
|
||||
|
Reference in New Issue
Block a user