This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: don't let CHECK_TYPEDEF yield a value


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:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]