+2011-08-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/49813
+ * semantics.c (potential_constant_expression_1): Allow any builtin.
+ (morally_constexpr_builtin_function_p): Remove.
+
2011-07-29 Jason Merrill <jason@redhat.com>
PR c++/49867
}
#endif
-/* Return true if the DECL designates a builtin function that is
- morally constexpr, in the sense that its parameter types and
- return type are literal types and the compiler is allowed to
- fold its invocations. */
-
-static bool
-morally_constexpr_builtin_function_p (tree decl)
-{
- tree funtype = TREE_TYPE (decl);
- tree t;
-
- if (!is_builtin_fn (decl))
- return false;
- if (!literal_type_p (TREE_TYPE (funtype)))
- return false;
- for (t = TYPE_ARG_TYPES (funtype); t != NULL ; t = TREE_CHAIN (t))
- {
- if (t == void_list_node)
- return true;
- if (!literal_type_p (TREE_VALUE (t)))
- return false;
- }
- /* We assume no varargs builtins are suitable. */
- return t != NULL;
-}
-
/* Return true if T denotes a potentially constant expression. Issue
diagnostic as appropriate under control of FLAGS. If WANT_RVAL is true,
an lvalue-rvalue conversion is implied.
if (builtin_valid_in_constant_expr_p (fun))
return true;
if (!DECL_DECLARED_CONSTEXPR_P (fun)
- && !morally_constexpr_builtin_function_p (fun))
+ /* Allow any built-in function; if the expansion
+ isn't constant, we'll deal with that then. */
+ && !is_builtin_fn (fun))
{
if (flags & tf_error)
{
--- /dev/null
+// PR c++/49813
+// { dg-options -std=c++0x }
+
+inline constexpr bool
+isinf(long double __x)
+{ return __builtin_isinf(__x); }
+
+inline constexpr bool
+isinf(double __x)
+{ return __builtin_isinf(__x); }
+
+inline constexpr bool
+isnan(long double __x)
+{ return __builtin_isnan(__x); }
+
+int main()
+{
+ constexpr long double num1 = __builtin_isinf(1.l); // Ok.
+
+ constexpr long double num2 = isinf(1.l); // Error.
+
+ constexpr double num3 = isinf(1.); // Ok.
+
+ constexpr long double num4 = isnan(1.l); // Ok.
+}