diff options
author | Marek Polacek <polacek@redhat.com> | 2017-08-09 08:51:20 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2017-08-09 08:51:20 +0000 |
commit | a32c8316ff282ec3eb60e222e91fb19998c12f46 (patch) | |
tree | 5c9606b760b22332192173cec1c9c8ba76d9dcb4 /gcc/c/c-parser.c | |
parent | bc47a525cbd41692135f24607a52bd42e93400cb (diff) | |
download | gcc-a32c8316ff282ec3eb60e222e91fb19998c12f46.zip gcc-a32c8316ff282ec3eb60e222e91fb19998c12f46.tar.gz gcc-a32c8316ff282ec3eb60e222e91fb19998c12f46.tar.bz2 |
re PR c/81417 (-Wsign-compare should print types being compared)
PR c/81417
* c-array-notation.c (fix_builtin_array_notation_fn): Update calls to
build_conditional_expr.
* c-parser.c (c_parser_conditional_expression): Create locations for
EXP1 and EXP2 from their source ranges. Pass the locations down to
build_conditional_expr.
* c-tree.h (build_conditional_expr): Update declaration.
* c-typeck.c (build_conditional_expr): Add location_t parameters.
For -Wsign-compare, also print the types.
* input.c (make_location): New overload.
* input.h (make_location): Declare.
* objc-next-runtime-abi-02.c (build_v2_build_objc_method_call): Update
a call to build_conditional_expr.
* Wsign-compare-1.c: New test.
* gcc.dg/compare1.c: Adjust dg-bogus.
* gcc.dg/compare2.c: Likewise.
* gcc.dg/compare3.c: Likewise.
* gcc.dg/compare7.c: Likewise.
* gcc.dg/compare8.c: Likewise.
* gcc.dg/compare9.c: Likewise.
* gcc.dg/pr11492.c: Likewise.
From-SVN: r250984
Diffstat (limited to 'gcc/c/c-parser.c')
-rw-r--r-- | gcc/c/c-parser.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 606c07c..6d40a97 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6511,7 +6511,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after, tree omp_atomic_lhs) { struct c_expr cond, exp1, exp2, ret; - location_t start, cond_loc, colon_loc, middle_loc; + location_t start, cond_loc, colon_loc; gcc_assert (!after || c_dialect_objc ()); @@ -6530,7 +6530,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after, { tree eptype = NULL_TREE; - middle_loc = c_parser_peek_token (parser)->location; + location_t middle_loc = c_parser_peek_token (parser)->location; pedwarn (middle_loc, OPT_Wpedantic, "ISO C forbids omitting the middle term of a ?: expression"); if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR) @@ -6547,6 +6547,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after, if (eptype) exp1.value = build1 (EXCESS_PRECISION_EXPR, eptype, exp1.value); exp1.original_type = NULL; + exp1.src_range = cond.src_range; cond.value = c_objc_common_truthvalue_conversion (cond_loc, exp1.value); c_inhibit_evaluation_warnings += cond.value == truthvalue_true_node; } @@ -6578,10 +6579,12 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after, exp2 = convert_lvalue_to_rvalue (exp2_loc, exp2, true, true); } c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node; + location_t loc1 = make_location (exp1.get_start (), exp1.src_range); + location_t loc2 = make_location (exp2.get_start (), exp2.src_range); ret.value = build_conditional_expr (colon_loc, cond.value, cond.original_code == C_MAYBE_CONST_EXPR, - exp1.value, exp1.original_type, - exp2.value, exp2.original_type); + exp1.value, exp1.original_type, loc1, + exp2.value, exp2.original_type, loc2); ret.original_code = ERROR_MARK; if (exp1.value == error_mark_node || exp2.value == error_mark_node) ret.original_type = NULL; |