1// RUN: %clang_cc1 %s -verify -fsyntax-only -std=gnu++98 -triple x86_64-pc-linux-gnu 2typedef unsigned long long uint64_t; 3typedef unsigned int uint32_t; 4 5// Check integer sizes. 6int array64[sizeof(uint64_t) == 8 ? 1 : -1]; 7int array32[sizeof(uint32_t) == 4 ? 1 : -1]; 8int arrayint[sizeof(int) < sizeof(uint64_t) ? 1 : -1]; 9 10uint64_t f0(uint64_t); 11uint64_t f1(uint64_t, uint32_t); 12uint64_t f2(uint64_t, ...); 13 14static const uint64_t overflow = 1 * 4608 * 1024 * 1024; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} 15 16uint64_t check_integer_overflows(int i) { //expected-note {{declared here}} 17// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 18 uint64_t overflow = 4608 * 1024 * 1024, 19// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 20 overflow2 = (uint64_t)(4608 * 1024 * 1024), 21// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 22 overflow3 = (uint64_t)(4608 * 1024 * 1024 * i), 23// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 24 overflow4 = (1ULL * ((4608) * ((1024) * (1024))) + 2ULL), 25// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 26 overflow5 = static_cast<uint64_t>(4608 * 1024 * 1024), 27// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 28 multi_overflow = (uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024)); 29 30// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 31 overflow += overflow2 = overflow3 = (uint64_t)(4608 * 1024 * 1024); 32// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 33 overflow += overflow2 = overflow3 = 4608 * 1024 * 1024; 34 35// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 36 overflow += overflow2 = overflow3 = static_cast<uint64_t>(4608 * 1024 * 1024); 37 38 uint64_t not_overflow = 4608 * 1024 * 1024ULL; 39 uint64_t not_overflow2 = (1ULL * ((uint64_t)(4608) * (1024 * 1024)) + 2ULL); 40 41// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 42 overflow = 4608 * 1024 * 1024 ? 4608 * 1024 * 1024 : 0; 43 44// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 45 overflow = 0 ? 0 : 4608 * 1024 * 1024; 46 47// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 48 if (4608 * 1024 * 1024) 49 return 0; 50 51// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 52 if ((uint64_t)(4608 * 1024 * 1024)) 53 return 1; 54 55// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 56 if (static_cast<uint64_t>(4608 * 1024 * 1024)) 57 return 1; 58 59// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 60 if ((uint64_t)(4608 * 1024 * 1024)) 61 return 2; 62 63// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 64 if ((uint64_t)(4608 * 1024 * 1024 * i)) 65 return 3; 66 67// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 68 if ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL)) 69 return 4; 70 71// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 72 if ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))) 73 return 5; 74 75 switch (i) { 76// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 77 case 4608 * 1024 * 1024: 78 return 6; 79// expected-warning@+1 {{overflow in expression; result is 537919488 with type 'int'}} 80 case (uint64_t)(4609 * 1024 * 1024): 81 return 7; 82// expected-warning@+1 {{overflow in expression; result is 537919488 with type 'int'}} 83 case 1 + static_cast<uint64_t>(4609 * 1024 * 1024): 84 return 7; 85// expected-error@+2 {{expression is not an integral constant expression}} 86// expected-note@+1 {{read of non-const variable 'i' is not allowed in a constant expression}} 87 case ((uint64_t)(4608 * 1024 * 1024 * i)): 88 return 8; 89// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 90 case ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL)): 91 return 9; 92// expected-warning@+2 2{{overflow in expression; result is 536870912 with type 'int'}} 93// expected-warning@+1 {{overflow converting case value to switch condition type (288230376151711744 to 0)}} 94 case ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))): 95 return 10; 96 } 97 98// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 99 while (4608 * 1024 * 1024); 100 101// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 102 while ((uint64_t)(4608 * 1024 * 1024)); 103 104// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 105 while (static_cast<uint64_t>(4608 * 1024 * 1024)); 106 107// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 108 while ((uint64_t)(4608 * 1024 * 1024)); 109 110// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 111 while ((uint64_t)(4608 * 1024 * 1024 * i)); 112 113// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 114 while ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL)); 115 116// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 117 while ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))); 118 119// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 120 do { } while (4608 * 1024 * 1024); 121 122// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 123 do { } while ((uint64_t)(4608 * 1024 * 1024)); 124 125// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 126 do { } while (static_cast<uint64_t>(4608 * 1024 * 1024)); 127 128// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 129 do { } while ((uint64_t)(4608 * 1024 * 1024)); 130 131// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 132 do { } while ((uint64_t)(4608 * 1024 * 1024 * i)); 133 134// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 135 do { } while ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL)); 136 137// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 138 do { } while ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))); 139 140// expected-warning@+3 {{overflow in expression; result is 536870912 with type 'int'}} 141// expected-warning@+3 {{overflow in expression; result is 536870912 with type 'int'}} 142// expected-warning@+3 {{overflow in expression; result is 536870912 with type 'int'}} 143 for (uint64_t i = 4608 * 1024 * 1024; 144 (uint64_t)(4608 * 1024 * 1024); 145 i += (uint64_t)(4608 * 1024 * 1024 * i)); 146 147// expected-warning@+3 {{overflow in expression; result is 536870912 with type 'int'}} 148// expected-warning@+3 2{{overflow in expression; result is 536870912 with type 'int'}} 149// expected-warning@+3 2{{overflow in expression; result is 536870912 with type 'int'}} 150 for (uint64_t i = (1ULL * ((4608) * ((1024) * (1024))) + 2ULL); 151 ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))); 152 i = ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024)))); 153 154// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 155 _Complex long long x = 4608 * 1024 * 1024; 156 157// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 158 (__real__ x) = 4608 * 1024 * 1024; 159 160// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} 161 (__imag__ x) = 4608 * 1024 * 1024; 162 163// expected-warning@+4 {{overflow in expression; result is 536870912 with type 'int'}} 164// expected-warning@+3 {{array index 536870912 is past the end of the array (which contains 10 elements)}} 165// expected-note@+1 {{array 'a' declared here}} 166 uint64_t a[10]; 167 a[4608 * 1024 * 1024] = 1i; 168 169// expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} 170 return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024))); 171} 172