1 // RUN: %clang_cc1 %s -std=c++17 -pedantic -verify -triple=x86_64-apple-darwin9
2 
3 // Simple is_const implementation.
4 struct true_type {
5   static const bool value = true;
6 };
7 
8 struct false_type {
9   static const bool value = false;
10 };
11 
12 template <class T> struct is_const : false_type {};
13 template <class T> struct is_const<const T> : true_type {};
14 
15 // expected-no-diagnostics
16 
test_builtin_elementwise_abs()17 void test_builtin_elementwise_abs() {
18   const int a = 2;
19   int b = 1;
20   static_assert(!is_const<decltype(__builtin_elementwise_abs(a))>::value);
21   static_assert(!is_const<decltype(__builtin_elementwise_abs(b))>::value);
22 }
23 
test_builtin_elementwise_add_sat()24 void test_builtin_elementwise_add_sat() {
25   const int a = 2;
26   int b = 1;
27   static_assert(!is_const<decltype(__builtin_elementwise_add_sat(a, b))>::value);
28   static_assert(!is_const<decltype(__builtin_elementwise_add_sat(b, a))>::value);
29   static_assert(!is_const<decltype(__builtin_elementwise_add_sat(a, a))>::value);
30 }
31 
test_builtin_elementwise_sub_sat()32 void test_builtin_elementwise_sub_sat() {
33   const int a = 2;
34   int b = 1;
35   static_assert(!is_const<decltype(__builtin_elementwise_sub_sat(a, b))>::value);
36   static_assert(!is_const<decltype(__builtin_elementwise_sub_sat(b, a))>::value);
37   static_assert(!is_const<decltype(__builtin_elementwise_sub_sat(a, a))>::value);
38 }
39 
test_builtin_elementwise_max()40 void test_builtin_elementwise_max() {
41   const int a = 2;
42   int b = 1;
43   static_assert(!is_const<decltype(__builtin_elementwise_max(a, b))>::value);
44   static_assert(!is_const<decltype(__builtin_elementwise_max(b, a))>::value);
45   static_assert(!is_const<decltype(__builtin_elementwise_max(a, a))>::value);
46 }
47 
test_builtin_elementwise_min()48 void test_builtin_elementwise_min() {
49   const int a = 2;
50   int b = 1;
51   static_assert(!is_const<decltype(__builtin_elementwise_min(a, b))>::value);
52   static_assert(!is_const<decltype(__builtin_elementwise_min(b, a))>::value);
53   static_assert(!is_const<decltype(__builtin_elementwise_min(a, a))>::value);
54 }
55 
test_builtin_elementwise_ceil()56 void test_builtin_elementwise_ceil() {
57   const float a = 42.0;
58   float b = 42.3;
59   static_assert(!is_const<decltype(__builtin_elementwise_ceil(a))>::value);
60   static_assert(!is_const<decltype(__builtin_elementwise_ceil(b))>::value);
61 }
62