1 // RUN: %clang_cc1 -std=c99 %s -pedantic -verify -triple=x86_64-apple-darwin9 2 3 typedef float float4 __attribute__((ext_vector_type(4))); 4 typedef int int3 __attribute__((ext_vector_type(3))); 5 typedef unsigned unsigned4 __attribute__((ext_vector_type(4))); 6 7 struct Foo { 8 char *p; 9 }; 10 11 __attribute__((address_space(1))) int int_as_one; 12 typedef int bar; 13 bar b; 14 15 void test_builtin_elementwise_abs(int i, double d, float4 v, int3 iv, unsigned u, unsigned4 uv) { 16 struct Foo s = __builtin_elementwise_abs(i); 17 // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}} 18 19 i = __builtin_elementwise_abs(); 20 // expected-error@-1 {{too few arguments to function call, expected 1, have 0}} 21 22 i = __builtin_elementwise_abs(i, i); 23 // expected-error@-1 {{too many arguments to function call, expected 1, have 2}} 24 25 i = __builtin_elementwise_abs(v); 26 // expected-error@-1 {{assigning to 'int' from incompatible type 'float4' (vector of 4 'float' values)}} 27 28 u = __builtin_elementwise_abs(u); 29 // expected-error@-1 {{1st argument must be a signed integer or floating point type (was 'unsigned int')}} 30 31 uv = __builtin_elementwise_abs(uv); 32 // expected-error@-1 {{1st argument must be a signed integer or floating point type (was 'unsigned4' (vector of 4 'unsigned int' values))}} 33 } 34 35 void test_builtin_elementwise_max(int i, short s, double d, float4 v, int3 iv, int *p) { 36 i = __builtin_elementwise_max(p, d); 37 // expected-error@-1 {{arguments are of different types ('int *' vs 'double')}} 38 39 struct Foo foo = __builtin_elementwise_max(i, i); 40 // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}} 41 42 i = __builtin_elementwise_max(i); 43 // expected-error@-1 {{too few arguments to function call, expected 2, have 1}} 44 45 i = __builtin_elementwise_max(); 46 // expected-error@-1 {{too few arguments to function call, expected 2, have 0}} 47 48 i = __builtin_elementwise_max(i, i, i); 49 // expected-error@-1 {{too many arguments to function call, expected 2, have 3}} 50 51 i = __builtin_elementwise_max(v, iv); 52 // expected-error@-1 {{arguments are of different types ('float4' (vector of 4 'float' values) vs 'int3' (vector of 3 'int' values))}} 53 54 s = __builtin_elementwise_max(i, s); 55 56 enum e { one, 57 two }; 58 i = __builtin_elementwise_max(one, two); 59 60 enum f { three }; 61 enum f x = __builtin_elementwise_max(one, three); 62 63 _BitInt(32) ext; // expected-warning {{'_BitInt' in C17 and earlier is a Clang extension}} 64 ext = __builtin_elementwise_max(ext, ext); 65 66 const int ci; 67 i = __builtin_elementwise_max(ci, i); 68 i = __builtin_elementwise_max(i, ci); 69 i = __builtin_elementwise_max(ci, ci); 70 71 i = __builtin_elementwise_max(i, int_as_one); // ok (attributes don't match)? 72 i = __builtin_elementwise_max(i, b); // ok (sugar doesn't match)? 73 74 int A[10]; 75 A = __builtin_elementwise_max(A, A); 76 // expected-error@-1 {{1st argument must be a vector, integer or floating point type (was 'int *')}} 77 78 int(ii); 79 int j; 80 j = __builtin_elementwise_max(i, j); 81 82 _Complex float c1, c2; 83 c1 = __builtin_elementwise_max(c1, c2); 84 // expected-error@-1 {{1st argument must be a vector, integer or floating point type (was '_Complex float')}} 85 } 86 87 void test_builtin_elementwise_min(int i, short s, double d, float4 v, int3 iv, int *p) { 88 i = __builtin_elementwise_min(p, d); 89 // expected-error@-1 {{arguments are of different types ('int *' vs 'double')}} 90 91 struct Foo foo = __builtin_elementwise_min(i, i); 92 // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}} 93 94 i = __builtin_elementwise_min(i); 95 // expected-error@-1 {{too few arguments to function call, expected 2, have 1}} 96 97 i = __builtin_elementwise_min(); 98 // expected-error@-1 {{too few arguments to function call, expected 2, have 0}} 99 100 i = __builtin_elementwise_min(i, i, i); 101 // expected-error@-1 {{too many arguments to function call, expected 2, have 3}} 102 103 i = __builtin_elementwise_min(v, iv); 104 // expected-error@-1 {{arguments are of different types ('float4' (vector of 4 'float' values) vs 'int3' (vector of 3 'int' values))}} 105 106 s = __builtin_elementwise_min(i, s); 107 108 enum e { one, 109 two }; 110 i = __builtin_elementwise_min(one, two); 111 112 enum f { three }; 113 enum f x = __builtin_elementwise_min(one, three); 114 115 _BitInt(32) ext; // expected-warning {{'_BitInt' in C17 and earlier is a Clang extension}} 116 ext = __builtin_elementwise_min(ext, ext); 117 118 const int ci; 119 i = __builtin_elementwise_min(ci, i); 120 i = __builtin_elementwise_min(i, ci); 121 i = __builtin_elementwise_min(ci, ci); 122 123 i = __builtin_elementwise_min(i, int_as_one); // ok (attributes don't match)? 124 i = __builtin_elementwise_min(i, b); // ok (sugar doesn't match)? 125 126 int A[10]; 127 A = __builtin_elementwise_min(A, A); 128 // expected-error@-1 {{1st argument must be a vector, integer or floating point type (was 'int *')}} 129 130 int(ii); 131 int j; 132 j = __builtin_elementwise_min(i, j); 133 134 _Complex float c1, c2; 135 c1 = __builtin_elementwise_min(c1, c2); 136 // expected-error@-1 {{1st argument must be a vector, integer or floating point type (was '_Complex float')}} 137 } 138