From c50491a797e94e65b9692ed05ff7536ee3df5b30 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 23 May 2011 20:27:23 +0000 Subject: 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. --- gdb/ChangeLog | 5 ++++ gdb/c-lang.c | 48 ++++++++++++++++++++++++++++++++++---- gdb/testsuite/ChangeLog | 6 +++++ gdb/testsuite/gdb.base/charset.c | 5 ++++ gdb/testsuite/gdb.base/charset.exp | 9 +++++++ 5 files changed, 69 insertions(+), 4 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 35f082f..56d1d5c 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-23 Doug Evans * python/lib/gdb/printing.py (register_pretty_printer): Add missing diff --git a/gdb/c-lang.c b/gdb/c-lang.c index ad770bf..255fabe 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 c043204..034a5fe 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-20 Pedro Alves Cope with async mode. diff --git a/gdb/testsuite/gdb.base/charset.c b/gdb/testsuite/gdb.base/charset.c index 644fe47..df56c45 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 ad0fec9..d87c769 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 -- cgit v1.1