From: Marc Glisse Date: Thu, 2 Jan 2014 22:43:24 +0000 (+0100) Subject: re PR c++/59641 (ICE with invalid expression in vector arithmetic) X-Git-Tag: releases/gcc-4.9.0~1855 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=25c541b406c3aa49f9ca4db1982e06c5ec0ef796;p=thirdparty%2Fgcc.git re PR c++/59641 (ICE with invalid expression in vector arithmetic) 2014-01-02 Marc Glisse PR c++/59641 gcc/cp/ * call.c (build_conditional_expr_1): Check the return value of force_rvalue. gcc/testsuite/ * g++.dg/cpp0x/pr59641.C: New file. From-SVN: r206303 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 97e2d74c32b0..c77d86facec0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-01-02 Marc Glisse + + PR c++/59641 + * call.c (build_conditional_expr_1): Check the return value of + force_rvalue. + 2014-01-02 Marc Glisse * call.c (convert_like_real): Check complain. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index bff987140574..46b3748ead51 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4402,6 +4402,12 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, arg2 = force_rvalue (arg2, complain); arg3 = force_rvalue (arg3, complain); + /* force_rvalue can return error_mark on valid arguments. */ + if (error_operand_p (arg1) + || error_operand_p (arg2) + || error_operand_p (arg3)) + return error_mark_node; + tree arg1_type = TREE_TYPE (arg1); arg2_type = TREE_TYPE (arg2); arg3_type = TREE_TYPE (arg3); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12036de0e988..359421a406dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-02 Marc Glisse + + PR c++/59641 + * g++.dg/cpp0x/pr59641.C: New file. + 2014-01-02 Marc Glisse * g++.dg/cpp0x/initlist-explicit-sfinae.C: New file. diff --git a/gcc/testsuite/g++.dg/cpp0x/pr59641.C b/gcc/testsuite/g++.dg/cpp0x/pr59641.C new file mode 100644 index 000000000000..12e8f92861f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr59641.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++11" } +typedef int T __attribute__((vector_size(2*sizeof(int)))); + +void foo(T& r, const T& a, const T& b) +{ + constexpr T c = a < b; // { dg-error "constant" } + r = c ? a : b; +}