Commit c7e1876b by Joseph Myers Committed by Joseph Myers

c-typeck.c (common_type): Prefer long long to long when same precision.

	* c-typeck.c (common_type): Prefer long long to long when same
	precision.

testsuite:
	* gcc.dg/c90-intprom-1.c, gcc.dg/c99-intprom-1.c: New tests.

From-SVN: r80584
parent 11554edc
2004-04-10 Joseph S. Myers <jsm@polyomino.org.uk>
* c-typeck.c (common_type): Prefer long long to long when same
precision.
2004-04-09 Zack Weinberg <zack@codesourcery.com> 2004-04-09 Zack Weinberg <zack@codesourcery.com>
PR 14887 PR 14887
......
...@@ -274,7 +274,24 @@ common_type (tree t1, tree t2) ...@@ -274,7 +274,24 @@ common_type (tree t1, tree t2)
else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1)) else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
return build_type_attribute_variant (t2, attributes); return build_type_attribute_variant (t2, attributes);
/* Same precision. Prefer longs to ints even when same size. */ /* Same precision. Prefer long longs to longs to ints when the
same precision, following the C99 rules on integer type rank
(which are equivalent to the C90 rules for C90 types). */
if (TYPE_MAIN_VARIANT (t1) == long_long_unsigned_type_node
|| TYPE_MAIN_VARIANT (t2) == long_long_unsigned_type_node)
return build_type_attribute_variant (long_long_unsigned_type_node,
attributes);
if (TYPE_MAIN_VARIANT (t1) == long_long_integer_type_node
|| TYPE_MAIN_VARIANT (t2) == long_long_integer_type_node)
{
if (TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
t1 = long_long_unsigned_type_node;
else
t1 = long_long_integer_type_node;
return build_type_attribute_variant (t1, attributes);
}
if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node
|| TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node) || TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node)
......
2004-04-10 Joseph S. Myers <jsm@polyomino.org.uk>
* gcc.dg/c90-intprom-1.c, gcc.dg/c99-intprom-1.c: New tests.
2004-04-09 Chris Demetriou <cgd@broadcom.com> 2004-04-09 Chris Demetriou <cgd@broadcom.com>
* g++.dg/other/packed1.C: Mark xfail for mips*- not mips-. * g++.dg/other/packed1.C: Mark xfail for mips*- not mips-.
......
/* Test for integer promotion rules: C90 subset of types. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
#include <limits.h>
#define CHECK(T1, T2, TC) \
do { \
T1 a = 0; \
T2 b = 0; \
TC *c = 0; \
__typeof__(a+b) *d = 0; \
c = d; \
d = c; \
} while (0)
void
f (void)
{
/* One type is unsigned long. */
CHECK(unsigned long, unsigned long, unsigned long);
CHECK(unsigned int, unsigned long, unsigned long);
CHECK(unsigned long, unsigned int, unsigned long);
CHECK(int, unsigned long, unsigned long);
CHECK(long, unsigned long, unsigned long);
CHECK(unsigned long, int, unsigned long);
CHECK(unsigned long, long, unsigned long);
/* long and unsigned int. */
#if LONG_MAX >= UINT_MAX
CHECK(unsigned int, long, long);
CHECK(long, unsigned int, long);
#else
CHECK(unsigned int, long, unsigned long);
CHECK(long, unsigned int, unsigned long);
#endif
/* One type is long. */
CHECK(long, long, long);
CHECK(int, long, long);
CHECK(long, int, long);
/* One type is unsigned int. */
CHECK(unsigned int, unsigned int, unsigned int);
CHECK(int, unsigned int, unsigned int);
CHECK(unsigned int, int, unsigned int);
/* Otherwise int. */
CHECK(int, int, int);
}
/* Test for integer promotion rules: extended to long long by C99. */
/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
#include <limits.h>
#define CHECK(T1, T2, TC) \
do { \
T1 a = 0; \
T2 b = 0; \
TC *c = 0; \
__typeof__(a+b) *d = 0; \
c = d; \
d = c; \
} while (0)
void
f (void)
{
/* Same type. */
CHECK(int, int, int);
CHECK(unsigned int, unsigned int, unsigned int);
CHECK(long, long, long);
CHECK(unsigned long, unsigned long, unsigned long);
CHECK(long long, long long, long long);
CHECK(unsigned long long, unsigned long long, unsigned long long);
/* Both signed. */
CHECK(int, long, long);
CHECK(int, long long, long long);
CHECK(long, int, long);
CHECK(long, long long, long long);
CHECK(long long, int, long long);
CHECK(long long, long, long long);
/* Both unsigned. */
CHECK(unsigned int, unsigned long, unsigned long);
CHECK(unsigned int, unsigned long long, unsigned long long);
CHECK(unsigned long, unsigned int, unsigned long);
CHECK(unsigned long, unsigned long long, unsigned long long);
CHECK(unsigned long long, unsigned int, unsigned long long);
CHECK(unsigned long long, unsigned long, unsigned long long);
/* Unsigned of greater or equal rank. */
CHECK(int, unsigned int, unsigned int);
CHECK(int, unsigned long, unsigned long);
CHECK(int, unsigned long long, unsigned long long);
CHECK(unsigned int, int, unsigned int);
CHECK(long, unsigned long, unsigned long);
CHECK(long, unsigned long long, unsigned long long);
CHECK(unsigned long, int, unsigned long);
CHECK(unsigned long, long, unsigned long);
CHECK(long long, unsigned long long, unsigned long long);
CHECK(unsigned long long, int, unsigned long long);
CHECK(unsigned long long, long, unsigned long long);
CHECK(unsigned long long, long long, unsigned long long);
/* Signed of greater rank. */
#if LONG_MAX >= UINT_MAX
CHECK(unsigned int, long, long);
CHECK(long, unsigned int, long);
#else
CHECK(unsigned int, long, unsigned long);
CHECK(long, unsigned int, unsigned long);
#endif
#if LLONG_MAX >= UINT_MAX
CHECK(unsigned int, long long, long long);
CHECK(long long, unsigned int, long long);
#else
CHECK(unsigned int, long long, unsigned long long);
CHECK(long long, unsigned int, unsigned long long);
#endif
#if LLONG_MAX >= ULONG_MAX
CHECK(unsigned long, long long, long long);
CHECK(long long, unsigned long, long long);
#else
CHECK(unsigned long, long long, unsigned long long);
CHECK(long long, unsigned long, unsigned long long);
#endif
}
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