diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/whatis-ptype-typedefs.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp | 39 |
3 files changed, 57 insertions, 3 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 12938e7..fa329b4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2017-11-20 Pedro Alves <palves@redhat.com> + + * gdb.base/whatis-ptype-typedefs.c (double_typedef) + (long_double_typedef): New typedefs. + Use DEF on double and long double. + * gdb.base/whatis-ptype-typedefs.exp: Add double and long double + cases. + (run_tests): New 'float_ptr_same_size', 'double_ptr_same_size', + and 'long_double_ptr_same_size' locals. Use them to decide + whether cast from array/function to float is valid/invalid. + 2017-11-17 Tom Tromey <tom@tromey.com> * gdb.rust/traits.rs: New file. diff --git a/gdb/testsuite/gdb.base/whatis-ptype-typedefs.c b/gdb/testsuite/gdb.base/whatis-ptype-typedefs.c index 5711a96..35c7279 100644 --- a/gdb/testsuite/gdb.base/whatis-ptype-typedefs.c +++ b/gdb/testsuite/gdb.base/whatis-ptype-typedefs.c @@ -56,6 +56,16 @@ DEF (int); typedef float float_typedef; DEF (float); +/* Double floats. */ + +typedef double double_typedef; +DEF (double); + +/* Long doubles. */ + +typedef long double long_double_typedef; +DEF (long_double); + /* Enums. */ typedef enum colors {red, green, blue} colors_typedef; diff --git a/gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp b/gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp index d333d81..ea0ef6c 100644 --- a/gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp +++ b/gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp @@ -92,6 +92,16 @@ set table { {"v_float_typedef" "float_typedef" "float"} {"v_float_typedef2" "float_typedef2" "float"} + {"double_typedef" "double" "double"} + {"double_typedef2" "double_typedef" "double"} + {"v_double_typedef" "double_typedef" "double"} + {"v_double_typedef2" "double_typedef2" "double"} + + {"long_double_typedef" "long double" "long double"} + {"long_double_typedef2" "long_double_typedef" "long double"} + {"v_long_double_typedef" "long_double_typedef" "long double"} + {"v_long_double_typedef2" "long_double_typedef2" "long double"} + {"colors_typedef" "(enum )?colors" "enum colors( : unsigned int)? {red, green, blue}"} {"colors_typedef2" "colors_typedef" "enum colors( : unsigned int)? {red, green, blue}"} {"v_colors_typedef" "colors_typedef" "enum colors( : unsigned int)? {red, green, blue}"} @@ -199,6 +209,22 @@ proc run_tests {lang} { } } + # If floats and pointers have the same size on this architecture, + # then casting from array/function to float works, because + # arrays/functions first decay to pointers, and then GDB's cast is + # more general than a C cast and accepts any two types of the same + # length. + set float_ptr_same_size \ + [get_integer_valueof "sizeof (float) == sizeof (void *)" -1] + + # Ditto double. + set double_ptr_same_size \ + [get_integer_valueof "sizeof (double) == sizeof (void *)" -1] + + # Ditto long double. + set long_double_ptr_same_size \ + [get_integer_valueof "sizeof (long double) == sizeof (void *)" -1] + # Test converting/casting all variables in the first column of the # table to all types (found in the first column of the table). # The aggregates are all defined to be the same size so that @@ -230,7 +256,7 @@ proc run_tests {lang} { # regression making them inadvertently valid. For # example, these convertions are invalid: # - # float <-> array + # float <-> array [iff sizeof pointer != sizeof float] # array -> function (not function pointer) # array -> member_ptr # @@ -247,8 +273,15 @@ proc run_tests {lang} { gdb_test "whatis ($to) $from" "syntax error.*" "whatis ($to) $from (syntax)" gdb_test "ptype ($to) $from" "syntax error.*" "ptype ($to) $from (syntax)" } elseif {([string match "*float*" $from] && [string match "*array*" $to]) - || ([string match "float*" $to] && [string match "*array*" $from]) - || ([string match "float*" $to] && [string match "*method" $from]) + || (!$float_ptr_same_size + && ([string match "float*" $to] && [string match "*array*" $from] + || [string match "float*" $to] && [string match "*method" $from])) + || (!$double_ptr_same_size + && ([string match "double*" $to] && [string match "*array*" $from] + || [string match "double*" $to] && [string match "*method" $from])) + || (!$long_double_ptr_same_size + && ([string match "long_double*" $to] && [string match "*array*" $from] + || [string match "long_double*" $to] && [string match "*method" $from])) || ([string match "*ftype" $to] && [string match "*array*" $from]) || ([string match "*ftype2" $to] && [string match "*array*" $from]) || ([string match "*ftype" $to] && [string match "*method" $from]) |