aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/testsuite/ChangeLog11
-rw-r--r--gdb/testsuite/gdb.base/whatis-ptype-typedefs.c10
-rw-r--r--gdb/testsuite/gdb.base/whatis-ptype-typedefs.exp39
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])