xref: /llvm-project/clang/test/Sema/builtins-elementwise-math.c (revision ead449aee4c1bd3ad309185528c430fdbd06cf2f)
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