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