From: Tom Tromey Date: Mon, 23 May 2011 20:24:27 +0000 (+0000) Subject: gdb X-Git-Tag: gdb_7_3-2011-07-26-release~100 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7460c1c2216cbde6db99de638adc8adafc43ecd;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ac20ff8f84b..32b4559b760 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-05-23 Tom Tromey + + * c-lang.c (evaluate_subexp_c): Use expect_type if it is not + NULL. + 2011-05-20 Pedro Alves * tracepoint.c: Include exceptions.h. 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 a264e49d8ca..f90fd156b12 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-05-23 Tom Tromey + + * 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-17 Joel Brobecker * gdb.ada/arrayptr/foo.adb: Add access to constrained array. 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 4e4cf09bb5c..b558bb27d54 100644 --- a/gdb/testsuite/gdb.base/charset.exp +++ b/gdb/testsuite/gdb.base/charset.exp @@ -617,4 +617,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