Commit d72040f5 by Richard Henderson Committed by Richard Henderson

c-common.c (c_promoting_integer_type_p): New function, from the corpse of old macro.

        * 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
parent 901d43bc
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> 2001-04-30 Jan Hubicka <jh@suse.cz>
Richard Henderson <rth@redhat.com> Richard Henderson <rth@redhat.com>
......
...@@ -3690,6 +3690,36 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code, ...@@ -3690,6 +3690,36 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
return (bdecl != 0 ? bdecl : decl); return (bdecl != 0 ? bdecl : decl);
} }
/* 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 /* Given a type, apply default promotions wrt unnamed function arguments
and return the new type. Return NULL_TREE if no change. */ 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 /* ??? There is a function of the same name in the C++ front end that
...@@ -3704,7 +3734,7 @@ simple_type_promotes_to (type) ...@@ -3704,7 +3734,7 @@ simple_type_promotes_to (type)
if (TYPE_MAIN_VARIANT (type) == float_type_node) if (TYPE_MAIN_VARIANT (type) == float_type_node)
return double_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. /* Traditionally, unsignedness is preserved in default promotions.
Also preserve unsignedness if not really getting any wider. */ Also preserve unsignedness if not really getting any wider. */
...@@ -3739,7 +3769,7 @@ self_promoting_args_p (parms) ...@@ -3739,7 +3769,7 @@ self_promoting_args_p (parms)
if (TYPE_MAIN_VARIANT (type) == float_type_node) if (TYPE_MAIN_VARIANT (type) == float_type_node)
return 0; return 0;
if (C_PROMOTING_INTEGER_TYPE_P (type)) if (c_promoting_integer_type_p (type))
return 0; return 0;
} }
return 1; return 1;
......
...@@ -533,17 +533,7 @@ extern tree build_va_arg PARAMS ((tree, tree)); ...@@ -533,17 +533,7 @@ extern tree build_va_arg PARAMS ((tree, tree));
extern void c_common_lang_init PARAMS ((void)); extern void c_common_lang_init PARAMS ((void));
/* Nonzero if the type T promotes to itself. extern bool c_promoting_integer_type_p PARAMS ((tree));
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 int self_promoting_args_p PARAMS ((tree)); extern int self_promoting_args_p PARAMS ((tree));
extern tree simple_type_promotes_to PARAMS ((tree)); extern tree simple_type_promotes_to PARAMS ((tree));
extern tree strip_array_types PARAMS ((tree)); extern tree strip_array_types PARAMS ((tree));
......
...@@ -5999,7 +5999,7 @@ start_function (declspecs, declarator, prefix_attributes, attributes) ...@@ -5999,7 +5999,7 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
restype = TREE_TYPE (TREE_TYPE (current_function_decl)); restype = TREE_TYPE (TREE_TYPE (current_function_decl));
/* Promote the value to int before returning it. */ /* 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 /* It retains unsignedness if traditional
or if not really getting wider. */ or if not really getting wider. */
......
...@@ -954,14 +954,14 @@ default_conversion (exp) ...@@ -954,14 +954,14 @@ default_conversion (exp)
if (TREE_CODE (exp) == COMPONENT_REF if (TREE_CODE (exp) == COMPONENT_REF
&& DECL_C_BIT_FIELD (TREE_OPERAND (exp, 1)) && DECL_C_BIT_FIELD (TREE_OPERAND (exp, 1))
/* If it's thinner than an int, promote it like a /* 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)), && 0 > compare_tree_int (DECL_SIZE (TREE_OPERAND (exp, 1)),
TYPE_PRECISION (integer_type_node))) TYPE_PRECISION (integer_type_node)))
return convert (flag_traditional && TREE_UNSIGNED (type) return convert (flag_traditional && TREE_UNSIGNED (type)
? unsigned_type_node : integer_type_node, ? unsigned_type_node : integer_type_node,
exp); exp);
if (C_PROMOTING_INTEGER_TYPE_P (type)) if (c_promoting_integer_type_p (type))
{ {
/* Traditionally, unsignedness is preserved in default promotions. /* Traditionally, unsignedness is preserved in default promotions.
Also preserve unsignedness if not really getting any wider. */ Also preserve unsignedness if not really getting any wider. */
...@@ -973,9 +973,6 @@ default_conversion (exp) ...@@ -973,9 +973,6 @@ default_conversion (exp)
return convert (integer_type_node, exp); return convert (integer_type_node, exp);
} }
if (code == BOOLEAN_TYPE)
return convert (integer_type_node, exp);
if (flag_traditional && !flag_allow_single_precision if (flag_traditional && !flag_allow_single_precision
&& TYPE_MAIN_VARIANT (type) == float_type_node) && TYPE_MAIN_VARIANT (type) == float_type_node)
return convert (double_type_node, exp); return convert (double_type_node, exp);
......
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> 2001-04-30 Mark Mitchell <mark@codesourcery.com>
* gxxint.texi: Remove. * gxxint.texi: Remove.
......
...@@ -1258,7 +1258,7 @@ type_promotes_to (type) ...@@ -1258,7 +1258,7 @@ type_promotes_to (type)
else else
type = totype; 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. */ /* Retain unsignedness if really not getting bigger. */
if (TREE_UNSIGNED (type) if (TREE_UNSIGNED (type)
......
...@@ -13602,7 +13602,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13602,7 +13602,7 @@ start_function (declspecs, declarator, attrs, flags)
cplus_decl_attributes (decl1, NULL_TREE, attrs); cplus_decl_attributes (decl1, NULL_TREE, attrs);
/* Promote the value to int before returning it. */ /* 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); restype = type_promotes_to (restype);
if (DECL_RESULT (decl1) == NULL_TREE) if (DECL_RESULT (decl1) == NULL_TREE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment