Don't inherit range-type signed-ness from underlying type
[deliverable/binutils-gdb.git] / gdb / gdbtypes.c
index 33d3a464f5ba4eb944b08c5950f5f0ac74989703..0940fa597fbcd58640aeaa11de787a1a0fb2728a 100644 (file)
@@ -950,7 +950,22 @@ create_range_type (struct type *result_type, struct type *index_type,
 
   result_type->set_bounds (bounds);
 
-  result_type->set_is_unsigned (index_type->is_unsigned ());
+  /* Note that the signed-ness of a range type can't simply be copied
+     from the underlying type.  Consider a case where the underlying
+     type is 'int', but the range type can hold 0..65535, and where
+     the range is further specified to fit into 16 bits.  In this
+     case, if we copy the underlying type's sign, then reading some
+     range values will cause an unwanted sign extension.  So, we have
+     some heuristics here instead.  */
+  if (low_bound->kind () == PROP_CONST && low_bound->const_val () >= 0)
+    result_type->set_is_unsigned (true);
+  /* Ada allows the declaration of range types whose upper bound is
+     less than the lower bound, so checking the lower bound is not
+     enough.  Make sure we do not mark a range type whose upper bound
+     is negative as unsigned.  */
+  if (high_bound->kind () == PROP_CONST && high_bound->const_val () < 0)
+    result_type->set_is_unsigned (false);
+
   result_type->set_endianity_is_not_default
     (index_type->endianity_is_not_default ());
 
This page took 0.023637 seconds and 4 git commands to generate.