blob: 1825d0c6849650f279a54154e4eb330e211e05e4 [file] [log] [blame]
Florian Hahn1ef25d22021-10-26 15:38:32 +01001// RUN: %clang_cc1 -std=c99 %s -pedantic -verify -triple=x86_64-apple-darwin9
2
3typedef float float4 __attribute__((ext_vector_type(4)));
4typedef int int3 __attribute__((ext_vector_type(3)));
Florian Hahn01870d52021-10-27 18:15:17 +01005typedef unsigned unsigned4 __attribute__((ext_vector_type(4)));
Florian Hahn1ef25d22021-10-26 15:38:32 +01006
7struct Foo {
8 char *p;
9};
10
11__attribute__((address_space(1))) int int_as_one;
12typedef int bar;
13bar b;
14
Florian Hahn01870d52021-10-27 18:15:17 +010015void 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
Florian Hahn1ef25d22021-10-26 15:38:32 +010035void 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 _ExtInt(32) ext;
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
87void 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 _ExtInt(32) ext;
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}