PR tree-optimization/86650 - -Warray-bounds missing inlining context
authorMartin Sebor <msebor@redhat.com>
Wed, 1 Aug 2018 23:39:35 +0000 (23:39 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 1 Aug 2018 23:39:35 +0000 (17:39 -0600)
gcc/c/ChangeLog:

PR tree-optimization/86650
* c-objc-common.c (c_tree_printer): Move usage of EXPR_LOCATION (t)
and TREE_BLOCK (t) from within percent_K_format to this callsite.

gcc/c-family/ChangeLog:

PR tree-optimization/86650
* c-family/c-format.c (gcc_tdiag_char_table): Update comment for "%G".
(gcc_cdiag_char_table, gcc_cxxdiag_char_table): Same.
  (init_dynamic_diag_info): Update from "gcall *" to "gimple *".
  * c-format.h (T89_G): Update to be "gimple *" rather than
  "gcall *".
(local_gcall_ptr_node): Rename...
  (local_gimple_ptr_node): ...to this.

gcc/cp/ChangeLog:

PR tree-optimization/86650
* error.c (cp_printer): Move usage of EXPR_LOCATION (t) and
TREE_BLOCK (t) from within percent_K_format to this callsite.

gcc/ChangeLog:

PR tree-optimization/86650
* gimple-pretty-print.c (percent_G_format): Accept a "gimple *"
rather than a "gcall *".  Directly pass the data of interest
  to percent_K_format, rather than building a temporary CALL_EXPR
  to hold it.
* gimple-fold.c (gimple_fold_builtin_strncpy): Adjust.
(gimple_fold_builtin_strncat): Adjust.
* gimple-ssa-warn-restrict.h (check_bounds_or_overlap): Replace
gcall* argument with gimple*.
* gimple-ssa-warn-restrict.c (check_call): Same.
(wrestrict_dom_walker::before_dom_children): Same.
(builtin_access::builtin_access): Same.
(check_bounds_or_overlap): Same
(maybe_diag_overlap): Same.
(maybe_diag_offset_bounds): Same.
* tree-diagnostic.c (default_tree_printer): Move usage of
EXPR_LOCATION (t) and TREE_BLOCK (t) from within percent_K_format
to this callsite.
* tree-pretty-print.c (percent_K_format): Add argument.
* tree-pretty-print.h: Add argument.
* tree-ssa-ccp.c (pass_post_ipa_warn::execute): Adjust.
* tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Adjust.
(maybe_diag_stxncpy_trunc): Same.
(handle_builtin_stxncpy): Same.
(handle_builtin_strcat): Same.

gcc/testsuite/ChangeLog:

PR tree-optimization/86650
* gcc.dg/format/gcc_diag-10.c: Adjust.

From-SVN: r263239

19 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-format.c
gcc/c-family/c-format.h
gcc/c/ChangeLog
gcc/c/c-objc-common.c
gcc/cp/ChangeLog
gcc/cp/error.c
gcc/gimple-fold.c
gcc/gimple-pretty-print.c
gcc/gimple-ssa-warn-restrict.c
gcc/gimple-ssa-warn-restrict.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/format/gcc_diag-10.c
gcc/tree-diagnostic.c
gcc/tree-pretty-print.c
gcc/tree-pretty-print.h
gcc/tree-ssa-ccp.c
gcc/tree-ssa-strlen.c

index 2e4ed90d447fa18768b571575bba78966acd07ba..9b767bac0fe2af723e738b712849490d04df93b1 100644 (file)
@@ -1,3 +1,31 @@
+2018-08-01  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/86650
+       * gimple-pretty-print.c (percent_G_format): Accept a "gimple *"
+       rather than a "gcall *".  Directly pass the data of interest
+       to percent_K_format, rather than building a temporary CALL_EXPR
+       to hold it.
+       * gimple-fold.c (gimple_fold_builtin_strncpy): Adjust.
+       (gimple_fold_builtin_strncat): Adjust.
+       * gimple-ssa-warn-restrict.h (check_bounds_or_overlap): Replace
+       gcall* argument with gimple*.
+       * gimple-ssa-warn-restrict.c (check_call): Same.
+       (wrestrict_dom_walker::before_dom_children): Same.
+       (builtin_access::builtin_access): Same.
+       (check_bounds_or_overlap): Same
+       (maybe_diag_overlap): Same.
+       (maybe_diag_offset_bounds): Same.
+       * tree-diagnostic.c (default_tree_printer): Move usage of
+       EXPR_LOCATION (t) and TREE_BLOCK (t) from within percent_K_format
+       to this callsite.
+       * tree-pretty-print.c (percent_K_format): Add argument.
+       * tree-pretty-print.h: Add argument.
+       * tree-ssa-ccp.c (pass_post_ipa_warn::execute): Adjust.
+       * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Adjust.
+       (maybe_diag_stxncpy_trunc): Same.
+       (handle_builtin_stxncpy): Same.
+       (handle_builtin_strcat): Same.
+
 2018-08-01  Richard Sandiford  <richard.sandiford@arm.com>
 
        * match.pd: Optimise pointer range checks.
index eb9cbc5bb06b56be1939a05f6b2fce444985fc9a..d5e5fff3b47580449054163a04ccc074e55ec081 100644 (file)
@@ -1,3 +1,14 @@
+2018-08-01  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/86650
+       * c-family/c-format.c (gcc_tdiag_char_table): Update comment for "%G".
+       (gcc_cdiag_char_table, gcc_cxxdiag_char_table): Same.
+       (init_dynamic_diag_info): Update from "gcall *" to "gimple *".
+       * c-format.h (T89_G): Update to be "gimple *" rather than
+       "gcall *".
+       (local_gcall_ptr_node): Rename...
+       (local_gimple_ptr_node): ...to this.
+
 2018-07-31  David Malcolm  <dmalcolm@redhat.com>
 
        * c-format.c (PP_FORMAT_CHAR_TABLE): New macro, based on existing
index 82841e454c756795c1ad1960c0c2a86a08577aed..dc0e7567c9416877d9d6025b6c41fe7aa58faf26 100644 (file)
@@ -56,7 +56,7 @@ struct function_format_info
 
 /* Initialized in init_dynamic_diag_info.  */
 static GTY(()) tree local_tree_type_node;
-static GTY(()) tree local_gcall_ptr_node;
+static GTY(()) tree local_gimple_ptr_node;
 static GTY(()) tree locus;
 
 static bool decode_format_attr (tree, function_format_info *, int);
@@ -719,7 +719,7 @@ static const format_char_info gcc_tdiag_char_table[] =
   { "E", 1, STD_C89, { T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "q+", "",   NULL },
   { "K", 1, STD_C89, { T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "", "\"",   NULL },
 
-  /* G requires a "gcall*" argument at runtime.  */
+  /* G requires a "gimple*" argument at runtime.  */
   { "G", 1, STD_C89, { T89_G,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "", "\"",   NULL },
 
   { NULL,  0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
@@ -737,7 +737,7 @@ static const format_char_info gcc_cdiag_char_table[] =
   { "E",   1, STD_C89, { T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "q+", "",   NULL },
   { "K",   1, STD_C89, { T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "", "\"",   NULL },
 
-  /* G requires a "gcall*" argument at runtime.  */
+  /* G requires a "gimple*" argument at runtime.  */
   { "G",   1, STD_C89, { T89_G,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "", "\"",   NULL },
 
   { "v",   0, STD_C89, { T89_I,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "q#",  "",   NULL },
@@ -757,7 +757,7 @@ static const format_char_info gcc_cxxdiag_char_table[] =
   { "E", 1,STD_C89,{ T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "q+#",   "",   NULL },
   { "K", 1, STD_C89,{ T89_T,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   "\"",   NULL },
 
-  /* G requires a "gcall*" argument at runtime.  */
+  /* G requires a "gimple*" argument at runtime.  */
   { "G", 1, STD_C89,{ T89_G,   BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN,  BADLEN  }, "",   "\"",   NULL },
 
   /* These accept either an 'int' or an 'enum tree_code' (which is handled as an 'int'.)  */
@@ -3838,27 +3838,27 @@ init_dynamic_diag_info (void)
        local_tree_type_node = void_type_node;
     }
 
-  /* Similar to the above but for gcall*.  */
-  if (!local_gcall_ptr_node
-      || local_gcall_ptr_node == void_type_node)
+  /* Similar to the above but for gimple*.  */
+  if (!local_gimple_ptr_node
+      || local_gimple_ptr_node == void_type_node)
     {
-      if ((local_gcall_ptr_node = maybe_get_identifier ("gcall")))
+      if ((local_gimple_ptr_node = maybe_get_identifier ("gimple")))
        {
-         local_gcall_ptr_node
-           = identifier_global_value (local_gcall_ptr_node);
-         if (local_gcall_ptr_node)
+         local_gimple_ptr_node
+           = identifier_global_value (local_gimple_ptr_node);
+         if (local_gimple_ptr_node)
            {
-             if (TREE_CODE (local_gcall_ptr_node) != TYPE_DECL)
+             if (TREE_CODE (local_gimple_ptr_node) != TYPE_DECL)
                {
-                 error ("%<gcall%> is not defined as a type");
-                 local_gcall_ptr_node = 0;
+                 error ("%<gimple%> is not defined as a type");
+                 local_gimple_ptr_node = 0;
                }
              else
-               local_gcall_ptr_node = TREE_TYPE (local_gcall_ptr_node);
+               local_gimple_ptr_node = TREE_TYPE (local_gimple_ptr_node);
            }
        }
       else
-       local_gcall_ptr_node = void_type_node;
+       local_gimple_ptr_node = void_type_node;
     }
 
   static tree hwi;
index f828e770c2fb828eb801a0132e1fab4dcaac9e4b..d984d10e2fa013511d7221b0937e561f746675b7 100644 (file)
@@ -298,7 +298,7 @@ struct format_kind_info
 #define T_UC   &unsigned_char_type_node
 #define T99_UC { STD_C99, NULL, T_UC }
 #define T_V    &void_type_node
-#define T89_G   { STD_C89, NULL, &local_gcall_ptr_node }
+#define T89_G   { STD_C89, NULL, &local_gimple_ptr_node }
 #define T89_T   { STD_C89, NULL, &local_tree_type_node }
 #define T89_V  { STD_C89, NULL, T_V }
 #define T_W    &wchar_type_node
index 0c845e27c6d6180bbf04cae5dd962c6440f88340..6e682cdb140e27631303380f9be66257b27fcb95 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-01  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/86650
+       * c-objc-common.c (c_tree_printer): Move usage of EXPR_LOCATION (t)
+       and TREE_BLOCK (t) from within percent_K_format to this callsite.
+
 2018-08-01  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/85704
index a841bc14d60e0d90163c4ad265e644eae4f75be6..ddbd60ce624804a547e962df030b0cf82e4b3d5e 100644 (file)
@@ -67,7 +67,7 @@ c_objc_common_init (void)
    %D: a general decl,
    %E: an identifier or expression,
    %F: a function declaration,
-   %G: a Gimple call statement,
+   %G: a Gimple statement,
    %K: a CALL_EXPR,
    %T: a type.
    %V: a list of type qualifiers from a tree.
@@ -99,7 +99,7 @@ c_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
   if (*spec == 'K')
     {
       t = va_arg (*text->args_ptr, tree);
-      percent_K_format (text, t);
+      percent_K_format (text, EXPR_LOCATION (t), TREE_BLOCK (t));
       return true;
     }
 
index d66c195131c955a4a7560890b8ee4cd7a1c2fd14..98b5ebfe881c9cc03f5e915c2aeed6b0aea7083a 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-01  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/86650
+       * error.c (cp_printer): Move usage of EXPR_LOCATION (t) and
+       TREE_BLOCK (t) from within percent_K_format to this callsite.
+
 2018-08-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/86661
index 7a644fdca6f3c736f49a2a696c90773e3da943df..a12fbc5bd967b70bc0954a9a7ff403c4c9dc15c3 100644 (file)
@@ -4091,7 +4091,7 @@ cp_printer (pretty_printer *pp, text_info *text, const char *spec,
       return true;
     case 'K':
       t = va_arg (*text->args_ptr, tree);
-      percent_K_format (text, t);
+      percent_K_format (text, EXPR_LOCATION (t), TREE_BLOCK (t));
       return true;
     case 'L': result = language_to_string (next_lang);         break;
     case 'O': result = op_to_string (false, next_tcode);       break;
index c3fa57064c271a5b3e516f7c5ed06bbcc375fdec..506a296732c52e26d045b4ba2743231a331dccca 100644 (file)
@@ -1657,7 +1657,6 @@ gimple_fold_builtin_strncpy (gimple_stmt_iterator *gsi,
       if (!nonstring)
        {
          tree fndecl = gimple_call_fndecl (stmt);
-         gcall *call = as_a <gcall *> (stmt);
 
          /* Warn about the lack of nul termination: the result is not
             a (nul-terminated) string.  */
@@ -1666,11 +1665,11 @@ gimple_fold_builtin_strncpy (gimple_stmt_iterator *gsi,
            warning_at (loc, OPT_Wstringop_truncation,
                        "%G%qD destination unchanged after copying no bytes "
                        "from a string of length %E",
-                       call, fndecl, slen);
+                       stmt, fndecl, slen);
          else
            warning_at (loc, OPT_Wstringop_truncation,
                        "%G%qD destination unchanged after copying no bytes",
-                       call, fndecl);
+                       stmt, fndecl);
        }
 
       replace_call_with_value (gsi, dest);
@@ -1991,7 +1990,7 @@ gimple_fold_builtin_strcat_chk (gimple_stmt_iterator *gsi)
 static bool
 gimple_fold_builtin_strncat (gimple_stmt_iterator *gsi)
 {
-  gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
+  gimple *stmt = gsi_stmt (*gsi);
   tree dst = gimple_call_arg (stmt, 0);
   tree src = gimple_call_arg (stmt, 1);
   tree len = gimple_call_arg (stmt, 2);
index 19cdb40d73a5226033297f311f7bdeb716c8c07d..d3c5ec6f79beb7e20bde80217e85284bcc33eda9 100644 (file)
@@ -2887,20 +2887,13 @@ gimple_dump_bb_for_graph (pretty_printer *pp, basic_block bb)
 
 
 /* Handle the %G format for TEXT.  Same as %K in handle_K_format in
-   tree-pretty-print.c but with a Gimple call statement as an argument.  */
+   tree-pretty-print.c but with a Gimple statement as an argument.  */
 
 void
 percent_G_format (text_info *text)
 {
-  gcall *stmt = va_arg (*text->args_ptr, gcall*);
+  gimple *stmt = va_arg (*text->args_ptr, gimple*);
 
-  /* Build a call expression from the Gimple call statement and
-     pass it to the K formatter that knows how to format it.  */
-  tree exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
-  CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
-  TREE_TYPE (exp) = gimple_call_return_type (stmt);
-  CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt);
-  SET_EXPR_LOCATION (exp, gimple_location (stmt));
-
-  percent_K_format (text, exp);
+  tree block = gimple_block (stmt);
+  percent_K_format (text, gimple_location (stmt), block);
 }
index 7dedb24fb9d8c4d27b0680410ea92af42c9a436f..01503d6091247a888ce692588051496f83a422f0 100644 (file)
@@ -88,7 +88,7 @@ class wrestrict_dom_walker : public dom_walker
   bool handle_gimple_call (gimple_stmt_iterator *);
 
  private:
-  void check_call (gcall *);
+  void check_call (gimple *);
 };
 
 edge
@@ -102,8 +102,7 @@ wrestrict_dom_walker::before_dom_children (basic_block bb)
       if (!is_gimple_call (stmt))
        continue;
 
-      if (gcall *call = as_a <gcall *> (stmt))
-       check_call (call);
+      check_call (stmt);
     }
 
   return NULL;
@@ -192,7 +191,7 @@ class builtin_access
     return detect_overlap != &builtin_access::generic_overlap;
   }
 
-  builtin_access (gcall *, builtin_memref &, builtin_memref &);
+  builtin_access (gimple *, builtin_memref &, builtin_memref &);
 
   /* Entry point to determine overlap.  */
   bool overlap ();
@@ -563,7 +562,7 @@ builtin_memref::offset_out_of_bounds (int strict, offset_int ooboff[2]) const
 /* Create an association between the memory references DST and SRC
    for access by a call EXPR to a memory or string built-in funtion.  */
 
-builtin_access::builtin_access (gcall *call, builtin_memref &dst,
+builtin_access::builtin_access (gimple *call, builtin_memref &dst,
                                builtin_memref &src)
 : dstref (&dst), srcref (&src), sizrange (), ovloff (), ovlsiz (),
   dstoff (), srcoff (), dstsiz (), srcsiz ()
@@ -1324,7 +1323,7 @@ builtin_access::overlap ()
    Return true when one has been detected, false otherwise.  */
 
 static bool
-maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
+maybe_diag_overlap (location_t loc, gimple *call, builtin_access &acs)
 {
   if (!acs.overlap ())
     return false;
@@ -1577,7 +1576,7 @@ maybe_diag_overlap (location_t loc, gcall *call, builtin_access &acs)
    has been issued.  */
 
 static bool
-maybe_diag_offset_bounds (location_t loc, gcall *call, tree func, int strict,
+maybe_diag_offset_bounds (location_t loc, gimple *call, tree func, int strict,
                          tree expr, const builtin_memref &ref)
 {
   if (!warn_array_bounds)
@@ -1722,7 +1721,7 @@ maybe_diag_offset_bounds (location_t loc, gcall *call, tree func, int strict,
    if/when appropriate.  */
 
 void
-wrestrict_dom_walker::check_call (gcall *call)
+wrestrict_dom_walker::check_call (gimple *call)
 {
   /* Avoid checking the call if it has already been diagnosed for
      some reason.  */
@@ -1822,7 +1821,7 @@ wrestrict_dom_walker::check_call (gcall *call)
    detected and diagnosed, true otherwise.  */
 
 bool
-check_bounds_or_overlap (gcall *call, tree dst, tree src, tree dstsize,
+check_bounds_or_overlap (gimple *call, tree dst, tree src, tree dstsize,
                         tree srcsize, bool bounds_only /* = false */)
 {
   location_t loc = gimple_nonartificial_location (call);
index 9bf84a361a290e858a490a2fa1a1c80031f50da9..c624589ef0ae7e077d975d11f6d343c5d64aa30f 100644 (file)
@@ -20,7 +20,7 @@
 
 #ifndef GIMPLE_SSA_WARN_RESTRICT_H
 
-extern bool check_bounds_or_overlap (gcall *, tree, tree, tree, tree,
+extern bool check_bounds_or_overlap (gimple *, tree, tree, tree, tree,
                                     bool = false);
 
 #endif /* GIMPLE_SSA_WARN_RESTRICT_H */
index 93fc807f5ff30bf7b9a106d833588ae6c1a97f2f..ac797b302b5dbd8238890bd0aa8d33644693229b 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-01  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/86650
+       * gcc.dg/format/gcc_diag-10.c: Adjust.
+
 2018-08-01  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/var_stride_2.c: Update expected form
index ab9bc2fff346c86717011e12232b4a3cb1508e76..29655090a4aa1804caae59497ce5c94851e64e10 100644 (file)
@@ -15,9 +15,9 @@ typedef struct location_s
 union tree_node;
 typedef union tree_node *tree;
 
-/* Define gcall as a dummy type.  The typedef must be provided for
+/* Define gimple as a dummy type.  The typedef must be provided for
    the C test to find the symbol.  */
-typedef struct gcall gcall;
+typedef struct gimple gimple;
 
 #define FORMAT(kind) __attribute__ ((format (__gcc_## kind ##__, 1, 2)))
 
@@ -26,7 +26,7 @@ void cdiag (const char*, ...) FORMAT (cdiag);
 void tdiag (const char*, ...) FORMAT (tdiag);
 void cxxdiag (const char*, ...) FORMAT (cxxdiag);
 
-void test_diag (tree t, gcall *gc)
+void test_diag (tree t, gimple *gc)
 {
   diag ("%<");   /* { dg-warning "unterminated quoting directive" } */
   diag ("%>");   /* { dg-warning "unmatched quoting directive " } */
@@ -47,7 +47,7 @@ void test_diag (tree t, gcall *gc)
   diag ("%<%r%R%>", "");
 }
 
-void test_cdiag (tree t, gcall *gc)
+void test_cdiag (tree t, gimple *gc)
 {
   cdiag ("%<");   /* { dg-warning "unterminated quoting directive" } */
   cdiag ("%>");   /* { dg-warning "unmatched quoting directive " } */
@@ -87,7 +87,7 @@ void test_cdiag (tree t, gcall *gc)
   cdiag ("%<%qT%>", t);  /* { dg-warning ".q. flag used within a quoted sequence" } */
 }
 
-void test_tdiag (tree t, gcall *gc)
+void test_tdiag (tree t, gimple *gc)
 {
   tdiag ("%<");       /* { dg-warning "unterminated quoting directive" } */
   tdiag ("%>");       /* { dg-warning "unmatched quoting directive " } */
@@ -124,7 +124,7 @@ void test_tdiag (tree t, gcall *gc)
   tdiag ("%<%qT%>", t);  /* { dg-warning ".q. flag used within a quoted sequence" } */
 }
 
-void test_cxxdiag (tree t, gcall *gc)
+void test_cxxdiag (tree t, gimple *gc)
 {
   cxxdiag ("%A", t);     /* { dg-warning ".A. conversion used unquoted" } */
   cxxdiag ("%D", t);     /* { dg-warning ".D. conversion used unquoted" } */
index 9814d029e54f2ef6189acfa950ac8d024c1b5f10..6b03b31c2297fa8c15f2b0d41d40b563e5a6b3f5 100644 (file)
@@ -282,7 +282,7 @@ default_tree_printer (pretty_printer *pp, text_info *text, const char *spec,
 
     case 'K':
       t = va_arg (*text->args_ptr, tree);
-      percent_K_format (text, t);
+      percent_K_format (text, EXPR_LOCATION (t), TREE_BLOCK (t));
       return true;
 
     default:
index e65c40a41a333a7424fd1cead72234158a0f02dc..627d8d7e2d744692941c93ba808138d4d5553950 100644 (file)
@@ -3980,15 +3980,14 @@ newline_and_indent (pretty_printer *pp, int spc)
 
 /* Handle the %K format for TEXT.  Separate from default_tree_printer
    so it can also be used in front ends.
-   Argument is a statement from which EXPR_LOCATION and TREE_BLOCK will
-   be recorded.  */
+   The location LOC and BLOCK are expected to be extracted by the caller
+   from the %K argument arg via EXPR_LOCATION(arg) and TREE_BLOCK(arg).  */
 
 void
-percent_K_format (text_info *text, tree t)
+percent_K_format (text_info *text, location_t loc, tree block)
 {
-  text->set_location (0, EXPR_LOCATION (t), true);
+  text->set_location (0, loc, true);
   gcc_assert (pp_ti_abstract_origin (text) != NULL);
-  tree block = TREE_BLOCK (t);
   *pp_ti_abstract_origin (text) = NULL;
 
   if (in_lto_p)
index cf2427f9d27937e87fd960596084fd5ab51cf59f..adfc77b29cd27888e06d7e3c40c64714479a1af7 100644 (file)
@@ -45,7 +45,7 @@ extern int op_code_prio (enum tree_code);
 extern int op_prio (const_tree);
 extern const char *op_symbol_code (enum tree_code);
 extern void print_call_name (pretty_printer *, tree, dump_flags_t);
-extern void percent_K_format (text_info *, tree);
+extern void percent_K_format (text_info *, location_t, tree);
 extern void pp_tree_identifier (pretty_printer *, tree);
 extern void dump_function_header (FILE *, tree, dump_flags_t);
 extern void pp_double_int (pretty_printer *pp, double_int d, bool uns);
index 2f0e54294ad73c018560068cd9196f7b709cea3e..63c95318aced64ee1d0466f9236af41e7f7b07ef 100644 (file)
@@ -3456,7 +3456,7 @@ pass_post_ipa_warn::execute (function *fun)
                      location_t loc = gimple_location (stmt);
                      if (warning_at (loc, OPT_Wnonnull,
                                      "%Gargument %u null where non-null "
-                                     "expected", as_a <gcall *>(stmt), i + 1))
+                                     "expected", stmt, i + 1))
                        {
                          tree fndecl = gimple_call_fndecl (stmt);
                          if (fndecl && DECL_IS_BUILTIN (fndecl))
index 1eaa9c505655fc108b4ddbc9abf772d92db59ed5..1d813b4686791f6b9c4a0385495a868cbed78413 100644 (file)
@@ -1627,8 +1627,7 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi)
          tree type = TREE_TYPE (oldlen);
          oldlen = fold_build2 (PLUS_EXPR, type, oldlen,
                                build_int_cst (type, 1));
-         check_bounds_or_overlap (as_a <gcall *>(stmt), olddsi->ptr, src,
-                                  oldlen, NULL_TREE);
+         check_bounds_or_overlap (stmt, olddsi->ptr, src, oldlen, NULL_TREE);
        }
 
       return;
@@ -1715,8 +1714,7 @@ handle_builtin_strcpy (enum built_in_function bcode, gimple_stmt_iterator *gsi)
 
   if (const strinfo *chksi = olddsi ? olddsi : dsi)
     if (si
-       && !check_bounds_or_overlap (as_a <gcall *>(stmt), chksi->ptr, si->ptr,
-                                    NULL_TREE, len))
+       && !check_bounds_or_overlap (stmt, chksi->ptr, si->ptr, NULL_TREE, len))
       {
        gimple_set_no_warning (stmt, true);
        set_no_warning = true;
@@ -2031,8 +2029,6 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
          lenrange[0] = wi::shwi (0, prec);
        }
 
-      gcall *call = as_a <gcall *> (stmt);
-
       /* Set to true for strncat whose bound is derived from the length
         of the destination (the expected usage pattern).  */
       bool cat_dstlen_bounded = false;
@@ -2048,7 +2044,7 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
                          "%G%qD output truncated before terminating nul "
                          "copying %E bytes from a string of the same "
                          "length",
-                         call, func, cnt);
+                         stmt, func, cnt);
       else if (!cat_dstlen_bounded)
        {
          if (wi::geu_p (lenrange[0], cntrange[1]))
@@ -2062,12 +2058,12 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
                                  "from a string of length %wu",
                                  "%G%qD output truncated copying %E bytes "
                                  "from a string of length %wu",
-                                 call, func, cnt, lenrange[0].to_uhwi ());
+                                 stmt, func, cnt, lenrange[0].to_uhwi ());
 
              return warning_at (callloc, OPT_Wstringop_truncation,
                                 "%G%qD output truncated copying between %wu "
                                 "and %wu bytes from a string of length %wu",
-                                call, func, cntrange[0].to_uhwi (),
+                                stmt, func, cntrange[0].to_uhwi (),
                                 cntrange[1].to_uhwi (), lenrange[0].to_uhwi ());
            }
          else if (wi::geu_p (lenrange[1], cntrange[1]))
@@ -2081,12 +2077,12 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
                                  "byte from a string of length %wu",
                                  "%G%qD output may be truncated copying %E "
                                  "bytes from a string of length %wu",
-                                 call, func, cnt, lenrange[1].to_uhwi ());
+                                 stmt, func, cnt, lenrange[1].to_uhwi ());
 
              return warning_at (callloc, OPT_Wstringop_truncation,
                                 "%G%qD output may be truncated copying between "
                                 "%wu and %wu bytes from a string of length %wu",
-                                call, func, cntrange[0].to_uhwi (),
+                                stmt, func, cntrange[0].to_uhwi (),
                                 cntrange[1].to_uhwi (), lenrange[1].to_uhwi ());
            }
        }
@@ -2102,7 +2098,7 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
          return warning_at (callloc, OPT_Wstringop_truncation,
                             "%G%qD output may be truncated copying between "
                             "%wu and %wu bytes from a string of length %wu",
-                            call, func, cntrange[0].to_uhwi (),
+                            stmt, func, cntrange[0].to_uhwi (),
                             cntrange[1].to_uhwi (), lenrange[0].to_uhwi ());
        }
     }
@@ -2122,7 +2118,7 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
       if (cntrange[0] == cntrange[1])
        return warning_at (callloc, OPT_Wstringop_truncation,
                           "%G%qD specified bound %E equals destination size",
-                          as_a <gcall *> (stmt), func, cnt);
+                          stmt, func, cnt);
     }
 
   return false;
@@ -2180,8 +2176,7 @@ handle_builtin_stxncpy (built_in_function, gimple_stmt_iterator *gsi)
   else
     srcsize = NULL_TREE;
 
-  if (!check_bounds_or_overlap (as_a <gcall *>(stmt), dst, src,
-                               dstsize, srcsize))
+  if (!check_bounds_or_overlap (stmt, dst, src, dstsize, srcsize))
     {
       gimple_set_no_warning (stmt, true);
       return;
@@ -2222,13 +2217,13 @@ handle_builtin_stxncpy (built_in_function, gimple_stmt_iterator *gsi)
       && warning_at (callloc, OPT_Wstringop_truncation,
                     "%G%qD output truncated before terminating nul "
                     "copying as many bytes from a string as its length",
-                    as_a <gcall *>(stmt), func))
+                    stmt, func))
     warned = true;
   else if (silen && is_strlen_related_p (src, silen->ptr))
     warned = warning_at (callloc, OPT_Wstringop_overflow_,
                         "%G%qD specified bound depends on the length "
                         "of the source argument",
-                        as_a <gcall *>(stmt), func);
+                        stmt, func);
   if (warned)
     {
       location_t strlenloc = pss->second;
@@ -2479,8 +2474,7 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi)
 
        tree sptr = si && si->ptr ? si->ptr : src;
 
-       if (!check_bounds_or_overlap (as_a <gcall *>(stmt), dst, sptr,
-                                     NULL_TREE, slen))
+       if (!check_bounds_or_overlap (stmt, dst, sptr, NULL_TREE, slen))
          {
            gimple_set_no_warning (stmt, true);
            set_no_warning = true;
@@ -2590,8 +2584,7 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi)
 
       tree sptr = si && si->ptr ? si->ptr : src;
 
-      if (!check_bounds_or_overlap (as_a <gcall *>(stmt), dst, sptr,
-                                   dstlen, srcsize))
+      if (!check_bounds_or_overlap (stmt, dst, sptr, dstlen, srcsize))
        {
          gimple_set_no_warning (stmt, true);
          set_no_warning = true;