aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-05-24 10:16:45 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-05-24 10:16:45 -0400
commitf746a029232cc3a74ba6281ab0a3dda4f2ab8a6e (patch)
tree1a4232710fe2167dddf10c93dd23b2d4bdc4cb81 /gcc
parentaea0101d9553c16556c3eb2ce66761e9dc95b40f (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/semantics.c34
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: