diff options
author | Tom Tromey <tom@tromey.com> | 2020-03-13 17:39:52 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-03-13 18:03:39 -0600 |
commit | a1f6a07c3d1d3a34d36d4e49f0fd3c66554e41b2 (patch) | |
tree | 0903e61b62d8cfc09a77c4198f21672fa577d2d2 /gdb/c-valprint.c | |
parent | 410cf315014145f169c146442e9c28163d9ae10a (diff) | |
download | gdb-a1f6a07c3d1d3a34d36d4e49f0fd3c66554e41b2.zip gdb-a1f6a07c3d1d3a34d36d4e49f0fd3c66554e41b2.tar.gz gdb-a1f6a07c3d1d3a34d36d4e49f0fd3c66554e41b2.tar.bz2 |
Use common_val_print in c-valprint.c
This changes c_value_print to call common_val_print. This is more
complicated than the usual sort of common_val_print change, due to the
handling of RTTI.
gdb/ChangeLog
2020-03-13 Tom Tromey <tom@tromey.com>
* c-valprint.c (c_value_print): Use common_val_print.
gdb/testsuite/ChangeLog
2020-03-13 Tom Tromey <tom@tromey.com>
* gdb.base/printcmds.exp (test_print_strings): Add regression
test.
* gdb.base/printcmds.c (charptr): New typedef.
(teststring2): New global.
Diffstat (limited to 'gdb/c-valprint.c')
-rw-r--r-- | gdb/c-valprint.c | 57 |
1 files changed, 20 insertions, 37 deletions
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index 157ffd7..759ab43 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -567,7 +567,7 @@ void c_value_print (struct value *val, struct ui_file *stream, const struct value_print_options *options) { - struct type *type, *real_type, *val_type; + struct type *type, *real_type; int full, using_enc; LONGEST top; struct value_print_options opts = *options; @@ -581,24 +581,22 @@ c_value_print (struct value *val, struct ui_file *stream, C++: if it is a member pointer, we will take care of that when we print it. */ - /* Preserve the original type before stripping typedefs. We prefer - to pass down the original type when possible, but for local - checks it is better to look past the typedefs. */ - val_type = value_type (val); - type = check_typedef (val_type); + type = check_typedef (value_type (val)); if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type)) { + struct type *original_type = value_type (val); + /* Hack: remove (char *) for char strings. Their type is indicated by the quoted string anyway. (Don't use c_textual_element_type here; quoted strings are always exactly (char *), (wchar_t *), or the like. */ - if (TYPE_CODE (val_type) == TYPE_CODE_PTR - && TYPE_NAME (val_type) == NULL - && TYPE_NAME (TYPE_TARGET_TYPE (val_type)) != NULL - && (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (val_type)), + if (TYPE_CODE (original_type) == TYPE_CODE_PTR + && TYPE_NAME (original_type) == NULL + && TYPE_NAME (TYPE_TARGET_TYPE (original_type)) != NULL + && (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (original_type)), "char") == 0 - || textual_name (TYPE_NAME (TYPE_TARGET_TYPE (val_type))))) + || textual_name (TYPE_NAME (TYPE_TARGET_TYPE (original_type))))) { /* Print nothing. */ } @@ -624,7 +622,6 @@ c_value_print (struct value *val, struct ui_file *stream, if (real_type) { /* RTTI entry found. */ - type = real_type; /* Need to adjust pointer value. */ val = value_from_pointer (real_type, @@ -637,14 +634,11 @@ c_value_print (struct value *val, struct ui_file *stream, } if (is_ref) - { - val = value_ref (value_ind (val), refcode); - type = value_type (val); - } + val = value_ref (value_ind (val), refcode); + type = value_type (val); type_print (type, "", stream, -1); fprintf_filtered (stream, ") "); - val_type = type; } else { @@ -667,36 +661,25 @@ c_value_print (struct value *val, struct ui_file *stream, /* We have RTTI information, so use it. */ val = value_full_object (val, real_type, full, top, using_enc); + /* In a destructor we might see a real type that is a + superclass of the object's type. In this case it is + better to leave the object as-is. */ + if (!(full + && (TYPE_LENGTH (real_type) + < TYPE_LENGTH (value_enclosing_type (val))))) + val = value_cast (real_type, val); fprintf_filtered (stream, "(%s%s) ", TYPE_NAME (real_type), full ? "" : _(" [incomplete object]")); - /* Print out object: enclosing type is same as real_type if - full. */ - val_print (value_enclosing_type (val), - 0, - value_address (val), stream, 0, - val, &opts, current_language); - return; - /* Note: When we look up RTTI entries, we don't get any - information on const or volatile attributes. */ } else if (type != check_typedef (value_enclosing_type (val))) { /* No RTTI information, so let's do our best. */ fprintf_filtered (stream, "(%s ?) ", TYPE_NAME (value_enclosing_type (val))); - val_print (value_enclosing_type (val), - 0, - value_address (val), stream, 0, - val, &opts, current_language); - return; + val = value_cast (value_enclosing_type (val), val); } - /* Otherwise, we end up at the return outside this "if". */ } - val_print (val_type, - value_embedded_offset (val), - value_address (val), - stream, 0, - val, &opts, current_language); + common_val_print (val, stream, 0, &opts, current_language); } |