1/* Test for diagnostics for constant overflow. Test with -pedantic. */ 2/* Origin: Joseph Myers <joseph@codesourcery.com> */ 3/* { dg-do compile } */ 4/* { dg-options "-fpermissive -pedantic" } */ 5 6#include <limits.h> 7 8enum e { 9 E0 = INT_MAX, 10 /* Unsigned overflow wraps around. */ 11 E1 = UINT_MAX + 1, 12 /* Overflow in an unevaluated part of an expression is OK (example 13 in the standard). */ 14 E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } 14 } */ 15 E3 = 1 / 0, /* { dg-warning "division by zero" } */ 16 /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant.expression" "enum error" { target *-*-* } 15 } */ 17 /* But as in DR#031, the 1/0 in an evaluated subexpression means the 18 whole expression violates the constraints. */ 19 E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */ 20 /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */ 21 E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */ 22 /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 21 } */ 23 /* Again, overflow in evaluated subexpression. */ 24 E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */ 25 /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 24 } */ 26 /* A cast does not constitute overflow in conversion. */ 27 E7 = (char) INT_MAX 28}; 29 30struct s { 31 int a; 32 int : 0 * (1 / 0); /* { dg-warning "division by zero" } */ 33 int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ 34 /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 33 } */ 35}; 36 37void 38f (void) 39{ 40 /* This expression is not required to be a constant expression, so 41 it should just involve undefined behavior at runtime. */ 42 int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ 43 44} 45 46/* This expression is neither required to be constant. */ 47static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ 48 49 50// Test for overflow in null pointer constant. 51void *n = 0; 52/* The first two of these involve overflow, so are not null pointer 53 constants. The third has the overflow in an unevaluated 54 subexpression, so is a null pointer constant. */ 55void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ 56/* { dg-warning "invalid conversion from 'int' to 'void" "null" { target *-*-* } 55 } */ 57 58void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */ 59/* { dg-warning "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 58 } */ 60void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */ 61 62void 63g (int i) 64{ 65 switch (i) 66 { 67 case 0 * (1/0): /* { dg-warning "division by zero" } */ 68 ; 69 case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */ 70 /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 69 } */ 71 ; 72 } 73} 74 75int 76h (void) 77{ 78 return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ 79} 80 81int 82h1 (void) 83{ 84 return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */ 85} 86 87void fuc (unsigned char); 88void fsc (signed char); 89 90void 91h2 (void) 92{ 93 fsc (SCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ 94 fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */ 95 fsc (UCHAR_MAX); /* { dg-warning "overflow in implicit constant conversion" } */ 96 fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ 97 fuc (-1); 98 fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ 99 fuc (SCHAR_MIN); 100 fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ 101 fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ 102} 103 104void fui (unsigned int); 105void fsi (signed int); 106 107int si; 108unsigned ui; 109 110void 111h2i (int x) 112{ 113 /* For some reason, we only give certain warnings for implicit 114 conversions among values of the same precision with -Wconversion, 115 while we don't give others at all. */ 116 fsi ((unsigned)INT_MAX + 1); 117 si = (unsigned)INT_MAX + 1; 118 si = x ? (unsigned)INT_MAX + 1 : 1; 119 fsi ((unsigned)INT_MAX + 2); 120 si = (unsigned)INT_MAX + 2; 121 si = x ? (unsigned)INT_MAX + 2 : 1; 122 fsi (UINT_MAX); 123 si = UINT_MAX; 124 fui (-1); 125 ui = -1; 126 ui = x ? -1 : 1U; 127 fui (INT_MIN); 128 ui = INT_MIN; 129 ui = x ? INT_MIN : 1U; 130} 131