<div dir="ltr">On Wed, Oct 2, 2013 at 10:42 PM, Karthik Bhat <span dir="ltr"><<a href="mailto:kv.bhat@samsung.com" target="_blank">kv.bhat@samsung.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  Hi Richard,<br>
  Added constexpr support for builtin isnan,isfinite and isnormal.<br></blockquote><div><br></div><div>Thanks!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

  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.<br></blockquote>
<div><br></div><div>You can just follow the existing style of the tests in that file. You don't need to test constexpr specifically, testing constant evaluation of any form is fine, but it's better to keep all the related tests for this stuff in the same place. There's nothing specific to C++11 or constexpr here.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  Moved the test cases to test/SemaCXX/constant-expression-cxx11.cpp. Is that fine?</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  Thanks<br>
  Karthik Bhat<br>
<br>
Hi rsmith, eli.friedman,<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1794" target="_blank">http://llvm-reviews.chandlerc.com/D1794</a><br>
<br>
CHANGE SINCE LAST DIFF<br>
  <a href="http://llvm-reviews.chandlerc.com/D1794?vs=4572&id=4615#toc" target="_blank">http://llvm-reviews.chandlerc.com/D1794?vs=4572&id=4615#toc</a><br>
<br>
Files:<br>
  lib/AST/ExprConstant.cpp<br>
  test/SemaCXX/constant-expression-cxx11.cpp<br>
<div class="im"><br>
Index: lib/AST/ExprConstant.cpp<br>
===================================================================<br>
--- lib/AST/ExprConstant.cpp<br>
+++ lib/AST/ExprConstant.cpp<br>
</div>@@ -5985,6 +5985,30 @@<br>
<div class="im">            Success(Val.isInfinity() ? (Val.isNegative() ? -1 : 1) : 0, E);<br>
   }<br>
<br>
+  case Builtin::BI__builtin_isinf: {<br>
+    APFloat Val(0.0);<br>
+    return EvaluateFloat(E->getArg(0), Val, Info) &&<br>
+           Success(Val.isInfinity() ? 1 : 0, E);<br>
+  }<br>
</div>+<br>
+  case Builtin::BI__builtin_isfinite: {<br>
<div class="im">+    APFloat Val(0.0);<br>
+    return EvaluateFloat(E->getArg(0), Val, Info) &&<br>
</div>+           Success(Val.isFinite() ? 1 : 0, E);<br>
+  }<br>
+<br>
+  case Builtin::BI__builtin_isnan: {<br>
<div class="im">+    APFloat Val(0.0);<br>
+    return EvaluateFloat(E->getArg(0), Val, Info) &&<br>
</div>+           Success(Val.isNaN() ? 1 : 0, E);<br>
+  }<br>
+<br>
+  case Builtin::BI__builtin_isnormal: {<br>
<div class="im">+    APFloat Val(0.0);<br>
+    return EvaluateFloat(E->getArg(0), Val, Info) &&<br>
</div>+           Success(Val.isNormal() ? 1 : 0, E);<br>
<div class="im">+  }<br>
+<br>
   case Builtin::BI__builtin_parity:<br>
   case Builtin::BI__builtin_parityl:<br>
</div>   case Builtin::BI__builtin_parityll: {<br>
Index: test/SemaCXX/constant-expression-cxx11.cpp<br>
===================================================================<br>
--- test/SemaCXX/constant-expression-cxx11.cpp<br>
+++ test/SemaCXX/constant-expression-cxx11.cpp<br>
@@ -1794,3 +1794,63 @@<br>
     int k; // expected-note {{not initialized}}<br>
   };<br>
 }<br>
+<br>
+// Builtin constant expression evaluation-<br>
+// __builtin_isinf<br>
+void test_builtin_isinf() {<br>
<div class="im">+<br>
+  constexpr long double num1 = __builtin_isinf(1.l);<br>
</div>+  static_assert(num1 == 0, "");<br>
+  constexpr double num2 = __builtin_isinf(1.);<br>
+  static_assert(num2 == 0, "");<br>
+  constexpr double num3 = __builtin_isinf(1.f);<br>
+  static_assert(num3 == 0, "");<br>
+  constexpr float num4 = __builtin_isinf(__builtin_inf());<br>
+  static_assert(num4 == 1, "");<br>
+}<br>
+<br>
+// __builtin_isfinite<br>
+void test_builtin_isfinite() {<br>
+<br>
+  constexpr long double num1 = __builtin_isfinite(1.l);<br>
+  static_assert(num1 == 1, "");<br>
+  constexpr double num2 = __builtin_isfinite(1.);<br>
+  static_assert(num2 == 1, "");<br>
+  constexpr double num3 = __builtin_isfinite(1.f);<br>
+  static_assert(num3 == 1, "");<br>
+  constexpr float num4 = __builtin_isfinite(__builtin_inf());<br>
+  static_assert(num4 == 0, "");<br>
+<br>
+}<br>
+<br>
+// __builtin_isnan<br>
+void test_builtin_isnan() {<br>
+<br>
+  constexpr long double num1 = __builtin_isnan(1.l);<br>
+  static_assert(num1 == 0, "");<br>
+  constexpr double num2 = __builtin_isnan(1.);<br>
+  static_assert(num2 == 0, "");<br>
+  constexpr double num3 = __builtin_isnan(1.f);<br>
+  static_assert(num3 == 0, "");<br>
+  constexpr float num4 = __builtin_isnan(__builtin_inf());<br>
+  static_assert(num4 == 0, "");<br>
+  constexpr float num5 = __builtin_isnan(__builtin_nan(""));<br>
+  static_assert(num5 == 1, "");<br>
+}<br>
+<br>
+// __builtin_isnormal<br>
+void test_builtin_isnormal() {<br>
+<br>
+  constexpr long double num1 = __builtin_isnormal(1.l);<br>
+  static_assert(num1 == 1, "");<br>
+  constexpr double num2 = __builtin_isnormal(1.);<br>
+  static_assert(num2 == 1, "");<br>
+  constexpr double num3 = __builtin_isnormal(1.f);<br>
+  static_assert(num3 == 1, "");<br>
+  constexpr float num4 = __builtin_isnormal(__builtin_inf());<br>
+  static_assert(num4 == 0, "");<br>
+  constexpr float num5 = __builtin_isnormal(__builtin_nan(""));<br>
+  static_assert(num5 == 0, "");<br>
+  constexpr float num6 = __builtin_isnormal(0.);<br>
+  static_assert(num6 == 0, "");<br>
+}<br>
</blockquote></div><br></div></div>