[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    [PATCH] Constant expression evaluation support for __builtin_isinf
From:       Karthik Bhat <kv.bhat () samsung ! com>
Date:       2013-10-01 7:55:45
Message-ID: differential-rev-PHID-DREV-i2djgfajpbuosxvhzzag-req () llvm-reviews ! chandlerc ! com
[Download RAW message or body]

Hi rsmith, eli.friedman,

Hi,
Add const expression evaluation support for __builtin_isinf function.
This will prevent clang from reported errors in cases such as 
  constexpr long double num1 = __builtin_isinf(1.l); 

Please let me know if this patch is good to commit.

Thanks
Karthik Bhat

http://llvm-reviews.chandlerc.com/D1794

Files:
  test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
  lib/AST/ExprConstant.cpp

Index: test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
+++ test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
@@ -130,3 +130,20 @@
   template class B<A>; // expected-note {{here}}
 }
 #endif
+
+// __builtin_isinf
+inline constexpr bool
+isinf(long double __x) { 
+  return __builtin_isinf(__x);
+}
+
+inline constexpr bool
+isinf(double __x) { 
+  return __builtin_isinf(__x); 
+}
+
+void test_builtin_isinf() {
+  constexpr long double num1 = __builtin_isinf(1.l); // No error
+  constexpr long double num2 = isinf(1.l);           // No error
+  constexpr double num3 = isinf(1.);                 // No error
+}
Index: lib/AST/ExprConstant.cpp
===================================================================
--- lib/AST/ExprConstant.cpp
+++ lib/AST/ExprConstant.cpp
@@ -5984,6 +5984,12 @@
     return EvaluateFloat(E->getArg(0), Val, Info) &&
            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_parity:
   case Builtin::BI__builtin_parityl:

["D1794.1.patch" (text/x-patch)]

Index: test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
+++ test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp
@@ -130,3 +130,20 @@
   template class B<A>; // expected-note {{here}}
 }
 #endif
+
+// __builtin_isinf
+inline constexpr bool
+isinf(long double __x) { 
+  return __builtin_isinf(__x);
+}
+
+inline constexpr bool
+isinf(double __x) { 
+  return __builtin_isinf(__x); 
+}
+
+void test_builtin_isinf() {
+  constexpr long double num1 = __builtin_isinf(1.l); // No error
+  constexpr long double num2 = isinf(1.l);           // No error
+  constexpr double num3 = isinf(1.);                 // No error
+}
Index: lib/AST/ExprConstant.cpp
===================================================================
--- lib/AST/ExprConstant.cpp
+++ lib/AST/ExprConstant.cpp
@@ -5984,6 +5984,12 @@
     return EvaluateFloat(E->getArg(0), Val, Info) &&
            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_parity:
   case Builtin::BI__builtin_parityl:


_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic