This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFC: don't let CHECK_TYPEDEF yield a value
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 25 Mar 2009 13:43:27 -0600
- Subject: RFC: don't let CHECK_TYPEDEF yield a value
- Reply-to: tromey at redhat dot com
While reading stack.c I noticed this code:
type = CHECK_TYPEDEF (SYMBOL_TYPE (sym));
while (TYPE_CODE (type) == TYPE_CODE_REF)
type = CHECK_TYPEDEF (TYPE_TARGET_TYPE (type));
Because CHECK_TYPEDEF side-effects its argument, this can change the
type of a symbol. That seems like a bug to me.
I thought perhaps CHECK_TYPEDEF would be safer if it were explicitly a
statement, that is, if it could not yield a value. This does not make
it completely safe, but it does help emphasize the difference between
CHECK_TYPEDEF and check_typedef.
All the other CHECK_TYPEDEF calls appear to be safe.
Built and regtested on x86-64 (compile farm).
Let me know what you think.
Tom
2009-03-25 Tom Tromey <tromey@redhat.com>
* gdbtypes.h (CHECK_TYPEDEF): Don't yield a value.
* stack.c (print_this_frame_argument_p): Use check_typedef.
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 816a208..3c4e948 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -1185,7 +1185,10 @@ extern struct type *lookup_signed_typename (char *);
extern struct type *check_typedef (struct type *);
-#define CHECK_TYPEDEF(TYPE) (TYPE) = check_typedef (TYPE)
+#define CHECK_TYPEDEF(TYPE) \
+ do { \
+ (TYPE) = check_typedef (TYPE); \
+ } while (0)
extern void check_stub_method_group (struct type *, int);
diff --git a/gdb/stack.c b/gdb/stack.c
index f185841..c780348 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -181,9 +181,9 @@ print_this_frame_argument_p (struct symbol *sym)
/* The user asked to print only the scalar arguments, so do not
print the non-scalar ones. */
- type = CHECK_TYPEDEF (SYMBOL_TYPE (sym));
+ type = check_typedef (SYMBOL_TYPE (sym));
while (TYPE_CODE (type) == TYPE_CODE_REF)
- type = CHECK_TYPEDEF (TYPE_TARGET_TYPE (type));
+ type = check_typedef (TYPE_TARGET_TYPE (type));
switch (TYPE_CODE (type))
{
case TYPE_CODE_ARRAY: