From: Jason Merrill Date: Mon, 1 Aug 2011 18:14:29 +0000 (-0400) Subject: re PR c++/49813 ([C++0x] sinh vs asinh vs constexpr) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0701bb567b104631c85fbb5987e10d86c3b86705;p=gcc.git re PR c++/49813 ([C++0x] sinh vs asinh vs constexpr) PR c++/49813 * semantics.c (potential_constant_expression_1): Allow any builtin. (morally_constexpr_builtin_function_p): Remove. From-SVN: r177066 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7f0b24ed536..b40b290fb50 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-08-01 Jason Merrill + + PR c++/49813 + * semantics.c (potential_constant_expression_1): Allow any builtin. + (morally_constexpr_builtin_function_p): Remove. + 2011-07-29 Jason Merrill PR c++/49867 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c44c0efd0ae..47b714fc04d 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7523,32 +7523,6 @@ check_automatic_or_tls (tree ref) } #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. @@ -7656,7 +7630,9 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) 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) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a5d30f47e9..aa7354b19b9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-01 Jason Merrill + + PR c++/49813 + * g++.dg/cpp0x/constexpr-builtin1.C: New. + 2011-08-01 Uros Bizjak PR target/49927 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C new file mode 100644 index 00000000000..b3f5576360b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C @@ -0,0 +1,25 @@ +// 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. +}