Re: [PATCH] Fix mi "-var-create" regression

Luis Machado
2012-10-15T12:21:09Z

[-- Attachment #1: Type: text/plain, Size: 1657 bytes --]

On 10/14/2012 02:18 PM, Joel Brobecker wrote:
> I don't feel entirely comfortable approving this patch, not because
> I think it's iffy, but just because I don't have a good knowledge
> of what is going on for you (RTTI is C++, and I don't follow C++
> support). If no one else has the time to officially review your patch
> within the next week or so, I will take a deeper look. It does look
> reasonable.
>

The biggest problem caused by this regression is the breakage of
information sent to IDEs based on MI output, as Marc pointed out.

Eclipse, for example, will attempt to list registers and gdb will end up
throwing these errors, causing eclipse to get all confused when trying
to display the register values.

This is more about a regression of a generic gdb feature than a fix to a
C++ feature.

> I did notice a couple of things (besides the unnecessary parens):
>
>> - if (TYPE_CODE (result) == TYPE_CODE_PTR
>> + /* If result's target type is TYPE_CODE_VOID, do not try fetching its rtti
>> + type. GDB will try to dereference the void pointer and will throw an
>> + error when trying to do so. */
>
> Can you reformat the comment to fit within 70 characters. That's the
> soft line limit...
>

Fixed.

>> + if ((TYPE_CODE (result) == TYPE_CODE_PTR
>> || TYPE_CODE (result) == TYPE_CODE_REF)
>> + && ((TYPE_TARGET_TYPE (result) != NULL)
>> + && TYPE_CODE (TYPE_TARGET_TYPE (result)) != TYPE_CODE_VOID))
>
> I don't think that you need to test for the TYPE_TARGET_TYPE, since
> you already know that it's either a PTR or REF type, which always
> have a TARGET_TYPE.
>

Well spotted. I fixed this now.

Thanks,
Luis

[-- Attachment #2: rtti-print-object.diff --]
[-- Type: text/x-patch, Size: 905 bytes --]

2012-10-15 Luis Machado <lgustavo@codesourcery.com>

* value.c (value_actual_type): Check for TYPE_CODE_VOID
target types.

Index: gdb/gdb/value.c
===================================================================
--- gdb.orig/gdb/value.c 2012-10-10 16:54:36.048188274 -0300
+++ gdb/gdb/value.c 2012-10-14 21:41:22.997797277 -0300
@@ -850,8 +850,13 @@ value_actual_type (struct value *value,
result = value_type (value);
if (opts.objectprint)
{
- if (TYPE_CODE (result) == TYPE_CODE_PTR
+ /* If result's target type is TYPE_CODE_VOID, do not try
+ fetching its rtti type. GDB will try to dereference
+ the void pointer and will throw an error when trying to
+ do so. */
+ if ((TYPE_CODE (result) == TYPE_CODE_PTR
|| TYPE_CODE (result) == TYPE_CODE_REF)
+ && TYPE_CODE (TYPE_TARGET_TYPE (result)) != TYPE_CODE_VOID)
{
struct type *real_type;