1 // RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-apple-darwin10 %s 2 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -triple x86_64-apple-darwin10 %s 3 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -triple x86_64-apple-darwin10 -std=c++98 %s 4 // RUN: %clang_cc1 -x c++ -fsyntax-only -verify -triple x86_64-apple-darwin10 -std=c++11 %s 5 // rdar://11577384 6 // rdar://13423975 7 8 int f(int i) { 9 switch (i) { 10 case 2147483647 + 2: 11 #if (__cplusplus <= 199711L) // C or C++03 or earlier modes 12 // expected-warning@-2 {{overflow in expression; result is -2147483647 with type 'int'}} 13 #else 14 // expected-error@-4 {{case value is not a constant expression}} \ 15 // expected-note@-4 {{value 2147483649 is outside the range of representable values of type 'int'}} 16 #endif 17 return 1; 18 case 9223372036854775807L * 4: 19 #if (__cplusplus <= 199711L) 20 // expected-warning@-2 {{overflow in expression; result is -4 with type 'long'}} 21 #else 22 // expected-error@-4 {{case value is not a constant expression}} \ 23 // expected-note@-4 {{value 36893488147419103228 is outside the range of representable values of type 'long'}} 24 #endif 25 return 2; 26 case (123456 *789012) + 1: 27 #if (__cplusplus <= 199711L) 28 // expected-warning@-2 {{overflow in expression; result is -1375982336 with type 'int'}} 29 #else 30 // expected-error@-4 {{case value is not a constant expression}} \ 31 // expected-note@-4 {{value 97408265472 is outside the range of representable values of type 'int'}} 32 #endif 33 return 3; 34 case (2147483647*4)/4: 35 #if (__cplusplus <= 199711L) 36 // expected-warning@-2 {{overflow in expression; result is -4 with type 'int'}} 37 #else 38 // expected-error@-4 {{case value is not a constant expression}} \ 39 // expected-note@-4 {{value 8589934588 is outside the range of representable values of type 'int'}} 40 #endif 41 case (2147483647*4)%4: 42 #if (__cplusplus <= 199711L) 43 // expected-warning@-2 {{overflow in expression; result is -4 with type 'int'}} 44 #else 45 // expected-error@-4 {{case value is not a constant expression}} \ 46 // expected-note@-4 {{value 8589934588 is outside the range of representable values of type 'int'}} 47 #endif 48 return 4; 49 case 2147483647: 50 return 0; 51 } 52 return (i, 65537) * 65537; // expected-warning {{overflow in expression; result is 131073 with type 'int'}} \ 53 // expected-warning {{expression result unused}} 54 } 55 56 // rdar://18405357 57 unsigned long long l = 65536 * 65536; // expected-warning {{overflow in expression; result is 0 with type 'int'}} 58 unsigned long long l2 = 65536 * (unsigned)65536; 59 unsigned long long l3 = 65536 * 65536ULL; 60