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