/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C

https://gitlab.com/4144/gcc · C · 99 lines · 68 code · 18 blank · 13 comment · 4 complexity · cf2551312abb241854e1de4e7dcfd670 MD5 · raw file

  1. /* { dg-do compile } */
  2. /* { dg-options "-Wdouble-promotion -ftrack-macro-expansion=2" } */
  3. #include <stddef.h>
  4. /* Some targets do not provide <complex.h> so we define I ourselves. */
  5. #define I 1.0iF
  6. #define ID ((_Complex double)I)
  7. float f;
  8. double d;
  9. int i;
  10. long double ld;
  11. _Complex float cf;
  12. _Complex double cd;
  13. _Complex long double cld;
  14. size_t s;
  15. extern void varargs_fn (int, ...);
  16. extern void double_fn (double);
  17. extern float float_fn (void);
  18. void
  19. usual_arithmetic_conversions(void)
  20. {
  21. float local_f;
  22. _Complex float local_cf;
  23. /* Values of type "float" are implicitly converted to "double" or
  24. "long double" due to use in arithmetic with "double" or "long
  25. double" operands. */
  26. local_f = f + 1.0; /* { dg-warning "15:implicit" } */
  27. local_f = f - d; /* { dg-warning "15:implicit" } */
  28. local_f = 1.0f * 1.0; /* { dg-warning "18:implicit" } */
  29. local_f = 1.0f / d; /* { dg-warning "18:implicit" } */
  30. local_cf = cf + 1.0; /* { dg-warning "17:implicit" } */
  31. local_cf = cf - d; /* { dg-warning "17:implicit" } */
  32. local_cf = cf + 1.0 * ID; /* { dg-warning "17:implicit" } */
  33. local_cf = cf - cd; /* { dg-warning "17:implicit" } */
  34. local_f = i ? f : d; /* { dg-warning "15:implicit" } */
  35. i = f == d; /* { dg-warning "9:implicit" } */
  36. i = d != f; /* { dg-warning "9:implicit" } */
  37. }
  38. void
  39. default_argument_promotion (void)
  40. {
  41. /* Because "f" is part of the variable argument list, it is promoted
  42. to "double". */
  43. varargs_fn (1, f); /* { dg-warning "implicit" } */
  44. }
  45. /* There is no warning when an explicit cast is used to perform the
  46. conversion. */
  47. void
  48. casts (void)
  49. {
  50. float local_f;
  51. _Complex float local_cf;
  52. local_f = (double)f + 1.0; /* { dg-bogus "implicit" } */
  53. local_f = (double)f - d; /* { dg-bogus "implicit" } */
  54. local_f = (double)1.0f + 1.0; /* { dg-bogus "implicit" } */
  55. local_f = (double)1.0f - d; /* { dg-bogus "implicit" } */
  56. local_cf = (_Complex double)cf + 1.0; /* { dg-bogus "implicit" } */
  57. local_cf = (_Complex double)cf - d; /* { dg-bogus "implicit" } */
  58. local_cf = (_Complex double)cf + 1.0 * ID; /* { dg-bogus "implicit" } */
  59. local_cf = (_Complex double)cf - cd; /* { dg-bogus "implicit" } */
  60. local_f = i ? (double)f : d; /* { dg-bogus "implicit" } */
  61. i = (double)f == d; /* { dg-bogus "implicit" } */
  62. i = d != (double)f; /* { dg-bogus "implicit" } */
  63. }
  64. /* There is no warning on conversions that occur in assignment (and
  65. assignment-like) contexts. */
  66. void
  67. assignments (void)
  68. {
  69. d = f; /* { dg-bogus "implicit" } */
  70. double_fn (f); /* { dg-bogus "implicit" } */
  71. d = float_fn (); /* { dg-bogus "implicit" } */
  72. }
  73. /* There is no warning in non-evaluated contexts. */
  74. void
  75. non_evaluated (void)
  76. {
  77. s = sizeof (f + 1.0); /* { dg-bogus "implicit" } */
  78. s = __alignof__ (f + 1.0); /* { dg-bogus "implicit" } */
  79. d = (__typeof__(f + 1.0))f; /* { dg-bogus "implicit" } */
  80. s = sizeof (i ? f : d); /* { dg-bogus "implicit" } */
  81. }