diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 30 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-builtin1.C | 25 |
4 files changed, 39 insertions, 27 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7f0b24e..b40b290 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c44c0ef..47b714f 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 7a5d30f..aa7354b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-01 Jason Merrill <jason@redhat.com> + + PR c++/49813 + * g++.dg/cpp0x/constexpr-builtin1.C: New. + 2011-08-01 Uros Bizjak <ubizjak@gmail.com> 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 0000000..b3f5576 --- /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. +} |