gdb
authorTom Tromey <tromey@redhat.com>
Mon, 23 May 2011 20:27:23 +0000 (20:27 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 23 May 2011 20:27:23 +0000 (20:27 +0000)
* c-lang.c (evaluate_subexp_c): Use expect_type if it is not
NULL.
gdb/testsuite
* gdb.base/charset.exp (string_display): Add tests to assign to
arrays.
* gdb.base/charset.c (short_array, int_array, long_array): New.

gdb/ChangeLog
gdb/c-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/charset.c
gdb/testsuite/gdb.base/charset.exp

index 35f082f9ea1260220763f209dac1e0e7cf30064b..56d1d5c7b341ca96287450a17fa9f0bb5b1f0a5a 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-23  Tom Tromey  <tromey@redhat.com>
+
+       * c-lang.c (evaluate_subexp_c): Use expect_type if it is not
+       NULL.
+
 2011-05-23  Doug Evans  <dje@google.com>
 
        * python/lib/gdb/printing.py (register_pretty_printer): Add missing
index ad770bfca491135c3475265cc2105f5de4436e36..255fabe2bfdf1798695da0e96e6df3a4ecc8492b 100644 (file)
@@ -978,6 +978,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
        struct value *result;
        enum c_string_type dest_type;
        const char *dest_charset;
+       int satisfy_expected = 0;
 
        obstack_init (&output);
        cleanup = make_cleanup_obstack_free (&output);
@@ -1014,6 +1015,22 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
        /* Ensure TYPE_LENGTH is valid for TYPE.  */
        check_typedef (type);
 
+       /* If the caller expects an array of some integral type,
+          satisfy them.  If something odder is expected, rely on the
+          caller to cast.  */
+       if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_ARRAY)
+         {
+           struct type *element_type
+             = check_typedef (TYPE_TARGET_TYPE (expect_type));
+
+           if (TYPE_CODE (element_type) == TYPE_CODE_INT
+               || TYPE_CODE (element_type) == TYPE_CODE_CHAR)
+             {
+               type = element_type;
+               satisfy_expected = 1;
+             }
+         }
+
        dest_charset = charset_for_string_type (dest_type, exp->gdbarch);
 
        ++*pos;
@@ -1036,7 +1053,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
        if (noside == EVAL_SKIP)
          {
            /* Return a dummy value of the appropriate type.  */
-           if ((dest_type & C_CHAR) != 0)
+           if (expect_type != NULL)
+             result = allocate_value (expect_type);
+           else if ((dest_type & C_CHAR) != 0)
              result = allocate_value (type);
            else
              result = value_cstring ("", 0, type);
@@ -1061,9 +1080,30 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
            /* Write the terminating character.  */
            for (i = 0; i < TYPE_LENGTH (type); ++i)
              obstack_1grow (&output, 0);
-           result = value_cstring (obstack_base (&output),
-                                   obstack_object_size (&output),
-                                   type);
+
+           if (satisfy_expected)
+             {
+               LONGEST low_bound, high_bound;
+               int element_size = TYPE_LENGTH (type);
+
+               if (get_discrete_bounds (TYPE_INDEX_TYPE (expect_type),
+                                        &low_bound, &high_bound) < 0)
+                 {
+                   low_bound = 0;
+                   high_bound = (TYPE_LENGTH (expect_type) / element_size) - 1;
+                 }
+               if (obstack_object_size (&output) / element_size
+                   > (high_bound - low_bound + 1))
+                 error (_("Too many array elements"));
+
+               result = allocate_value (expect_type);
+               memcpy (value_contents_raw (result), obstack_base (&output),
+                       obstack_object_size (&output));
+             }
+           else
+             result = value_cstring (obstack_base (&output),
+                                     obstack_object_size (&output),
+                                     type);
          }
        do_cleanups (cleanup);
        return result;
index c043204a88a1644e47e223b9efe79271b17979e7..034a5fe85a2f4c3346429c1a2c8063598c05a395 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-23  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.base/charset.exp (string_display): Add tests to assign to
+       arrays.
+       * gdb.base/charset.c (short_array, int_array, long_array): New.
+
 2011-05-20  Pedro Alves  <pedro@codesourcery.com>
 
        Cope with async mode.
index 644fe471a6729f932f8c7430dbb2fa505b7f676a..df56c451c7fab11921ca620945221f49d35615e3 100644 (file)
@@ -73,6 +73,11 @@ char32_t *String32;
 typedef wchar_t my_wchar_t;
 my_wchar_t myvar;
 
+/* Some arrays for simple assignment tests.  */
+short short_array[3];
+int int_array[3];
+long long_array[3];
+
 void
 init_string (char string[],
              char x,
index ad0fec9d0248052198bbd1a043ebd1e1d5d5b7b2..d87c7697b901f77b3dc6b85cd96c5e216cbea474 100644 (file)
@@ -625,4 +625,13 @@ if {$wchar_size == 4} {
 }
 
 
+foreach name {short int long} {
+    # We're really just checking to make sure this doesn't give an
+    # error.
+    gdb_test "print ${name}_array = \"hi\"" \
+       " = {.*}" \
+       "assign string to $name array"
+}
+
+
 gdb_exit