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
This commit is contained in:
Richard Henderson 2001-04-30 16:59:10 -07:00 committed by Richard Henderson
parent 901d43bcd0
commit d72040f508
8 changed files with 54 additions and 21 deletions

View 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>

View File

@ -3690,6 +3690,36 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
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
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;

View 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));

View 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. */

View 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);

View 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.

View 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)

View 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)