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:
parent
901d43bcd0
commit
d72040f508
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue