diff options
author | Tom Tromey <tromey@redhat.com> | 2011-05-23 20:27:23 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2011-05-23 20:27:23 +0000 |
commit | ea68870f398e0fa9a88e939956d59cf1ee870d03 (patch) | |
tree | db6ce50f645431d85bd8625dacc26197d7aee3c4 | |
parent | 9f1cd1a2da4e10653cf8f6844d9b2e59a3b5226f (diff) | |
download | gdb-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/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/c-lang.c | 48 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/charset.c | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/charset.exp | 9 |
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 |