summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2011-05-23 20:27:23 +0000
committerTom Tromey <tromey@redhat.com>2011-05-23 20:27:23 +0000
commitea68870f398e0fa9a88e939956d59cf1ee870d03 (patch)
treedb6ce50f645431d85bd8625dacc26197d7aee3c4
parent9f1cd1a2da4e10653cf8f6844d9b2e59a3b5226f (diff)
downloadgdb-ea68870f398e0fa9a88e939956d59cf1ee870d03.tar.gz
gdb
* 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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/c-lang.c48
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.base/charset.c5
-rw-r--r--gdb/testsuite/gdb.base/charset.exp9
5 files changed, 69 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 35f082f9ea1..56d1d5c7b34 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index ad770bfca49..255fabe2bfd 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -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;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c043204a88a..034a5fe85a2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.base/charset.c b/gdb/testsuite/gdb.base/charset.c
index 644fe471a67..df56c451c7f 100644
--- a/gdb/testsuite/gdb.base/charset.c
+++ b/gdb/testsuite/gdb.base/charset.c
@@ -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,
diff --git a/gdb/testsuite/gdb.base/charset.exp b/gdb/testsuite/gdb.base/charset.exp
index ad0fec9d024..d87c7697b90 100644
--- a/gdb/testsuite/gdb.base/charset.exp
+++ b/gdb/testsuite/gdb.base/charset.exp
@@ -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