mirror of git://gcc.gnu.org/git/gcc.git
105 lines
3.4 KiB
C
105 lines
3.4 KiB
C
/* { dg-do compile } */
|
|
/* { dg-options "-Wdouble-promotion" } */
|
|
|
|
#include <stddef.h>
|
|
|
|
/* Some targets do not provide <complex.h> so we define I ourselves. */
|
|
#define I 1.0iF
|
|
#define ID ((_Complex double)I)
|
|
|
|
float f;
|
|
double d;
|
|
int i;
|
|
long double ld;
|
|
_Complex float cf;
|
|
_Complex double cd;
|
|
_Complex long double cld;
|
|
size_t s;
|
|
|
|
extern void unprototyped_fn ();
|
|
extern void varargs_fn (int, ...);
|
|
extern void double_fn (double);
|
|
extern float float_fn (void);
|
|
|
|
void
|
|
usual_arithmetic_conversions(void)
|
|
{
|
|
float local_f;
|
|
_Complex float local_cf;
|
|
|
|
/* Values of type "float" are implicitly converted to "double" or
|
|
"long double" due to use in arithmetic with "double" or "long
|
|
double" operands. */
|
|
local_f = f + 1.0; /* { dg-warning "implicit" } */
|
|
local_f = f - d; /* { dg-warning "implicit" } */
|
|
local_f = 1.0f * 1.0; /* { dg-warning "implicit" } */
|
|
local_f = 1.0f / d; /* { dg-warning "implicit" } */
|
|
|
|
local_cf = cf + 1.0; /* { dg-warning "implicit" } */
|
|
local_cf = cf - d; /* { dg-warning "implicit" } */
|
|
local_cf = cf + 1.0 * ID; /* { dg-warning "implicit" } */
|
|
local_cf = cf - cd; /* { dg-warning "implicit" } */
|
|
|
|
local_f = i ? f : d; /* { dg-warning "implicit" } */
|
|
i = f == d; /* { dg-warning "implicit" } */
|
|
i = d != f; /* { dg-warning "implicit" } */
|
|
}
|
|
|
|
void
|
|
default_argument_promotion (void)
|
|
{
|
|
/* Because there is no prototype, "f" is promoted to "double". */
|
|
unprototyped_fn (f); /* { dg-warning "implicit" } */
|
|
undeclared_fn (f); /* { dg-warning "implicit" } */
|
|
/* Because "f" is part of the variable argument list, it is promoted
|
|
to "double". */
|
|
varargs_fn (1, f); /* { dg-warning "implicit" } */
|
|
}
|
|
|
|
/* There is no warning when an explicit cast is used to perform the
|
|
conversion. */
|
|
|
|
void
|
|
casts (void)
|
|
{
|
|
float local_f;
|
|
_Complex float local_cf;
|
|
|
|
local_f = (double)f + 1.0; /* { dg-bogus "implicit" } */
|
|
local_f = (double)f - d; /* { dg-bogus "implicit" } */
|
|
local_f = (double)1.0f + 1.0; /* { dg-bogus "implicit" } */
|
|
local_f = (double)1.0f - d; /* { dg-bogus "implicit" } */
|
|
|
|
local_cf = (_Complex double)cf + 1.0; /* { dg-bogus "implicit" } */
|
|
local_cf = (_Complex double)cf - d; /* { dg-bogus "implicit" } */
|
|
local_cf = (_Complex double)cf + 1.0 * ID; /* { dg-bogus "implicit" } */
|
|
local_cf = (_Complex double)cf - cd; /* { dg-bogus "implicit" } */
|
|
|
|
local_f = i ? (double)f : d; /* { dg-bogus "implicit" } */
|
|
i = (double)f == d; /* { dg-bogus "implicit" } */
|
|
i = d != (double)f; /* { dg-bogus "implicit" } */
|
|
}
|
|
|
|
/* There is no warning on conversions that occur in assignment (and
|
|
assignment-like) contexts. */
|
|
|
|
void
|
|
assignments (void)
|
|
{
|
|
d = f; /* { dg-bogus "implicit" } */
|
|
double_fn (f); /* { dg-bogus "implicit" } */
|
|
d = float_fn (); /* { dg-bogus "implicit" } */
|
|
}
|
|
|
|
/* There is no warning in non-evaluated contexts. */
|
|
|
|
void
|
|
non_evaluated (void)
|
|
{
|
|
s = sizeof (f + 1.0); /* { dg-bogus "implicit" } */
|
|
s = __alignof__ (f + 1.0); /* { dg-bogus "implicit" } */
|
|
d = (__typeof__(f + 1.0))f; /* { dg-bogus "implicit" } */
|
|
s = sizeof (i ? f : d); /* { dg-bogus "implicit" } */
|
|
s = sizeof (unprototyped_fn (f)); /* { dg-bogus "implicit" } */
|
|
}
|