139 lines
4.5 KiB
C
139 lines
4.5 KiB
C
/* PR c/48956: Test for diagnostics for implicit conversions from complex
|
|
to real types and narrowing conversions of complex types. */
|
|
|
|
/* Architecture restrictions taken from Wconversion-real-integer.c.
|
|
Likewise, the magic value 16777217. */
|
|
|
|
/* { dg-do compile } */
|
|
/* { dg-skip-if "doubles are floats,ints are 16bits" { "avr-*-*" } } */
|
|
/* { dg-options " -std=c99 -pedantic -Wconversion " } */
|
|
/* { dg-require-effective-target int32plus } */
|
|
/* { dg-require-effective-target double64plus } */
|
|
|
|
/* A number which does not fit into float. */
|
|
#define MAX_FLOAT_PLUS 16777217.
|
|
|
|
/* Other types could be added, but that won't affect test coverage. */
|
|
void ffloatc (float _Complex);
|
|
void fdoublec (double _Complex);
|
|
|
|
void ffloat (float);
|
|
void fdouble (double);
|
|
|
|
void fsi (int);
|
|
void fui (unsigned);
|
|
|
|
float _Complex vfloatc;
|
|
double _Complex vdoublec;
|
|
|
|
float vfloat;
|
|
double vdouble;
|
|
|
|
int vsi;
|
|
unsigned vui;
|
|
|
|
/* Check implicit conversions of complex values to reals. */
|
|
void
|
|
var_complex_to_real (void)
|
|
{
|
|
float _Complex floatc = 0.;
|
|
double _Complex doublec = 0.;
|
|
|
|
ffloatc (floatc);
|
|
fdoublec (doublec);
|
|
vfloatc = floatc;
|
|
vdoublec = doublec;
|
|
|
|
ffloat (floatc); /* { dg-warning "conversion" } */
|
|
fdouble (floatc); /* { dg-warning "conversion" } */
|
|
vfloat = floatc; /* { dg-warning "conversion" } */
|
|
vdouble = floatc; /* { dg-warning "conversion" } */
|
|
|
|
ffloat (doublec); /* { dg-warning "conversion" } */
|
|
fdouble (doublec); /* { dg-warning "conversion" } */
|
|
vfloat = doublec; /* { dg-warning "conversion" } */
|
|
vdouble = doublec; /* { dg-warning "conversion" } */
|
|
}
|
|
|
|
/* Check implicit narrowing conversions of complex values. */
|
|
void
|
|
var_complex_narrowing (void)
|
|
{
|
|
float _Complex floatc = 0.;
|
|
double _Complex doublec = 0.;
|
|
|
|
vdoublec = floatc;
|
|
vfloatc = doublec; /* { dg-warning "conversion from .complex double. to .complex float. may change value" } */
|
|
|
|
fdoublec (floatc);
|
|
ffloatc (doublec); /* { dg-warning "conversion from .complex double. to .complex float. may change value" } */
|
|
}
|
|
|
|
/* Check implicit conversions of complex values to integers. */
|
|
void
|
|
var_complex_to_int (void)
|
|
{
|
|
float _Complex floatc = 0.;
|
|
double _Complex doublec = 0.;
|
|
|
|
fsi (floatc); /* { dg-warning "conversion" } */
|
|
fui (floatc); /* { dg-warning "conversion" } */
|
|
vsi = floatc; /* { dg-warning "conversion" } */
|
|
vui = floatc; /* { dg-warning "conversion" } */
|
|
|
|
fsi (doublec); /* { dg-warning "conversion" } */
|
|
fui (doublec); /* { dg-warning "conversion" } */
|
|
vsi = doublec; /* { dg-warning "conversion" } */
|
|
vui = doublec; /* { dg-warning "conversion" } */
|
|
}
|
|
|
|
/* Check implicit conversion of constant complex values to floats. */
|
|
void
|
|
const_complex_to_real (void)
|
|
{
|
|
ffloat (__builtin_complex (0., 1.)); /* { dg-warning "conversion" } */
|
|
fdouble (__builtin_complex (0., 1.)); /* { dg-warning "conversion" } */
|
|
|
|
vfloat = __builtin_complex (0., 1.); /* { dg-warning "conversion" } */
|
|
vdouble = __builtin_complex (0., 1.); /* { dg-warning "conversion" } */
|
|
|
|
vfloat = __builtin_complex (1., 0.) + __builtin_complex (1., 0.);
|
|
vdouble = __builtin_complex (0., 0.) * __builtin_complex (1., 1.);
|
|
ffloat (__builtin_complex (1., 0.) + __builtin_complex (1., 0.));
|
|
fdouble (__builtin_complex (1., 0.) + __builtin_complex (1., 0.));
|
|
|
|
vfloat = __builtin_complex (MAX_FLOAT_PLUS, 0.); /* { dg-warning "float-conversion" } */
|
|
ffloat (__builtin_complex (MAX_FLOAT_PLUS, 0.)); /* { dg-warning "float-conversion" } */
|
|
}
|
|
|
|
/* Check implicit conversion of constant complex values to integers. */
|
|
void
|
|
const_complex_to_int (void)
|
|
{
|
|
vsi = __builtin_complex (-1., 0.);
|
|
vui = __builtin_complex (1., 0.);
|
|
fsi (__builtin_complex (-1., 0.));
|
|
fui (__builtin_complex (1., 0.));
|
|
|
|
vui = __builtin_complex (-1., 0.); /* { dg-warning "overflow" } */
|
|
fui (__builtin_complex (-1., 0.)); /* { dg-warning "overflow" } */
|
|
|
|
vsi = __builtin_complex (0.5, 0.); /* { dg-warning "float-conversion" } */
|
|
fui (__builtin_complex (0.5, 0.)); /* { dg-warning "float-conversion" } */
|
|
|
|
vsi = __builtin_complex (-0.5, 0.); /* { dg-warning "float-conversion" } */
|
|
fui (__builtin_complex (-0.5, 0.)); /* { dg-warning "float-conversion" } */
|
|
}
|
|
|
|
/* Check implicit narrowing conversion of constant complex values to. */
|
|
void
|
|
const_complex_narrowing (void)
|
|
{
|
|
ffloatc (__builtin_complex (-100., 100.));
|
|
|
|
ffloatc (__builtin_complex (MAX_FLOAT_PLUS, 0.)); /* { dg-warning "float-conversion" } */
|
|
ffloatc (__builtin_complex (0., MAX_FLOAT_PLUS)); /* { dg-warning "float-conversion" } */
|
|
ffloatc (__builtin_complex (MAX_FLOAT_PLUS, MAX_FLOAT_PLUS)); /* { dg-warning "float-conversion" } */
|
|
}
|
|
|