/* 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" } */ }