[PATCH] Constant expression evaluation support for __builtin_isinf
Karthik Bhat
kv.bhat at samsung.com
Wed Oct 2 22:42:23 PDT 2013
Hi Richard,
Added constexpr support for builtin isnan,isfinite and isnormal.
The test case here is actually to test constexpr support in buitin so i think we cannot put it in test/Sema/constant-builtins-2.c as we need -std=c++11 flag for constexpr which cannot be enabled in a .c file.
Moved the test cases to test/SemaCXX/constant-expression-cxx11.cpp. Is that fine?
Thanks
Karthik Bhat
Hi rsmith, eli.friedman,
http://llvm-reviews.chandlerc.com/D1794
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D1794?vs=4572&id=4615#toc
Files:
lib/AST/ExprConstant.cpp
test/SemaCXX/constant-expression-cxx11.cpp
Index: lib/AST/ExprConstant.cpp
===================================================================
--- lib/AST/ExprConstant.cpp
+++ lib/AST/ExprConstant.cpp
@@ -5985,6 +5985,30 @@
Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E);
}
+ case Builtin::BI__builtin_isinf: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isInfinity() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isfinite: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isFinite() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isnan: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isNaN() ? 1 : 0, E);
+ }
+
+ case Builtin::BI__builtin_isnormal: {
+ APFloat Val(0.0);
+ return EvaluateFloat(E->getArg(0), Val, Info) &&
+ Success(Val.isNormal() ? 1 : 0, E);
+ }
+
case Builtin::BI__builtin_parity:
case Builtin::BI__builtin_parityl:
case Builtin::BI__builtin_parityll: {
Index: test/SemaCXX/constant-expression-cxx11.cpp
===================================================================
--- test/SemaCXX/constant-expression-cxx11.cpp
+++ test/SemaCXX/constant-expression-cxx11.cpp
@@ -1794,3 +1794,63 @@
int k; // expected-note {{not initialized}}
};
}
+
+// Builtin constant expression evaluation-
+// __builtin_isinf
+void test_builtin_isinf() {
+
+ constexpr long double num1 = __builtin_isinf(1.l);
+ static_assert(num1 == 0, "");
+ constexpr double num2 = __builtin_isinf(1.);
+ static_assert(num2 == 0, "");
+ constexpr double num3 = __builtin_isinf(1.f);
+ static_assert(num3 == 0, "");
+ constexpr float num4 = __builtin_isinf(__builtin_inf());
+ static_assert(num4 == 1, "");
+}
+
+// __builtin_isfinite
+void test_builtin_isfinite() {
+
+ constexpr long double num1 = __builtin_isfinite(1.l);
+ static_assert(num1 == 1, "");
+ constexpr double num2 = __builtin_isfinite(1.);
+ static_assert(num2 == 1, "");
+ constexpr double num3 = __builtin_isfinite(1.f);
+ static_assert(num3 == 1, "");
+ constexpr float num4 = __builtin_isfinite(__builtin_inf());
+ static_assert(num4 == 0, "");
+
+}
+
+// __builtin_isnan
+void test_builtin_isnan() {
+
+ constexpr long double num1 = __builtin_isnan(1.l);
+ static_assert(num1 == 0, "");
+ constexpr double num2 = __builtin_isnan(1.);
+ static_assert(num2 == 0, "");
+ constexpr double num3 = __builtin_isnan(1.f);
+ static_assert(num3 == 0, "");
+ constexpr float num4 = __builtin_isnan(__builtin_inf());
+ static_assert(num4 == 0, "");
+ constexpr float num5 = __builtin_isnan(__builtin_nan(""));
+ static_assert(num5 == 1, "");
+}
+
+// __builtin_isnormal
+void test_builtin_isnormal() {
+
+ constexpr long double num1 = __builtin_isnormal(1.l);
+ static_assert(num1 == 1, "");
+ constexpr double num2 = __builtin_isnormal(1.);
+ static_assert(num2 == 1, "");
+ constexpr double num3 = __builtin_isnormal(1.f);
+ static_assert(num3 == 1, "");
+ constexpr float num4 = __builtin_isnormal(__builtin_inf());
+ static_assert(num4 == 0, "");
+ constexpr float num5 = __builtin_isnormal(__builtin_nan(""));
+ static_assert(num5 == 0, "");
+ constexpr float num6 = __builtin_isnormal(0.);
+ static_assert(num6 == 0, "");
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1794.2.patch
Type: text/x-patch
Size: 3315 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131002/085d0409/attachment.bin>
More information about the cfe-commits
mailing list