diff mbox

[3/5] c: New warning option -Wstring-plus-int

Message ID 1487761278.2882.66.camel@stu.xidian.edu.cn
State New
Headers show

Commit Message

Xi Ruoyao Feb. 22, 2017, 11:01 a.m. UTC
This patch adds warning option -Wstring-plus-int for C.

gcc/ChangeLog:

2017-02-22  Xi Ruoyao  <ryxi@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(+)

Comments

Jeff Law April 28, 2017, 8:28 p.m. UTC | #1
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  <ryxi@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
diff mbox

Patch

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))
+    {
+      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);
+
+	  maybe_warn_string_plus_int (location, type_ptr, type_int,
+	                              code_ptr, code_int);
+    }
+
   result.value = build_binary_op (location, code,
 				  arg1.value, arg2.value, 1);
   result.original_code = code;
@@ -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));
+		}
 	  newrhs = build_binary_op (location,
 				    modifycode, lhs, newrhs, 1);