Record and output access specifiers for nested typedefs
authorKeith Seitz <keiths@redhat.com>
Tue, 17 Oct 2017 00:19:29 +0000 (17:19 -0700)
committerKeith Seitz <keiths@redhat.com>
Tue, 17 Oct 2017 00:19:29 +0000 (17:19 -0700)
commitc191a6875b118fce30e7dc4d9e4bd20eff850270
tree0561f5ba1e0a654aa2cd9f6036090215d2d47175
parent087ce8fa0249fa0167a73f25be51e12fb1a2b336
Record and output access specifiers for nested typedefs

We currently do not record access information for typedefs defined inside
classes.  Consider:

struct foo
{
   typedef int PUBLIC;
 private:
   typedef int PRIVATE;
   PRIVATE b;
};

(gdb) ptype foo
type = struct foo {
  private:
    PRIVATE b;

    typedef int PRIVATE;
    typedef int PUBLIC;
}

This patch fixes this:

(gdb) ptype foo
type = struct foo {
  private:
    PRIVATE b;

    typedef int PRIVATE;
  public:
    typedef int PUBLIC;
}

gdb/ChangeLog:

* c-typeprint.c (enum access_specifier): Moved here from
c_type_print_base.
(output_access_specifier): New function.
(c_type_print_base): Consider typedefs when assessing
whether access labels are needed.
Use output_access_specifier as needed.
Output access specifier for typedefs, if needed.
* dwarf2read.c (dwarf2_add_typedef): Record DW_AT_accessibility.
* gdbtypes.h (struct typedef_field) <is_protected, is_private>: New
fields.
(TYPE_TYPEDEF_FIELD_PROTECTED, TYPE_TYPEDEF_FIELD_PRIVATE): New
accessor macros.

gdb/testsuite/ChangeLog:

* gdb.cp/classes.cc (class_with_typedefs, class_with_public_typedef)
(class_with_protected_typedef, class_with_private_typedef)
(struct_with_public_typedef, struct_with_protected_typedef)
(struct_with_private_typedef): New classes/structs.
* gdb.cp/classes.exp (test_ptype_class_objects): Add tests for
typedefs and access specifiers.
gdb/c-typeprint.c
gdb/dwarf2read.c
gdb/gdbtypes.h
gdb/testsuite/gdb.cp/classes.cc
gdb/testsuite/gdb.cp/classes.exp