1 // RUN: %clang_cc1 -verify -std=gnu++11 %s
2 // RUN: %clang_cc1 -verify -std=c++11 %s
3 // RUN: %clang_cc1 -triple powerpc64-linux -verify -std=c++11 %s
4 // RUN: %clang_cc1 -triple powerpc64-ibm-aix -target-feature +float128 -verify -std=c++11 %s
5 // RUN: %clang_cc1 -triple i686-windows-gnu -verify -std=c++11 %s
6 // RUN: %clang_cc1 -triple x86_64-windows-gnu -verify -std=c++11 %s
7 // RUN: %clang_cc1 -triple x86_64-windows-msvc -verify -std=c++11 %s
8
9 #if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
10
11 #if defined(__powerpc__)
12 template <typename> struct __is_float128 { static constexpr bool value = false; };
13 template <> struct __is_float128<__float128> { static constexpr bool value = true; };
14 static_assert(__is_float128<__ieee128>::value, "__ieee128 aliases to __float128");
15 #endif
16
17 __float128 f;
18 template<typename> struct __is_floating_point_helper {};
19 template<> struct __is_floating_point_helper<__float128> {};
g(int x,__float128 * y)20 int g(int x, __float128 *y) {
21 return x + *y;
22 }
23
24 // expected-no-error {{__float128 is not supported on this target}}
25 #else
26 #if !defined(__STRICT_ANSI__)
27 __float128 f; // expected-error {{__float128 is not supported on this target}}
28 // But this should work:
29 template<typename> struct __is_floating_point_helper {};
30 template<> struct __is_floating_point_helper<__float128> {}; // expected-error {{__float128 is not supported on this target}}
31
32 // FIXME: This could have a better diag.
g(int x,__float128 * y)33 int g(int x, __float128 *y) { // expected-error {{__float128 is not supported on this target}}
34 return x + *y;
35 }
36
37 #else
38 __float128 f; // expected-error {{__float128 is not supported on this target}}
39 template<typename> struct __is_floating_point_helper {};
40 template<> struct __is_floating_point_helper<__float128> {}; // expected-error {{__float128 is not supported on this target}}
41
g(int x,__float128 * y)42 int g(int x, __float128 *y) { // expected-error {{__float128 is not supported on this target}}
43 return x + *y;
44 }
45
46 #endif
47 #endif
48
49 #ifdef __powerpc__
50 __ibm128 i;
51 template <> struct __is_floating_point_helper<__ibm128> {};
w(int x,__ibm128 * y)52 int w(int x, __ibm128 *y) {
53 return x + *y;
54 }
55 // expected-no-error {{__ibm128 is not supported on this target}}
56 #else
57 __ibm128 i; // expected-error {{__ibm128 is not supported on this target}}
58 template <> struct __is_floating_point_helper<__ibm128> {}; // expected-error {{__ibm128 is not supported on this target}}
w(int x,__ibm128 * y)59 int w(int x, __ibm128 *y) { // expected-error {{__ibm128 is not supported on this target}}
60 return x + *y;
61 }
62 #endif
63