xref: /llvm-project/clang/test/Sema/builtins-reduction-math.c (revision 9440420f63b791126a13426b94339aeac575b50f)
1 // RUN: %clang_cc1 %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 void test_builtin_reduce_max(int i, float4 v, int3 iv) {
12   struct Foo s = __builtin_reduce_max(iv);
13   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
14 
15   i = __builtin_reduce_max(v, v);
16   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
17 
18   i = __builtin_reduce_max();
19   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
20 
21   i = __builtin_reduce_max(i);
22   // expected-error@-1 {{1st argument must be a vector type (was 'int')}}
23 }
24 
25 void test_builtin_reduce_min(int i, float4 v, int3 iv) {
26   struct Foo s = __builtin_reduce_min(iv);
27   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
28 
29   i = __builtin_reduce_min(v, v);
30   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
31 
32   i = __builtin_reduce_min();
33   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
34 
35   i = __builtin_reduce_min(i);
36   // expected-error@-1 {{1st argument must be a vector type (was 'int')}}
37 }
38 
39 void test_builtin_reduce_add(int i, float4 v, int3 iv) {
40   struct Foo s = __builtin_reduce_add(iv);
41   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
42 
43   i = __builtin_reduce_add();
44   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
45 
46   i = __builtin_reduce_add(iv, iv);
47   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
48 
49   i = __builtin_reduce_add(i);
50   // expected-error@-1 {{1st argument must be a vector of integers (was 'int')}}
51 
52   i = __builtin_reduce_add(v);
53   // expected-error@-1 {{1st argument must be a vector of integers (was 'float4' (vector of 4 'float' values))}}
54 }
55 
56 void test_builtin_reduce_mul(int i, float4 v, int3 iv) {
57   struct Foo s = __builtin_reduce_mul(iv);
58   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
59 
60   i = __builtin_reduce_mul();
61   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
62 
63   i = __builtin_reduce_mul(iv, iv);
64   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
65 
66   i = __builtin_reduce_mul(i);
67   // expected-error@-1 {{1st argument must be a vector of integers (was 'int')}}
68 
69   i = __builtin_reduce_mul(v);
70   // expected-error@-1 {{1st argument must be a vector of integers (was 'float4' (vector of 4 'float' values))}}
71 }
72 
73 void test_builtin_reduce_xor(int i, float4 v, int3 iv) {
74   struct Foo s = __builtin_reduce_xor(iv);
75   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
76 
77   i = __builtin_reduce_xor();
78   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
79 
80   i = __builtin_reduce_xor(iv, iv);
81   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
82 
83   i = __builtin_reduce_xor(i);
84   // expected-error@-1 {{1st argument must be a vector of integers (was 'int')}}
85 
86   i = __builtin_reduce_xor(v);
87   // expected-error@-1 {{1st argument must be a vector of integers (was 'float4' (vector of 4 'float' values))}}
88 }
89 
90 void test_builtin_reduce_or(int i, float4 v, int3 iv) {
91   struct Foo s = __builtin_reduce_or(iv);
92   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
93 
94   i = __builtin_reduce_or();
95   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
96 
97   i = __builtin_reduce_or(iv, iv);
98   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
99 
100   i = __builtin_reduce_or(i);
101   // expected-error@-1 {{1st argument must be a vector of integers (was 'int')}}
102 
103   i = __builtin_reduce_or(v);
104   // expected-error@-1 {{1st argument must be a vector of integers (was 'float4' (vector of 4 'float' values))}}
105 }
106 
107 void test_builtin_reduce_and(int i, float4 v, int3 iv) {
108   struct Foo s = __builtin_reduce_and(iv);
109   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'int'}}
110 
111   i = __builtin_reduce_and();
112   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
113 
114   i = __builtin_reduce_and(iv, iv);
115   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
116 
117   i = __builtin_reduce_and(i);
118   // expected-error@-1 {{1st argument must be a vector of integers (was 'int')}}
119 
120   i = __builtin_reduce_and(v);
121   // expected-error@-1 {{1st argument must be a vector of integers (was 'float4' (vector of 4 'float' values))}}
122 }
123 
124 void test_builtin_reduce_maximum(int i, float4 v, int3 iv) {
125   struct Foo s = __builtin_reduce_maximum(v);
126   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'float'}}
127 
128   i = __builtin_reduce_maximum(v, v);
129   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
130 
131   i = __builtin_reduce_maximum();
132   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
133 
134   i = __builtin_reduce_maximum(i);
135   // expected-error@-1 {{1st argument must be a vector of floating points (was 'int')}}
136 }
137 
138 void test_builtin_reduce_minimum(int i, float4 v, int3 iv) {
139   struct Foo s = __builtin_reduce_minimum(v);
140   // expected-error@-1 {{initializing 'struct Foo' with an expression of incompatible type 'float'}}
141 
142   i = __builtin_reduce_minimum(v, v);
143   // expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
144 
145   i = __builtin_reduce_minimum();
146   // expected-error@-1 {{too few arguments to function call, expected 1, have 0}}
147 
148   i = __builtin_reduce_minimum(i);
149   // expected-error@-1 {{1st argument must be a vector of floating points (was 'int')}}
150 }
151