> That wasn't my question.
> 
>      tem = fold_build2_loc (loc, code, type,
>                             fold_convert_loc (loc, TREE_TYPE (op0),
>                                               TREE_OPERAND (arg0, 1)), op1);
>      protected_set_expr_location (tem, loc);
> 
> here tem is built by calling fold_build2_loc.  So why is the location
> of tem not loc after that.  This sounds like the actual bug
> (and the protected_set_expr_location should be redundant).

Indeed, the culprit is fold_convert_loc which is not setting the location.

OK for trunk pending tests?

        PR bootstrap/41451
        * fold-const.c (fold_convert_loc): Return a new node if all we're
        going to change is the location.
        (fold_binary_loc): Do not call protected_set_expr_location if
        unecessary.

Index: fold-const.c
===================================================================
--- fold-const.c        (revision 153549)
+++ fold-const.c        (working copy)
@@ -2635,7 +2635,13 @@ fold_convert_loc (location_t loc, tree t
   tree tem;
 
   if (type == orig)
-    return arg;
+    {
+      if (!CAN_HAVE_LOCATION_P (arg) || EXPR_LOCATION (arg) == loc)
+       return arg;
+      arg = copy_node (arg);
+      SET_EXPR_LOCATION (arg, loc);
+      return arg;
+    }
 
   if (TREE_CODE (arg) == ERROR_MARK
       || TREE_CODE (type) == ERROR_MARK
@@ -10134,7 +10140,6 @@ fold_binary_loc (location_t loc,
          tem = fold_build2_loc (loc, code, type,
                             fold_convert_loc (loc, TREE_TYPE (op0),
                                               TREE_OPERAND (arg0, 1)), op1);
-         protected_set_expr_location (tem, loc);
          tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0), tem);
          goto fold_binary_exit;
        }
@@ -10144,7 +10149,6 @@ fold_binary_loc (location_t loc,
          tem = fold_build2_loc (loc, code, type, op0,
                             fold_convert_loc (loc, TREE_TYPE (op1),
                                               TREE_OPERAND (arg1, 1)));
-         protected_set_expr_location (tem, loc);
          tem = build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0), tem);
          goto fold_binary_exit;
        }

Reply via email to