256 lines · cpp
1// RUN: %clang_cc1 %s -verify -fsyntax-only -std=gnu++98 -triple x86_64-pc-linux-gnu2// RUN: %clang_cc1 %s -verify -fsyntax-only -std=gnu++2a -triple x86_64-pc-linux-gnu3 4// RUN: %clang_cc1 %s -verify -fsyntax-only -std=gnu++98 -triple x86_64-pc-linux-gnu -fexperimental-new-constant-interpreter5// RUN: %clang_cc1 %s -verify -fsyntax-only -std=gnu++2a -triple x86_64-pc-linux-gnu -fexperimental-new-constant-interpreter6 7 8typedef unsigned long long uint64_t;9typedef unsigned int uint32_t;10 11// Check integer sizes.12int array64[sizeof(uint64_t) == 8 ? 1 : -1];13int array32[sizeof(uint32_t) == 4 ? 1 : -1];14int arrayint[sizeof(int) < sizeof(uint64_t) ? 1 : -1];15 16uint64_t f0(uint64_t);17uint64_t f1(uint64_t, uint32_t);18uint64_t f2(uint64_t, ...);19 20static const uint64_t overflow = 1 * 4608 * 1024 * 1024; // expected-warning {{overflow in expression; result is 536'870'912 with type 'int'}}21 22uint64_t check_integer_overflows(int i) { //expected-note 0+{{declared here}}23// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}24 uint64_t overflow = 4608 * 1024 * 1024,25// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}26 overflow2 = (uint64_t)(4608 * 1024 * 1024),27// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}28 overflow3 = (uint64_t)(4608 * 1024 * 1024 * i),29// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}30 overflow4 = (1ULL * ((4608) * ((1024) * (1024))) + 2ULL),31// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}32 overflow5 = static_cast<uint64_t>(4608 * 1024 * 1024),33// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}34 multi_overflow = (uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024));35 36// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}37 overflow += overflow2 = overflow3 = (uint64_t)(4608 * 1024 * 1024);38// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}39 overflow += overflow2 = overflow3 = 4608 * 1024 * 1024;40 41// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}42 overflow += overflow2 = overflow3 = static_cast<uint64_t>(4608 * 1024 * 1024);43 44 uint64_t not_overflow = 4608 * 1024 * 1024ULL;45 uint64_t not_overflow2 = (1ULL * ((uint64_t)(4608) * (1024 * 1024)) + 2ULL);46 47// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}48 overflow = 4608 * 1024 * 1024 ? 4608 * 1024 * 1024 : 0;49 50// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}51 overflow = 0 ? 0 : 4608 * 1024 * 1024;52 53// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}54 if (4608 * 1024 * 1024)55 return 0;56 57// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}58 if ((uint64_t)(4608 * 1024 * 1024))59 return 1;60 61// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}62 if (static_cast<uint64_t>(4608 * 1024 * 1024))63 return 1;64 65// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}66 if ((uint64_t)(4608 * 1024 * 1024))67 return 2;68 69// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}70 if ((uint64_t)(4608 * 1024 * 1024 * i))71 return 3;72 73// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}74 if ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL))75 return 4;76 77// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}78 if ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024)))79 return 5;80 81#if __cplusplus < 201103L82 switch (i) {83// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}84 case 4608 * 1024 * 1024:85 return 6;86// expected-warning@+1 {{overflow in expression; result is 537'919'488 with type 'int'}}87 case (uint64_t)(4609 * 1024 * 1024):88 return 7;89// expected-warning@+1 {{overflow in expression; result is 537'919'488 with type 'int'}}90 case 1 + static_cast<uint64_t>(4609 * 1024 * 1024):91 return 7;92// expected-error@+1 {{expression is not an integral constant expression}}93 case ((uint64_t)(4608 * 1024 * 1024 * i)):94 return 8;95// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}96 case ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL)):97 return 9;98// expected-warning@+2 2{{overflow in expression; result is 536'870'912 with type 'int'}}99// expected-warning@+1 {{overflow converting case value to switch condition type (288230376151711744 to 0)}}100 case ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024))):101 return 10;102 }103#endif104 105// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}106 while (4608 * 1024 * 1024);107 108// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}109 while ((uint64_t)(4608 * 1024 * 1024));110 111// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}112 while (static_cast<uint64_t>(4608 * 1024 * 1024));113 114// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}115 while ((uint64_t)(4608 * 1024 * 1024));116 117// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}118 while ((uint64_t)(4608 * 1024 * 1024 * i));119 120// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}121 while ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL));122 123// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}124 while ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024)));125 126// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}127 do { } while (4608 * 1024 * 1024);128 129// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}130 do { } while ((uint64_t)(4608 * 1024 * 1024));131 132// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}133 do { } while (static_cast<uint64_t>(4608 * 1024 * 1024));134 135// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}136 do { } while ((uint64_t)(4608 * 1024 * 1024));137 138// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}139 do { } while ((uint64_t)(4608 * 1024 * 1024 * i));140 141// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}142 do { } while ((1ULL * ((4608) * ((1024) * (1024))) + 2ULL));143 144// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}145 do { } while ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024)));146 147// expected-warning@+3 {{overflow in expression; result is 536'870'912 with type 'int'}}148// expected-warning@+3 {{overflow in expression; result is 536'870'912 with type 'int'}}149// expected-warning@+3 {{overflow in expression; result is 536'870'912 with type 'int'}}150 for (uint64_t i = 4608 * 1024 * 1024;151 (uint64_t)(4608 * 1024 * 1024);152 i += (uint64_t)(4608 * 1024 * 1024 * i));153 154// expected-warning@+3 {{overflow in expression; result is 536'870'912 with type 'int'}}155// expected-warning@+3 2{{overflow in expression; result is 536'870'912 with type 'int'}}156// expected-warning@+3 2{{overflow in expression; result is 536'870'912 with type 'int'}}157 for (uint64_t i = (1ULL * ((4608) * ((1024) * (1024))) + 2ULL);158 ((uint64_t)((uint64_t)(4608 * 1024 * 1024) * (uint64_t)(4608 * 1024 * 1024)));159 i = ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024))));160 161// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}162 _Complex long long x = 4608 * 1024 * 1024;163 164// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}165 (__real__ x) = 4608 * 1024 * 1024;166 167// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}168 (__imag__ x) = 4608 * 1024 * 1024;169 170// expected-warning@+2 {{overflow in expression; result is 536'870'912 with type 'int'}}171 uint64_t a[10];172 a[4608 * 1024 * 1024] = 1;173#if __cplusplus < 201103L174// expected-warning@-2 {{array index 536'870'912 is past the end of the array (that has type 'uint64_t[10]' (aka 'unsigned long long[10]'))}}175// expected-note@-4 {{array 'a' declared here}}176#endif177 178// expected-warning@+1 2{{overflow in expression; result is 536'870'912 with type 'int'}}179 return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024)));180}181 182void check_integer_overflows_in_function_calls() {183// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}184 (void)f0(4608 * 1024 * 1024);185 186// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}187 uint64_t x = f0(4608 * 1024 * 1024);188 189// expected-warning@+2 {{overflow in expression; result is 536'870'912 with type 'int'}}190 uint64_t (*f0_ptr)(uint64_t) = &f0;191 (void)(*f0_ptr)(4608 * 1024 * 1024);192 193// expected-warning@+1 {{overflow in expression; result is 536'870'912 with type 'int'}}194 (void)f2(0, f0(4608 * 1024 * 1024));195}196 197// Tests that ensure that evaluation-for-overflow of random expressions doesn't198// crash.199namespace EvaluationCrashes {200 namespace VirtualCallWithVbase {201 struct A {};202 struct B : virtual A {203 virtual bool f(const void *, int);204 };205 struct C : B {206 bool f(const void *, int);207 };208 int d;209 bool e(C c) {210 if (c.f(&d, d)) {}211 return true;212 }213 }214}215 216namespace GH31643 {217void f() {218 int a = -(1<<31); // expected-warning {{overflow in expression; result is -2'147'483'648 with type 'int'}}219}220}221 222#if __cplusplus >= 201103L223namespace GH63629 {224typedef long long int64_t;225 226template<typename T>227class u_ptr {228 T *ptr;229public:230 u_ptr(const u_ptr&) = delete;231 u_ptr &operator=(const u_ptr&) = delete;232 u_ptr(u_ptr &&other) : ptr(other.ptr) { other.ptr = 0; }233 u_ptr(T *ptr) : ptr(ptr) { }234 ~u_ptr() { delete ptr; }235};236 237u_ptr<bool> Wrap(int64_t x) {238 return nullptr;239}240 241int64_t Pass(int64_t x) { return x; }242 243int m() {244 int64_t x = Pass(30 * 24 * 60 * 59 * 1000); // expected-warning {{overflow in expression; result is -1'746'167'296 with type 'int'}}245 auto r = Wrap(Pass(30 * 24 * 60 * 59 * 1000)); // expected-warning {{overflow in expression; result is -1'746'167'296 with type 'int'}}246 return 0;247}248}249 250namespace GH46755 {251void f() {252 struct { int v; } &&r = {512 * 1024 * 1024 * 1024}; // expected-warning {{overflow in expression; result is 0 with type 'int'}}253}254}255#endif256