re PR debug/66691 (ICE on valid code at -O3 with -g enabled in simplify_subreg, at...
[gcc.git] / gcc / convert.c
index 00907290c211479b2e4f492f3c19c36b7b4c0b06..c3cb0ae29aaa8e64a7f1c42d4f837fe90d1a8ec6 100644 (file)
@@ -1,5 +1,5 @@
 /* Utility routines for data type conversion for GCC.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
+   Copyright (C) 1987-2015 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -25,7 +25,10 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
+#include "alias.h"
+#include "symtab.h"
 #include "tree.h"
+#include "fold-const.h"
 #include "stor-layout.h"
 #include "flags.h"
 #include "convert.h"
@@ -885,12 +888,10 @@ convert_to_integer (tree type, tree expr)
 
     case REAL_TYPE:
       if (flag_sanitize & SANITIZE_FLOAT_CAST
-         && current_function_decl != NULL_TREE
-         && !lookup_attribute ("no_sanitize_undefined",
-                               DECL_ATTRIBUTES (current_function_decl)))
+         && do_ubsan_in_current_function ())
        {
          expr = save_expr (expr);
-         tree check = ubsan_instrument_float_cast (loc, type, expr);
+         tree check = ubsan_instrument_float_cast (loc, type, expr, expr);
          expr = build1 (FIX_TRUNC_EXPR, type, expr);
          if (check == NULL)
            return expr;
@@ -910,7 +911,9 @@ convert_to_integer (tree type, tree expr)
     case VECTOR_TYPE:
       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
        {
-         error ("can%'t convert between vector values of different size");
+         error ("can%'t convert a vector of type %qT"
+                " to type %qT which has different size",
+                TREE_TYPE (expr), type);
          return error_mark_node;
        }
       return build1 (VIEW_CONVERT_EXPR, type, expr);
@@ -994,7 +997,9 @@ convert_to_vector (tree type, tree expr)
     case VECTOR_TYPE:
       if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr))))
        {
-         error ("can%'t convert between vector values of different size");
+         error ("can%'t convert a value of type %qT"
+                " to vector type %qT which has different size",
+                TREE_TYPE (expr), type);
          return error_mark_node;
        }
       return build1 (VIEW_CONVERT_EXPR, type, expr);