summaryrefslogtreecommitdiffstats
path: root/clang/test/Sema/float128-ld-incompatibility.cpp
diff options
context:
space:
mode:
authorNemanja Ivanovic <nemanja.i.ibm@gmail.com>2016-05-09 08:52:33 +0000
committerNemanja Ivanovic <nemanja.i.ibm@gmail.com>2016-05-09 08:52:33 +0000
commitbb1ea2d6139a72340b426e114510c46d938645a6 (patch)
treebe829c4bed58e4b64889d398ce23371f295bfac4 /clang/test/Sema/float128-ld-incompatibility.cpp
parent0f450b6b9a85a63021bfb1f7aed263e19d3743f2 (diff)
downloadbcm5719-llvm-bb1ea2d6139a72340b426e114510c46d938645a6.tar.gz
bcm5719-llvm-bb1ea2d6139a72340b426e114510c46d938645a6.zip
Enable support for __float128 in Clang and enable it on pertinent platforms
This patch corresponds to reviews: http://reviews.llvm.org/D15120 http://reviews.llvm.org/D19125 It adds support for the __float128 keyword, literals and target feature to enable it. Based on the latter of the two aforementioned reviews, this feature is enabled on Linux on i386/X86 as well as SystemZ. This is also the second attempt in commiting this feature. The first attempt did not enable it on required platforms which caused failures when compiling type_traits with -std=gnu++11. If you see failures with compiling this header on your platform after this commit, it is likely that your platform needs to have this feature enabled. llvm-svn: 268898
Diffstat (limited to 'clang/test/Sema/float128-ld-incompatibility.cpp')
-rw-r--r--clang/test/Sema/float128-ld-incompatibility.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Sema/float128-ld-incompatibility.cpp b/clang/test/Sema/float128-ld-incompatibility.cpp
new file mode 100644
index 00000000000..d993ed7b081
--- /dev/null
+++ b/clang/test/Sema/float128-ld-incompatibility.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 \
+// RUN: -triple powerpc64le-unknown-linux-gnu -target-cpu pwr8 \
+// RUN: -target-feature +float128 %s
+
+__float128 qf();
+long double ldf();
+
+// FIXME: once operations between long double and __float128 are implemented for
+// targets where the types are different, these next two will change
+long double ld{qf()}; // expected-error {{cannot initialize a variable of type 'long double' with an rvalue of type '__float128'}}
+__float128 q{ldf()}; // expected-error {{cannot initialize a variable of type '__float128' with an rvalue of type 'long double'}}
+
+auto test1(__float128 q, long double ld) -> decltype(q + ld) { // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+ return q + ld; // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+}
+
+auto test2(long double a, __float128 b) -> decltype(a + b) { // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+ return a + b; // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+}
+
+void test3(bool b) {
+ long double ld;
+ __float128 q;
+
+ ld + q; // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+ q + ld; // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+ ld - q; // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+ q - ld; // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+ ld * q; // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+ q * ld; // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+ ld / q; // expected-error {{invalid operands to binary expression ('long double' and '__float128')}}
+ q / ld; // expected-error {{invalid operands to binary expression ('__float128' and 'long double')}}
+ ld = q; // expected-error {{assigning to 'long double' from incompatible type '__float128'}}
+ q = ld; // expected-error {{assigning to '__float128' from incompatible type 'long double'}}
+ q + b ? q : ld; // expected-error {{incompatible operand types ('__float128' and 'long double')}}
+}
OpenPOWER on IntegriCloud