re PR middle-end/43057 ([LTO] fold check: original tree changed by fold)
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 22 Nov 2010 16:14:27 +0000 (17:14 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 22 Nov 2010 16:14:27 +0000 (17:14 +0100)
PR middle-end/43057
* fold-const.c (pedantic_non_lvalue_loc): Unshare x before
setting location.

From-SVN: r167037

gcc/ChangeLog
gcc/fold-const.c

index 87f56b7973b5a144b0a6895d148603ad0208ecd7..7a42a0191196870671c93e0fb21fd4156f45a9b6 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-21  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/43057
+       * fold-const.c (pedantic_non_lvalue_loc): Unshare x before
+       setting location.
+
 2010-11-22  Richard Guenther  <rguenther@suse.de>
 
        * gimple-fold.c (maybe_fold_reference): When canonicalizing
@@ -31,8 +37,8 @@
        (get_output_file_with_visibility): Updated comments and rewritten
        to use the new files_rules machinery.
 
-        * Makefile.in (XREGEX_H): Added variable.
-        (build/gengtype.o): Added dependencies for xregex.h and obstack.h
+       * Makefile.in (XREGEX_H): Added variable.
+       (build/gengtype.o): Added dependencies for xregex.h and obstack.h
 
 2010-11-21  Nathan Froyd  <froydnj@codesourcery.com>
 
 
        * doc/tm.texi.in (HANDLE_SYSV_PRAGMA,
        HANDLE_PRAGMA_PACK_PUSH_POP): Remove.
-       (HANDLE_PRAGMA_PACK_WITH_EXPANSION): Don't refer to
-       HANDLE_SYSV_PRAGMA.
+       (HANDLE_PRAGMA_PACK_WITH_EXPANSION): Don't refer to HANDLE_SYSV_PRAGMA.
        * doc/tm.texi: Regenerate.
        * system.h (HANDLE_PRAGMA_PACK_PUSH_POP, HANDLE_SYSV_PRAGMA,
        HANDLE_PRAGMA_WEAK): Poison.
index 9f1e0809a3cd224bc75f8ee7f8439e3d71161847..7306863ff97dbf0d7025fef685b74ccbbb114a60 100644 (file)
@@ -2097,7 +2097,16 @@ pedantic_non_lvalue_loc (location_t loc, tree x)
 {
   if (pedantic_lvalues)
     return non_lvalue_loc (loc, x);
-  protected_set_expr_location (x, loc);
+
+  if (CAN_HAVE_LOCATION_P (x)
+      && EXPR_LOCATION (x) != loc
+      && !(TREE_CODE (x) == SAVE_EXPR
+          || TREE_CODE (x) == TARGET_EXPR
+          || TREE_CODE (x) == BIND_EXPR))
+    {
+      x = copy_node (x);
+      SET_EXPR_LOCATION (x, loc);
+    }
   return x;
 }
 \f