diff options
author | Jason Merrill <jason@redhat.com> | 2013-05-24 10:16:45 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-05-24 10:16:45 -0400 |
commit | f746a029232cc3a74ba6281ab0a3dda4f2ab8a6e (patch) | |
tree | 1a4232710fe2167dddf10c93dd23b2d4bdc4cb81 /gcc | |
parent | aea0101d9553c16556c3eb2ce66761e9dc95b40f (diff) | |
download | gcc-f746a029232cc3a74ba6281ab0a3dda4f2ab8a6e.zip gcc-f746a029232cc3a74ba6281ab0a3dda4f2ab8a6e.tar.gz gcc-f746a029232cc3a74ba6281ab0a3dda4f2ab8a6e.tar.bz2 |
re PR c++/57391 (ICE compiling AIX math.h caused by PR c++/56930)
PR c++/57391
* semantics.c (cxx_eval_constant_expression): Handle FMA_EXPR.
(cxx_eval_trinary_expression): Rename from cxx_eval_vec_perm_expr.
From-SVN: r199292
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 34 |
2 files changed, 21 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 885d4c9..585ab73 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-05-24 Jason Merrill <jason@redhat.com> + + PR c++/57391 + * semantics.c (cxx_eval_constant_expression): Handle FMA_EXPR. + (cxx_eval_trinary_expression): Rename from cxx_eval_vec_perm_expr. + 2013-05-23 Jason Merrill <jason@redhat.com> PR c++/57388 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c115d23..c1385c1 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7776,37 +7776,32 @@ non_const_var_error (tree r) } } -/* Evaluate VEC_PERM_EXPR (v1, v2, mask). */ +/* Subroutine of cxx_eval_constant_expression. + Like cxx_eval_unary_expression, except for trinary expressions. */ + static tree -cxx_eval_vec_perm_expr (const constexpr_call *call, tree t, - bool allow_non_constant, bool addr, - bool *non_constant_p, bool *overflow_p) +cxx_eval_trinary_expression (const constexpr_call *call, tree t, + bool allow_non_constant, bool addr, + bool *non_constant_p, bool *overflow_p) { int i; tree args[3]; tree val; - tree elttype = TREE_TYPE (t); for (i = 0; i < 3; i++) { args[i] = cxx_eval_constant_expression (call, TREE_OPERAND (t, i), allow_non_constant, addr, non_constant_p, overflow_p); - if (*non_constant_p) - goto fail; + VERIFY_CONSTANT (args[i]); } - gcc_assert (TREE_CODE (TREE_TYPE (args[0])) == VECTOR_TYPE); - gcc_assert (TREE_CODE (TREE_TYPE (args[1])) == VECTOR_TYPE); - gcc_assert (TREE_CODE (TREE_TYPE (args[2])) == VECTOR_TYPE); - - val = fold_ternary_loc (EXPR_LOCATION (t), VEC_PERM_EXPR, elttype, + val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t), args[0], args[1], args[2]); - if (val != NULL_TREE) - return val; - - fail: - return t; + if (val == NULL_TREE) + return t; + VERIFY_CONSTANT (val); + return val; } /* Attempt to reduce the expression T to a constant value. @@ -8106,9 +8101,10 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t, non_constant_p, overflow_p); break; + case FMA_EXPR: case VEC_PERM_EXPR: - r = cxx_eval_vec_perm_expr (call, t, allow_non_constant, addr, - non_constant_p, overflow_p); + r = cxx_eval_trinary_expression (call, t, allow_non_constant, addr, + non_constant_p, overflow_p); break; case CONVERT_EXPR: |