Message ID | 1487761278.2882.66.camel@stu.xidian.edu.cn |
---|---|
State | New |
Headers | show |
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 --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);