]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/14083 (ICE in conditional expression operator with throw)
authorGabriel Dos Reis <gdr@integrable-solutions.net>
Sun, 22 Feb 2004 17:02:12 +0000 (17:02 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Sun, 22 Feb 2004 17:02:12 +0000 (17:02 +0000)
Backport from mainline
        2004-02-13  Mark Mitchell  <mark@codesourcery.com>
PR c++/14083
* call.c (build_conditional_expr): Call force_rvalue on the
non-void operand in the case that one result is a throw-expression
and the other is not.

From-SVN: r78266

gcc/cp/ChangeLog
gcc/cp/call.c

index 86eb2c742cd18ca3621733ea134d6095c381627e..6420993903c4b36eb917dcce1f49bc0a4ea75907 100644 (file)
@@ -1,3 +1,12 @@
+2004-02-22  Gabriel Dos Reis  <gdr@integrable-solutions.net>
+
+       Backport from mainline
+        2004-02-13  Mark Mitchell  <mark@codesourcery.com>
+       PR c++/14083
+       * call.c (build_conditional_expr): Call force_rvalue on the
+       non-void operand in the case that one result is a throw-expression
+       and the other is not.
+
 2004-02-22  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        Backport from mainline
index 9971c3305d60eb06d96ceee5b5bddf8b5598b975..a8e4457f15a1964f749c72405a764ed04e5c1d39 100644 (file)
@@ -3243,10 +3243,20 @@ build_conditional_expr (arg1, arg2, arg3)
 
         --Both the second and the third operands have type void; the
           result is of type void and is an rvalue.  */
-      if ((TREE_CODE (arg2) == THROW_EXPR)
-         ^ (TREE_CODE (arg3) == THROW_EXPR))
-       result_type = ((TREE_CODE (arg2) == THROW_EXPR) 
-                      ? arg3_type : arg2_type);
+      if (TREE_CODE (arg2) == THROW_EXPR 
+         && TREE_CODE (arg3) != THROW_EXPR)
+       {
+         arg3 = force_rvalue (arg3);
+         arg3_type = TREE_TYPE (arg3);
+         result_type = arg3_type;
+       }
+      else if (TREE_CODE (arg2) != THROW_EXPR 
+              && TREE_CODE (arg3) == THROW_EXPR)
+       {
+         arg2 = force_rvalue (arg2);
+         arg2_type = TREE_TYPE (arg2);
+         result_type = arg2_type;
+       }
       else if (VOID_TYPE_P (arg2_type) && VOID_TYPE_P (arg3_type))
        result_type = void_type_node;
       else