Ping. The make_location change should allow us to do really cool things, if we pass c_exprs to build_binary_loc, btw. Like all the ranges for diagnostic and similar.
On Wed, Aug 02, 2017 at 02:43:39PM +0200, Marek Polacek wrote: > On Tue, Aug 01, 2017 at 04:48:01PM -0400, David Malcolm wrote: > > I'm wondering if the messages could use a slight rewording, to give a > > clue to the user about the reason *why* the expression has changed > > signedness. The old message "signed and unsigned type in conditional > > expression" gave the clue (but failed to underline the subexpression > > changing sign, and tell what the old/new types were). > > > > A horribly verbose way to put it would be something like: > > > > "operand of conditional expression with mixed signedness changes > > signedness from %qT to %qT due to promotion to unsigned to match > > unsignedness of other operand" (ugh) > > > > (assuming I'm understanding the logic correctly) > > > > or something like: > > > > "operand of conditional expression changes signedness from %qT to %qT > > due to unsignedness of other operand" > > > > or somesuch (am not 100% happy with that either). > > Hmm, how about this, then? > > "operand of ?: changes signedness from %qT to %qT due to unsignedness of > other operand" > > I couldn't come up with anything more brief yet conveying all the information. > I don't like adding "second"/"third"/... very much; we should offer a good > location already. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2017-08-02 Marek Polacek <pola...@redhat.com> > > 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. > > diff --git gcc/c/c-array-notation.c gcc/c/c-array-notation.c > index e430f5c681b..40f1cfdabb8 100644 > --- gcc/c/c-array-notation.c > +++ gcc/c/c-array-notation.c > @@ -355,8 +355,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_cond_expr = build2 (NE_EXPR, TREE_TYPE (func_parm), func_parm, > build_zero_cst (TREE_TYPE (func_parm))); > new_expr = build_conditional_expr > - (location, new_cond_expr, false, new_yes_expr, > - TREE_TYPE (new_yes_expr), new_no_expr, TREE_TYPE (new_no_expr)); > + (location, new_cond_expr, false, > + new_yes_expr, TREE_TYPE (new_yes_expr), location, > + new_no_expr, TREE_TYPE (new_no_expr), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_NONZERO: > new_var_init = build_modify_expr > @@ -375,8 +376,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_cond_expr = build2 (EQ_EXPR, TREE_TYPE (func_parm), func_parm, > build_zero_cst (TREE_TYPE (func_parm))); > new_expr = build_conditional_expr > - (location, new_cond_expr, false, new_yes_expr, > - TREE_TYPE (new_yes_expr), new_no_expr, TREE_TYPE (new_no_expr)); > + (location, new_cond_expr, false, > + new_yes_expr, TREE_TYPE (new_yes_expr), location, > + new_no_expr, TREE_TYPE (new_no_expr), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO: > new_var_init = build_modify_expr > @@ -394,8 +396,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_cond_expr = build2 (EQ_EXPR, TREE_TYPE (func_parm), func_parm, > build_zero_cst (TREE_TYPE (func_parm))); > new_expr = build_conditional_expr > - (location, new_cond_expr, false, new_yes_expr, > - TREE_TYPE (new_yes_expr), new_no_expr, TREE_TYPE (new_no_expr)); > + (location, new_cond_expr, false, > + new_yes_expr, TREE_TYPE (new_yes_expr), location, > + new_no_expr, TREE_TYPE (new_no_expr), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO: > new_var_init = build_modify_expr > @@ -413,8 +416,9 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_cond_expr = build2 (NE_EXPR, TREE_TYPE (func_parm), func_parm, > build_zero_cst (TREE_TYPE (func_parm))); > new_expr = build_conditional_expr > - (location, new_cond_expr, false, new_yes_expr, > - TREE_TYPE (new_yes_expr), new_no_expr, TREE_TYPE (new_no_expr)); > + (location, new_cond_expr, false, > + new_yes_expr, TREE_TYPE (new_yes_expr), location, > + new_no_expr, TREE_TYPE (new_no_expr), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_MAX: > if (TYPE_MIN_VALUE (new_var_type)) > @@ -434,7 +438,8 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_expr = build_conditional_expr > (location, > build2 (LT_EXPR, TREE_TYPE (*new_var), *new_var, func_parm), false, > - new_yes_expr, TREE_TYPE (*new_var), new_no_expr, TREE_TYPE (*new_var)); > + new_yes_expr, TREE_TYPE (*new_var), location, > + new_no_expr, TREE_TYPE (*new_var), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_MIN: > if (TYPE_MAX_VALUE (new_var_type)) > @@ -454,7 +459,8 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > new_expr = build_conditional_expr > (location, > build2 (GT_EXPR, TREE_TYPE (*new_var), *new_var, func_parm), false, > - new_yes_expr, TREE_TYPE (*new_var), new_no_expr, TREE_TYPE (*new_var)); > + new_yes_expr, TREE_TYPE (*new_var), location, > + new_no_expr, TREE_TYPE (*new_var), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND: > new_var_init = build_modify_expr > @@ -504,7 +510,8 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > build2 (LE_EXPR, TREE_TYPE (array_ind_value), array_ind_value, > func_parm), > false, > - new_yes_list, TREE_TYPE (*new_var), new_no_list, TREE_TYPE (*new_var)); > + new_yes_list, TREE_TYPE (*new_var), location, > + new_no_list, TREE_TYPE (*new_var), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND: > new_var_init = build_modify_expr > @@ -554,7 +561,8 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree > *new_var) > build2 (GE_EXPR, TREE_TYPE (array_ind_value), array_ind_value, > func_parm), > false, > - new_yes_list, TREE_TYPE (*new_var), new_no_list, TREE_TYPE (*new_var)); > + new_yes_list, TREE_TYPE (*new_var), location, > + new_no_list, TREE_TYPE (*new_var), location); > break; > case BUILT_IN_CILKPLUS_SEC_REDUCE: > new_var_init = build_modify_expr > diff --git gcc/c/c-parser.c gcc/c/c-parser.c > index 16cd3579972..b64864f0d34 100644 > --- gcc/c/c-parser.c > +++ gcc/c/c-parser.c > @@ -6508,7 +6508,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 ()); > > @@ -6527,7 +6527,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) > @@ -6544,6 +6544,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; > } > @@ -6575,10 +6576,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; > diff --git gcc/c/c-tree.h gcc/c/c-tree.h > index a8197eb768d..be2f272d2dd 100644 > --- gcc/c/c-tree.h > +++ gcc/c/c-tree.h > @@ -644,7 +644,7 @@ extern struct c_expr parser_build_binary_op (location_t, > enum tree_code, struct c_expr, > struct c_expr); > extern tree build_conditional_expr (location_t, tree, bool, tree, tree, > - tree, tree); > + location_t, tree, tree, location_t); > extern tree build_compound_expr (location_t, tree, tree); > extern tree c_cast_expr (location_t, struct c_type_name *, tree); > extern tree build_c_cast (location_t, tree, tree); > diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c > index 71d01350186..7c02ad1cdbd 100644 > --- gcc/c/c-typeck.c > +++ gcc/c/c-typeck.c > @@ -4863,8 +4863,8 @@ ep_convert_and_check (location_t loc, tree type, tree > expr, > > tree > build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp, > - tree op1, tree op1_original_type, tree op2, > - tree op2_original_type) > + tree op1, tree op1_original_type, location_t op1_loc, > + tree op2, tree op2_original_type, location_t op2_loc) > { > tree type1; > tree type2; > @@ -5029,10 +5029,18 @@ build_conditional_expr (location_t colon_loc, tree > ifexp, bool ifexp_bcp, > || (unsigned_op1 > && tree_expr_nonnegative_warnv_p (op2, &ovf))) > /* OK */; > + else if (unsigned_op2) > + warning_at (op1_loc, OPT_Wsign_compare, > + "operand of ?: changes signedness from " > + "%qT to %qT due to unsignedness of other " > + "operand", TREE_TYPE (orig_op1), > + TREE_TYPE (orig_op2)); > else > - warning_at (colon_loc, OPT_Wsign_compare, > - ("signed and unsigned type in " > - "conditional expression")); > + warning_at (op2_loc, OPT_Wsign_compare, > + "operand of ?: changes signedness from " > + "%qT to %qT due to unsignedness of other " > + "operand", TREE_TYPE (orig_op2), > + TREE_TYPE (orig_op1)); > } > if (!op1_maybe_const || TREE_CODE (op1) != INTEGER_CST) > op1 = c_wrap_maybe_const (op1, !op1_maybe_const); > diff --git gcc/input.c gcc/input.c > index 0480eb24ec0..a01c504fe57 100644 > --- gcc/input.c > +++ gcc/input.c > @@ -898,6 +898,15 @@ make_location (location_t caret, location_t start, > location_t finish) > return combined_loc; > } > > +/* Same as above, but taking a source range rather than two locations. */ > + > +location_t > +make_location (location_t caret, source_range src_range) > +{ > + location_t pure_loc = get_pure_location (caret); > + return COMBINE_LOCATION_DATA (line_table, pure_loc, src_range, NULL); > +} > + > #define ONE_K 1024 > #define ONE_M (ONE_K * ONE_K) > > diff --git gcc/input.h gcc/input.h > index 7251eef664e..f58d2488342 100644 > --- gcc/input.h > +++ gcc/input.h > @@ -109,6 +109,7 @@ get_finish (location_t loc) > > extern location_t make_location (location_t caret, > location_t start, location_t finish); > +extern location_t make_location (location_t caret, source_range src_range); > > void dump_line_table_statistics (void); > > diff --git gcc/objc/objc-next-runtime-abi-02.c > gcc/objc/objc-next-runtime-abi-02.c > index 97314860e01..a9c2f5d3ba5 100644 > --- gcc/objc/objc-next-runtime-abi-02.c > +++ gcc/objc/objc-next-runtime-abi-02.c > @@ -1645,8 +1645,8 @@ build_v2_build_objc_method_call (int super_flag, tree > method_prototype, > /* ??? CHECKME. */ > ret_val = build_conditional_expr (input_location, > ifexp, 1, > - ret_val, NULL_TREE, > - ftree, NULL_TREE); > + ret_val, NULL_TREE, input_location, > + ftree, NULL_TREE, input_location); > #endif > } > return ret_val; > diff --git gcc/testsuite/gcc.dg/Wsign-compare-1.c > gcc/testsuite/gcc.dg/Wsign-compare-1.c > index e69de29bb2d..be3bd2fcbd8 100644 > --- gcc/testsuite/gcc.dg/Wsign-compare-1.c > +++ gcc/testsuite/gcc.dg/Wsign-compare-1.c > @@ -0,0 +1,83 @@ > +/* PR c/81417 */ > +/* { dg-do compile } */ > +/* { dg-options "-Wsign-compare -fdiagnostics-show-caret" } */ > + > +unsigned int > +f0 (int x, unsigned int y) > +{ > + return x ? y : -1; /* { dg-warning "18:operand of \\?: changes signedness > from 'int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return x ? y : -1; > + ^~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f1 (int xxx, unsigned int yyy) > +{ > + return xxx ? yyy : -1; /* { dg-warning "22:operand of \\?: changes > signedness from 'int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? yyy : -1; > + ^~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f2 (int xxx, unsigned int yyy) > +{ > + return xxx ? -1 : yyy; /* { dg-warning "16:operand of \\?: changes > signedness from 'int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? -1 : yyy; > + ^~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f3 (unsigned int yyy) > +{ > + return yyy ?: -1; /* { dg-warning "17:operand of \\?: changes signedness > from 'int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return yyy ?: -1; > + ^~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f4 (int xxx, unsigned yyy, short uuu) > +{ > + return xxx ? yyy : uuu; /* { dg-warning "22:operand of \\?: changes > signedness from 'short int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? yyy : uuu; > + ^~~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f5 (int xxx, unsigned yyy, short uuu) > +{ > + return xxx ? uuu : yyy; /* { dg-warning "16:operand of \\?: changes > signedness from 'short int' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? uuu : yyy; > + ^~~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f6 (int xxx, unsigned yyy, signed char uuu) > +{ > + return xxx ? yyy : uuu; /* { dg-warning "22:operand of \\?: changes > signedness from 'signed char' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? yyy : uuu; > + ^~~ > + { dg-end-multiline-output "" } */ > +} > + > +unsigned int > +f7 (int xxx, unsigned yyy, signed char uuu) > +{ > + return xxx ? uuu : yyy; /* { dg-warning "16:operand of \\?: changes > signedness from 'signed char' to 'unsigned int'" } */ > +/* { dg-begin-multiline-output "" } > + return xxx ? uuu : yyy; > + ^~~ > + { dg-end-multiline-output "" } */ > +} > diff --git gcc/testsuite/gcc.dg/compare1.c gcc/testsuite/gcc.dg/compare1.c > index 7becfbdb17f..ebab8c2cbf7 100644 > --- gcc/testsuite/gcc.dg/compare1.c > +++ gcc/testsuite/gcc.dg/compare1.c > @@ -22,17 +22,17 @@ enum mm2 > > int f(enum mm1 x) > { > - return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */ > + return x == (tf?DI:SI); /* { dg-bogus "changes signedness" "case 1" } */ > } > > int g(enum mm1 x) > { > - return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */ > + return x == (tf?DI:-1); /* { dg-bogus "changes signedness" "case 2" } */ > } > > int h(enum mm2 x) > { > - return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */ > + return x == (tf?DI2:SI2); /* { dg-bogus "changes signedness" "case 3" } */ > } > > int i(enum mm2 x) > diff --git gcc/testsuite/gcc.dg/compare2.c gcc/testsuite/gcc.dg/compare2.c > index c309f1d00eb..cfadaccb8af 100644 > --- gcc/testsuite/gcc.dg/compare2.c > +++ gcc/testsuite/gcc.dg/compare2.c > @@ -9,35 +9,35 @@ int tf = 1; > void f(int x, unsigned int y) > { > /* ?: branches are constants. */ > - x > (tf?64:128); /* { dg-bogus "signed and unsigned" "case 1" } */ > - y > (tf?64:128); /* { dg-bogus "signed and unsigned" "case 2" } */ > + x > (tf?64:128); /* { dg-bogus "changes signedness" "case 1" } */ > + y > (tf?64:128); /* { dg-bogus "changes signedness" "case 2" } */ > > /* ?: branches are (recursively) constants. */ > - x > (tf?64:(tf?128:256)); /* { dg-bogus "signed and unsigned" "case 3" } */ > - y > (tf?64:(tf?128:256)); /* { dg-bogus "signed and unsigned" "case 4" } */ > + x > (tf?64:(tf?128:256)); /* { dg-bogus "changes signedness" "case 3" } */ > + y > (tf?64:(tf?128:256)); /* { dg-bogus "changes signedness" "case 4" } */ > > /* ?: branches are signed constants. */ > - x > (tf?64:-1); /* { dg-bogus "signed and unsigned" "case 5" } */ > + x > (tf?64:-1); /* { dg-bogus "changes signedness" "case 5" } */ > y > (tf?64:-1); /* { dg-warning "different signedness" "case 6" } */ > > /* ?: branches are (recursively) signed constants. */ > - x > (tf?64:(tf?128:-1)); /* { dg-bogus "signed and unsigned" "case 7" } */ > + x > (tf?64:(tf?128:-1)); /* { dg-bogus "changes signedness" "case 7" } */ > y > (tf?64:(tf?128:-1)); /* { dg-warning "different signedness" "case 8" } > */ > > /* Statement expression. */ > - x > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 9" } */ > - y > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 10" } */ > + x > ({tf; 64;}); /* { dg-bogus "changes signedness" "case 9" } */ > + y > ({tf; 64;}); /* { dg-bogus "changes signedness" "case 10" } */ > > /* Statement expression with recursive ?: . */ > - x > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "signed and unsigned" "case > 11" } */ > - y > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "signed and unsigned" "case > 12" } */ > + x > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "changes signedness" "case > 11" } */ > + y > ({tf; tf?64:(tf?128:256);}); /* { dg-bogus "changes signedness" "case > 12" } */ > > /* Statement expression with signed ?:. */ > - x > ({tf; tf?64:-1;}); /* { dg-bogus "signed and unsigned" "case 13" } */ > + x > ({tf; tf?64:-1;}); /* { dg-bogus "changes signedness" "case 13" } */ > y > ({tf; tf?64:-1;}); /* { dg-warning "different signedness" "case 14" } > */ > > /* Statement expression with recursive signed ?:. */ > - x > ({tf; tf?64:(tf?128:-1);}); /* { dg-bogus "signed and unsigned" "case > 15" } */ > + x > ({tf; tf?64:(tf?128:-1);}); /* { dg-bogus "changes signedness" "case > 15" } */ > y > ({tf; tf?64:(tf?128:-1);}); /* { dg-warning "different signedness" > "case 16" } */ > > /* ?: branches are constants. */ > diff --git gcc/testsuite/gcc.dg/compare3.c gcc/testsuite/gcc.dg/compare3.c > index eda3faf2754..836231fb870 100644 > --- gcc/testsuite/gcc.dg/compare3.c > +++ gcc/testsuite/gcc.dg/compare3.c > @@ -11,49 +11,49 @@ void f(int x, unsigned int y) > /* Test comparing conditional expressions containing truth values. > This can occur explicitly, or e.g. when (foo?2:(bar?1:0)) is > optimized into (foo?2:(bar!=0)). */ > - x > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 1" } */ > - y > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 2" } */ > - x > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 3" } */ > - y > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 4" } */ > - > - x > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 5" } */ > - y > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 6" } */ > - x > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 7" } */ > - y > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 8" } */ > - > - x > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 9" } */ > - y > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 10" } */ > - x > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 11" } */ > - y > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 12" } */ > - > - x < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 13" } */ > - y < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 14" } */ > - x < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 15" } */ > - y < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 16" } */ > - > - x > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 17" } */ > - y > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 18" } */ > - x > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 19" } */ > - y > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 20" } */ > - > - x > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 21" } */ > - y > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 22" } */ > - x > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 23" } */ > - y > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 24" } */ > - > - x > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 25" } */ > - y > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 26" } */ > - x > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 27" } */ > - y > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 28" } */ > - > - x > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 29" } */ > - y > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 30" } */ > - x > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 31" } */ > - y > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 32" } */ > - > - x > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 33" } */ > - y > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 34" } */ > - x > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 35" } */ > - y > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 36" } */ > + x > (tf?64:(tf!=x)); /* { dg-bogus "changes signedness" "case 1" } */ > + y > (tf?64:(tf!=x)); /* { dg-bogus "changes signedness" "case 2" } */ > + x > (tf?(tf!=x):64); /* { dg-bogus "changes signedness" "case 3" } */ > + y > (tf?(tf!=x):64); /* { dg-bogus "changes signedness" "case 4" } */ > + > + x > (tf?64:(tf==x)); /* { dg-bogus "changes signedness" "case 5" } */ > + y > (tf?64:(tf==x)); /* { dg-bogus "changes signedness" "case 6" } */ > + x > (tf?(tf==x):64); /* { dg-bogus "changes signedness" "case 7" } */ > + y > (tf?(tf==x):64); /* { dg-bogus "changes signedness" "case 8" } */ > + > + x > (tf?64:(tf>x)); /* { dg-bogus "changes signedness" "case 9" } */ > + y > (tf?64:(tf>x)); /* { dg-bogus "changes signedness" "case 10" } */ > + x > (tf?(tf>x):64); /* { dg-bogus "changes signedness" "case 11" } */ > + y > (tf?(tf>x):64); /* { dg-bogus "changes signedness" "case 12" } */ > + > + x < (tf?64:(tf<x)); /* { dg-bogus "changes signedness" "case 13" } */ > + y < (tf?64:(tf<x)); /* { dg-bogus "changes signedness" "case 14" } */ > + x < (tf?(tf<x):64); /* { dg-bogus "changes signedness" "case 15" } */ > + y < (tf?(tf<x):64); /* { dg-bogus "changes signedness" "case 16" } */ > + > + x > (tf?64:(tf>=x)); /* { dg-bogus "changes signedness" "case 17" } */ > + y > (tf?64:(tf>=x)); /* { dg-bogus "changes signedness" "case 18" } */ > + x > (tf?(tf>=x):64); /* { dg-bogus "changes signedness" "case 19" } */ > + y > (tf?(tf>=x):64); /* { dg-bogus "changes signedness" "case 20" } */ > + > + x > (tf?64:(tf<=x)); /* { dg-bogus "changes signedness" "case 21" } */ > + y > (tf?64:(tf<=x)); /* { dg-bogus "changes signedness" "case 22" } */ > + x > (tf?(tf<=x):64); /* { dg-bogus "changes signedness" "case 23" } */ > + y > (tf?(tf<=x):64); /* { dg-bogus "changes signedness" "case 24" } */ > + > + x > (tf?64:(tf&&x)); /* { dg-bogus "changes signedness" "case 25" } */ > + y > (tf?64:(tf&&x)); /* { dg-bogus "changes signedness" "case 26" } */ > + x > (tf?(tf&&x):64); /* { dg-bogus "changes signedness" "case 27" } */ > + y > (tf?(tf&&x):64); /* { dg-bogus "changes signedness" "case 28" } */ > + > + x > (tf?64:(tf||x)); /* { dg-bogus "changes signedness" "case 29" } */ > + y > (tf?64:(tf||x)); /* { dg-bogus "changes signedness" "case 30" } */ > + x > (tf?(tf||x):64); /* { dg-bogus "changes signedness" "case 31" } */ > + y > (tf?(tf||x):64); /* { dg-bogus "changes signedness" "case 32" } */ > + > + x > (tf?64:(!tf)); /* { dg-bogus "changes signedness" "case 33" } */ > + y > (tf?64:(!tf)); /* { dg-bogus "changes signedness" "case 34" } */ > + x > (tf?(!tf):64); /* { dg-bogus "changes signedness" "case 35" } */ > + y > (tf?(!tf):64); /* { dg-bogus "changes signedness" "case 36" } */ > > } > diff --git gcc/testsuite/gcc.dg/compare7.c gcc/testsuite/gcc.dg/compare7.c > index e2fbc04bfc2..b6fe6e78334 100644 > --- gcc/testsuite/gcc.dg/compare7.c > +++ gcc/testsuite/gcc.dg/compare7.c > @@ -6,5 +6,5 @@ > > int f(unsigned a, int b) > { > - return a < b; /* { dg-bogus "signed and unsigned" } */ > + return a < b; /* { dg-bogus "changes signedness" } */ > } > diff --git gcc/testsuite/gcc.dg/compare8.c gcc/testsuite/gcc.dg/compare8.c > index d723c45a095..d09b69c53a2 100644 > --- gcc/testsuite/gcc.dg/compare8.c > +++ gcc/testsuite/gcc.dg/compare8.c > @@ -4,18 +4,18 @@ > int > f(unsigned short a1, unsigned short a2, unsigned int b) > { > - return ((a1+a2)|5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */ > + return ((a1+a2)|5) > b ? 2 : 3; /* { dg-bogus "changes signedness" } */ > } > > int > g(unsigned short a1, unsigned short a2, unsigned int b) > { > - return ((a1+a2)&5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */ > + return ((a1+a2)&5) > b ? 2 : 3; /* { dg-bogus "changes signedness" } */ > } > > int > h(unsigned short a1, unsigned short a2, unsigned int b) > { > - return ((a1+a2)^5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */ > + return ((a1+a2)^5) > b ? 2 : 3; /* { dg-bogus "changes signedness" } */ > } > > diff --git gcc/testsuite/gcc.dg/compare9.c gcc/testsuite/gcc.dg/compare9.c > index 02150cb1fb6..fba61e42a48 100644 > --- gcc/testsuite/gcc.dg/compare9.c > +++ gcc/testsuite/gcc.dg/compare9.c > @@ -22,20 +22,20 @@ enum mm2 > > int f(enum mm1 x) > { > - return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */ > + return x == (tf?DI:SI); /* { dg-bogus "changes signedness" "case 1" } */ > } > > int g(enum mm1 x) > { > - return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */ > + return x == (tf?DI:-1); /* { dg-bogus "changes signedness" "case 2" } */ > } > > int h(enum mm2 x) > { > - return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */ > + return x == (tf?DI2:SI2); /* { dg-bogus "changes signedness" "case 3" } */ > } > > int i(enum mm2 x) > { > - return x == (tf?DI2:-1); /* { dg-bogus "signed and unsigned" "case 4" } */ > + return x == (tf?DI2:-1); /* { dg-bogus "changes signedness" "case 4" } */ > } > diff --git gcc/testsuite/gcc.dg/pr11492.c gcc/testsuite/gcc.dg/pr11492.c > index cf17712dde1..86435a83e79 100644 > --- gcc/testsuite/gcc.dg/pr11492.c > +++ gcc/testsuite/gcc.dg/pr11492.c > @@ -5,7 +5,7 @@ int main( void ) > { > unsigned int a; > unsigned char b; > - for ( a = 0, b = 2; a > b * 100; a++ ) /* { dg-bogus "comparison between > signed and unsigned integer" } */ > + for ( a = 0, b = 2; a > b * 100; a++ ) /* { dg-bogus "comparison of > integer expressions of different signedness" } */ > { ; } > > return 0; > > Marek Marek