c-common.c (c_promoting_integer_type_p): New function, from the corpse of old macro.
authorRichard Henderson <rth@redhat.com>
Mon, 30 Apr 2001 23:59:10 +0000 (16:59 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 30 Apr 2001 23:59:10 +0000 (16:59 -0700)
        * c-common.c (c_promoting_integer_type_p): New function, from the
        corpse of old macro.  Properly promote too-small enumerations and
        booleans.  Adjust all callers.
        * c-common.h (C_PROMOTING_INTEGER_TYPE_P): Remove.
        (c_promoting_integer_type_p): Declare.
        * c-decl.c: Adjust C_PROMOTING_INTEGER_TYPE_P invocations.
        * c-typeck.c: Likewise.
        (default_conversion): Remove now redundant boolean check.

        * cvt.c: Downcase C_PROMOTING_INTEGER_TYPE_P invocations.
        * decl.c: Likewise.

From-SVN: r41709

gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-decl.c
gcc/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/cp/decl.c

index ba3fc472bc92732c4446f656ef0ed358d02bc933..1835a46b46c99b0da420a9dfe4aeb2dad4bde337 100644 (file)
@@ -1,3 +1,14 @@
+2001-04-30  Richard Henderson  <rth@redhat.com>
+
+       * c-common.c (c_promoting_integer_type_p): New function, from the
+       corpse of old macro.  Properly promote too-small enumerations and
+       booleans.  Adjust all callers.
+       * c-common.h (C_PROMOTING_INTEGER_TYPE_P): Remove.
+       (c_promoting_integer_type_p): Declare.
+       * c-decl.c: Adjust C_PROMOTING_INTEGER_TYPE_P invocations.
+       * c-typeck.c: Likewise.
+       (default_conversion): Remove now redundant boolean check.
+
 2001-04-30  Jan Hubicka  <jh@suse.cz>
             Richard Henderson  <rth@redhat.com>
 
index 872750320ed4df0715a7f25c0a6cc4cd218a1212..a87ad7e33260d13fcf0a4bec3fa7dcd3c06505ff 100644 (file)
@@ -3690,6 +3690,36 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
   return (bdecl != 0 ? bdecl : decl);
 }
 \f
+/* Nonzero if the type T promotes to int.  This is (nearly) the
+   integral promotions defined in ISO C99 6.3.1.1/2.  */
+
+bool
+c_promoting_integer_type_p (t)
+     tree t;
+{
+  switch (TREE_CODE (t))
+    {
+    case INTEGER_TYPE:
+      return (TYPE_MAIN_VARIANT (t) == char_type_node
+             || TYPE_MAIN_VARIANT (t) == signed_char_type_node
+             || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
+             || TYPE_MAIN_VARIANT (t) == short_integer_type_node
+             || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node);
+
+    case ENUMERAL_TYPE:
+      /* ??? Technically all enumerations not larger than an int
+        promote to an int.  But this is used along code paths
+        that only want to notice a size change.  */
+      return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
+
+    case BOOLEAN_TYPE:
+      return 1;
+
+    default:
+      return 0;
+    }
+}
+
 /* Given a type, apply default promotions wrt unnamed function arguments
    and return the new type.  Return NULL_TREE if no change.  */
 /* ??? There is a function of the same name in the C++ front end that
@@ -3704,7 +3734,7 @@ simple_type_promotes_to (type)
   if (TYPE_MAIN_VARIANT (type) == float_type_node)
     return double_type_node;
 
-  if (C_PROMOTING_INTEGER_TYPE_P (type))
+  if (c_promoting_integer_type_p (type))
     {
       /* Traditionally, unsignedness is preserved in default promotions.
          Also preserve unsignedness if not really getting any wider.  */
@@ -3739,7 +3769,7 @@ self_promoting_args_p (parms)
       if (TYPE_MAIN_VARIANT (type) == float_type_node)
        return 0;
 
-      if (C_PROMOTING_INTEGER_TYPE_P (type))
+      if (c_promoting_integer_type_p (type))
        return 0;
     }
   return 1;
index b9a7a9dd97f295ed200f112af1e30fc89234ff71..32d7ec990034093c3576b6127be95b1c574161a5 100644 (file)
@@ -533,17 +533,7 @@ extern tree build_va_arg                   PARAMS ((tree, tree));
 
 extern void c_common_lang_init                 PARAMS ((void));
 
-/* Nonzero if the type T promotes to itself.
-   ANSI C states explicitly the list of types that promote;
-   in particular, short promotes to int even if they have the same width.  */
-#define C_PROMOTING_INTEGER_TYPE_P(t)                          \
-  (TREE_CODE ((t)) == INTEGER_TYPE                             \
-   && (TYPE_MAIN_VARIANT (t) == char_type_node                 \
-       || TYPE_MAIN_VARIANT (t) == signed_char_type_node       \
-       || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node     \
-       || TYPE_MAIN_VARIANT (t) == short_integer_type_node     \
-       || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node))
-
+extern bool c_promoting_integer_type_p         PARAMS ((tree));
 extern int self_promoting_args_p               PARAMS ((tree));
 extern tree simple_type_promotes_to            PARAMS ((tree));
 extern tree strip_array_types                   PARAMS ((tree));
index a386ecdad15afe6accdd3cd70e76398fdc71c746..9d63d060cd80ff0e6f59094c8de8523b69143a68 100644 (file)
@@ -5999,7 +5999,7 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
 
   restype = TREE_TYPE (TREE_TYPE (current_function_decl));
   /* Promote the value to int before returning it.  */
-  if (C_PROMOTING_INTEGER_TYPE_P (restype))
+  if (c_promoting_integer_type_p (restype))
     {
       /* It retains unsignedness if traditional
         or if not really getting wider.  */
index baf5fed2d07a36d2a744ec176450f59e44c10f5b..f05422ca6d21ee9b3f54b3447305264de3efc4e7 100644 (file)
@@ -954,14 +954,14 @@ default_conversion (exp)
   if (TREE_CODE (exp) == COMPONENT_REF
       && DECL_C_BIT_FIELD (TREE_OPERAND (exp, 1))
       /* If it's thinner than an int, promote it like a
-        C_PROMOTING_INTEGER_TYPE_P, otherwise leave it alone.  */
+        c_promoting_integer_type_p, otherwise leave it alone.  */
       && 0 > compare_tree_int (DECL_SIZE (TREE_OPERAND (exp, 1)),
                               TYPE_PRECISION (integer_type_node)))
     return convert (flag_traditional && TREE_UNSIGNED (type)
                    ? unsigned_type_node : integer_type_node,
                    exp);
 
-  if (C_PROMOTING_INTEGER_TYPE_P (type))
+  if (c_promoting_integer_type_p (type))
     {
       /* Traditionally, unsignedness is preserved in default promotions.
          Also preserve unsignedness if not really getting any wider.  */
@@ -973,9 +973,6 @@ default_conversion (exp)
       return convert (integer_type_node, exp);
     }
 
-  if (code == BOOLEAN_TYPE)
-    return convert (integer_type_node, exp);
-
   if (flag_traditional && !flag_allow_single_precision
       && TYPE_MAIN_VARIANT (type) == float_type_node)
     return convert (double_type_node, exp);
index 1d0f7cedfdd4e6158a6771ecc8edc7b9ec031534..e95216846364846aad90f03d7904bd17e7beab21 100644 (file)
@@ -1,3 +1,8 @@
+2001-04-30  Richard Henderson  <rth@redhat.com>
+
+        * cvt.c: Downcase C_PROMOTING_INTEGER_TYPE_P invocations.
+       * decl.c: Likewise.
+
 2001-04-30  Mark Mitchell  <mark@codesourcery.com>
 
        * gxxint.texi: Remove.
index 1f74eb463ab21d2a740975e7f940e12c2be3f09d..f247699d22cc47b4a61d6fa378e588755c7e6a8a 100644 (file)
@@ -1258,7 +1258,7 @@ type_promotes_to (type)
       else
        type = totype;
     }
-  else if (C_PROMOTING_INTEGER_TYPE_P (type))
+  else if (c_promoting_integer_type_p (type))
     {
       /* Retain unsignedness if really not getting bigger.  */
       if (TREE_UNSIGNED (type)
index 246cbd7f4b3559268018d2098c5cd6a5a655d3c8..da636796bbeca070e4e05bbaf1906d7abe370211 100644 (file)
@@ -13602,7 +13602,7 @@ start_function (declspecs, declarator, attrs, flags)
     cplus_decl_attributes (decl1, NULL_TREE, attrs);
 
   /* Promote the value to int before returning it.  */
-  if (C_PROMOTING_INTEGER_TYPE_P (restype))
+  if (c_promoting_integer_type_p (restype))
     restype = type_promotes_to (restype);
 
   if (DECL_RESULT (decl1) == NULL_TREE)