On 02/22/2017 04:01 AM, Xi Ruoyao wrote:
This patch adds warning option -Wstring-plus-int for C.

gcc/ChangeLog:

2017-02-22  Xi Ruoyao  <r...@stu.xidian.edu.cn>

        * c/c-typeck.c (parser_build_binary_op, build_modify_expr): checking 
for -Wstring-plus-int

---
  gcc/c/c-typeck.c | 28 ++++++++++++++++++++++++++++
  1 file changed, 28 insertions(+)

diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 49b99b5..288d44b 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -3631,6 +3631,24 @@ parser_build_binary_op (location_t location, enum 
tree_code code,
                  ? arg2.original_type
                  : TREE_TYPE (arg2.value));
+ /* Warn about adding string literals/pointers and chars. */
+  if (warn_string_plus_int && (TREE_CODE (type1) == POINTER_TYPE ||
+                               TREE_CODE (type2) == POINTER_TYPE))
Please use POINTER_TYPE_P rather than checking the underlying tree code. This is also formatted incorrectly. It should look like this

  if (warn_string_plus_int
      && (POINTER_TYPE_P (type1) || POINTER_TYPE_P (type2))


+      enum tree_code code_ptr = (TREE_CODE (type1) == POINTER_TYPE ?
+                                 code1 : code2);
+      tree type_ptr = (TREE_CODE (type1) == POINTER_TYPE ?
+                       type1 : type2);
+      tree type_int = (TREE_CODE (type1) == POINTER_TYPE ?
+                       type2 : type1) > +      enum tree_code code_int = 
TREE_CODE (TREE_CODE (type1)
+                                           == POINTER_TYPE ?
+                                           arg2.value : arg1.value);
Similarly, please use POINTER_TYPE_P. That will likely eliminate the need to warp the first 3 assigments at all. The last should be line wrapped like this:

  enum tree_code code_int =  (POINTER_TYPE_P (type1)
                              ? arg2.value
                              : arg1.value);

Note how we bring the operator down to the new line rather than keep it at the end of a long line.

Please also verify that instead of 8 spaces that you use tabs. I think the assignments above are using 8 spaces rather than tabs.

@@ -5768,6 +5786,16 @@ build_modify_expr (location_t location, tree lhs, tree 
lhs_origtype,
              rhseval = newrhs;
            }
+ /* Warn about adding string literals/pointers and chars. */
+         if (modifycode == PLUS_EXPR && warn_string_plus_int)
+           {
+             tree lhs_type1 = (lhs_origtype ? lhs_origtype :
+                                              TREE_TYPE (lhs));
+             tree rhs_type1 = (rhs_origtype ? rhs_origtype :
+                                              TREE_TYPE (rhs));
+             maybe_warn_string_plus_int (location, lhs_type1, rhs_type1,
+                                         TREE_CODE (lhs), TREE_CODE (rhs));
+               }
Formatting fixes here too.  See examples above for proper formatting.

Since you're relatively new to GCC development, please make the changes noted above and resubmit this patch.

jeff

Reply via email to