11cb2d742eb6635aeab6132ee5f0b5781d39487d7Nico Weber// RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wno-string-plus-int -triple=i686-apple-darwin9 2143520261eb41411beb3e2a8cf6d8dc822db7d50Eli Friedman// This test needs to set the target because it uses __builtin_ia32_vec_ext_v4si 31b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 41b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test1(float a, int b) { 52d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith return __builtin_isless(a, b); // expected-note {{declared here}} 61b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 71b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test2(int a, int b) { 81b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner return __builtin_islessequal(a, b); // expected-error {{floating point type}} 91b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 101b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 111b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test3(double a, float b) { 121b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner return __builtin_isless(a, b); 131b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 141b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test4(int* a, double b) { 151b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner return __builtin_islessequal(a, b); // expected-error {{floating point type}} 161b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 171b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 181b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test5(float a, long double b) { 191b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner return __builtin_isless(a, b, b); // expected-error {{too many arguments}} 201b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 211b9a0793955070738cac6f04b5abe9496be9b317Chris Lattnerint test6(float a, long double b) { 221b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner return __builtin_islessequal(a); // expected-error {{too few arguments}} 231b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 241b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 251b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 261b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner#define CFSTR __builtin___CFStringMakeConstantString 275caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattnervoid test7() { 28634785ca8423b6dd6c15e80714a076c3aaa5a047Chris Lattner const void *X; 297da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian X = CFSTR("\242"); // expected-warning {{input conversion stopped}} 30db9e9e61f8311d8852bd15730f78e56f3ffa0508Ted Kremenek X = CFSTR("\0"); // no-warning 312fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu X = CFSTR(242); // expected-error {{CFString literal is not a string constant}} expected-warning {{incompatible integer to pointer conversion}} 32634785ca8423b6dd6c15e80714a076c3aaa5a047Chris Lattner X = CFSTR("foo", "bar"); // expected-error {{too many arguments to function call}} 331b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner} 341b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 3595e2c71181c7ec1ffea0066bbae49e8742bd0687Chris Lattner 365caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner// atomics. 375caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner 38d1969d803cfcc65f1c334df4cc89c7fdd33ee4c9Mike Stumpvoid test9(short v) { 395caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner unsigned i, old; 402fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif 415caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner old = __sync_fetch_and_add(); // expected-error {{too few arguments to function call}} 425caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner old = __sync_fetch_and_add(&old); // expected-error {{too few arguments to function call}} 4380a8eb76a0043271adcfee5cb1e643ce3927fcbfEli Friedman old = __sync_fetch_and_add((unsigned*)0, 42i); // expected-warning {{imaginary constants are a GNU extension}} 44d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth 45d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth // PR7600: Pointers are implicitly casted to integers and back. 46d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth void *old_ptr = __sync_val_compare_and_swap((void**)0, 0, 0); 47db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth 48db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth // Ensure the return type is correct even when implicit casts are stripped 49db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth // away. This triggers an assertion while checking the comparison otherwise. 50db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth if (__sync_fetch_and_add(&old, 1) == 1) { 51db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth } 525caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner} 5321190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner 542ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara// overloaded atomics should be declared only once. 552ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnaravoid test9_1(volatile int* ptr, int val) { 562ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add_4(ptr, val); 572ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara} 582ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnaravoid test9_2(volatile int* ptr, int val) { 592ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add(ptr, val); 602ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara} 612ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnaravoid test9_3(volatile int* ptr, int val) { 622ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add_4(ptr, val); 632ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add(ptr, val); 642ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add(ptr, val); 652ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add_4(ptr, val); 662ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara __sync_fetch_and_add_4(ptr, val); 672ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara} 6821190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner 6921190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner// rdar://7236819 7021190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattnervoid test10(void) __attribute__((noreturn)); 7121190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner 7221190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattnervoid test10(void) { 732fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif __asm__("int3"); 7421190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner __builtin_unreachable(); 752fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif 7621190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner // No warning about falling off the end of a noreturn function. 7721190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner} 7821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 7921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattnervoid test11(int X) { 802fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif switch (X) { 8121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case __builtin_eh_return_data_regno(0): // constant foldable. 8221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner break; 8321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 8421fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 855e8965525282a48fd34af05183b8c3705a5b00d5Eric Christopher __builtin_eh_return_data_regno(X); // expected-error {{argument to '__builtin_eh_return_data_regno' must be a constant integer}} 8621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner} 8721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 8850dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner// PR5062 8950dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattnervoid test12(void) __attribute__((__noreturn__)); 9050dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattnervoid test12(void) { 9150dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner __builtin_trap(); // no warning because trap is noreturn. 9250dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner} 939a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregor 949a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregorvoid test_unknown_builtin(int a, int b) { 95122de3e131a6902d22c97471520ec9005cca6f03Hans Wennborg __builtin_isles(a, b); // expected-error{{use of unknown builtin}} \ 96122de3e131a6902d22c97471520ec9005cca6f03Hans Wennborg // expected-note{{did you mean '__builtin_isless'?}} 979a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregor} 98dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer 99dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramerint test13() { 100dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer __builtin_eh_return(0, 0); // no warning, eh_return never returns. 101dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer} 102c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor 103c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor// <rdar://problem/8228293> 104c46111e821664fcdf54d07325a384570972e9caeDouglas Gregorvoid test14() { 105c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor int old; 106c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor old = __sync_fetch_and_min((volatile int *)&old, 1); 107c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor} 1081e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor 1091e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor// <rdar://problem/8336581> 1101e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregorvoid test15(const char *s) { 1111e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor __builtin_printf("string is %s\n", s); 1121e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor} 11375c29a012793292ff4578015a9113bf086156d7fChris Lattner 11475c29a012793292ff4578015a9113bf086156d7fChris Lattner// PR7885 11575c29a012793292ff4578015a9113bf086156d7fChris Lattnerint test16() { 11675c29a012793292ff4578015a9113bf086156d7fChris Lattner return __builtin_constant_p() + // expected-error{{too few arguments}} 11775c29a012793292ff4578015a9113bf086156d7fChris Lattner __builtin_constant_p(1, 2); // expected-error {{too many arguments}} 11875c29a012793292ff4578015a9113bf086156d7fChris Lattner} 119e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 120e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithconst int test17_n = 0; 121e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithconst char test17_c[] = {1, 2, 3, 0}; 122e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithconst char test17_d[] = {1, 2, 3, 4}; 123e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithtypedef int __attribute__((vector_size(16))) IntVector; 124e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithstruct Aggregate { int n; char c; }; 125e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithenum Enum { EnumValue1, EnumValue2 }; 126e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 127e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithtypedef __typeof(sizeof(int)) size_t; 128e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithsize_t strlen(const char *); 129e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 130e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithvoid test17() { 131e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#define ASSERT(...) { int arr[(__VA_ARGS__) ? 1 : -1]; } 132e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#define T(...) ASSERT(__builtin_constant_p(__VA_ARGS__)) 133e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#define F(...) ASSERT(!__builtin_constant_p(__VA_ARGS__)) 134e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 135e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // __builtin_constant_p returns 1 if the argument folds to: 136e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // - an arithmetic constant with value which is known at compile time 137e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T(test17_n); 138e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T(&test17_c[3] - test17_c); 139e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T(3i + 5); // expected-warning {{imaginary constant}} 140e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T(4.2 * 7.6); 141e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T(EnumValue1); 142e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T((enum Enum)(int)EnumValue2); 143e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 144e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // - the address of the first character of a string literal, losslessly cast 145e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // to any type 146e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T("string literal"); 147e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T((double*)"string literal"); 148e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T("string literal" + 0); 149e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith T((long)"string literal"); 150e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 151e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // ... and otherwise returns 0. 152e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F("string literal" + 1); 153e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F(&test17_n); 154e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F(test17_c); 155e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F(&test17_c); 156e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F(&test17_d); 157e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F((struct Aggregate){0, 1}); 158e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith F((IntVector){0, 1, 2, 3}); 159e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 160e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // Ensure that a technique used in glibc is handled correctly. 161e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#define OPT(...) (__builtin_constant_p(__VA_ARGS__) && strlen(__VA_ARGS__) < 4) 162e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // FIXME: These are incorrectly treated as ICEs because strlen is treated as 163e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // a builtin. 164e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(OPT("abc")); 165e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT("abcd")); 166e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // In these cases, the strlen is non-constant, but the __builtin_constant_p 167e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith // is 0: the array size is not an ICE but is foldable. 168e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT(test17_c)); // expected-warning {{folded}} 169e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT(&test17_c[0])); // expected-warning {{folded}} 170e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT((char*)test17_c)); // expected-warning {{folded}} 171e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT(test17_d)); // expected-warning {{folded}} 172e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT(&test17_d[0])); // expected-warning {{folded}} 173e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ASSERT(!OPT((char*)test17_d)); // expected-warning {{folded}} 174e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 175e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#undef OPT 176e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#undef T 177e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith#undef F 178e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith} 1798bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling 1808bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendlingvoid test18() { 1818bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling char src[1024]; 1828bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling char dst[2048]; 1838bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling size_t result; 1848bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling void *ptr; 1858bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling 1868bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src), sizeof(dst)); 1878bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling result = __builtin___strlcpy_chk(dst, src, sizeof(src), sizeof(dst)); 1888bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling result = __builtin___strlcat_chk(dst, src, sizeof(src), sizeof(dst)); 1898bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling 1908bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src)); // expected-error {{too few arguments to function call}} 1918bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ptr = __builtin___strlcpy_chk(dst, src, sizeof(src), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} 1928bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ptr = __builtin___strlcat_chk(dst, src, sizeof(src), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} 1938bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling} 194f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner 195f2941ec5bfcce36feffac514582d168b4e0ef811Reid Klecknervoid no_ms_builtins() { 196f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner __assume(1); // expected-warning {{implicit declaration}} 197f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner __noop(1); // expected-warning {{implicit declaration}} 198f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner __debugbreak(); // expected-warning {{implicit declaration}} 199f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner} 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid unavailable() { 202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines __builtin_operator_new(0); // expected-error {{'__builtin_operator_new' is only available in C++}} 203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines __builtin_operator_delete(0); // expected-error {{'__builtin_operator_delete' is only available in C++}} 204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 205