This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C PATCH to further improve diagnostic for -Wsign-compare (PR c/81417)


On Tue, 2017-08-01 at 16:15 +0200, Marek Polacek wrote:
> On Mon, Jul 31, 2017 at 11:31:44AM -0400, David Malcolm wrote:
> > On Mon, 2017-07-31 at 16:14 +0200, Marek Polacek wrote:
> > > This patch improves the diagnostic of -Wsign-compare for ?: by
> > > also
> > > printing
> > > the types, similarly to my recent patch.  But we can do even
> > > better
> > > here if we
> > > actually point to the operand in question, so I passed the
> > > locations
> > > of the
> > > operands from the parser.
> > 
> > Thanks for updating the patch.
> > 
> > >   So instead of 
> > > 
> > > x.c:8:16: warning: signed and unsigned type in conditional
> > > expression
> > > [-Wsign-compare]
> > >    return x ? y : -1;
> > >                 ^
> > > you'll now see:
> > > 
> > > x.c:8:18: warning: operand of conditional expression changes
> > > signedness: 'int' to 'unsigned int' [-Wsign-compare]
> > >    return x ? y : -1;
> > >                   ^
> > 
> > That's an improvement, but I would have expected it to underline
> > the
> > whole of the pertinent subexpression e.g.:
> > 
> >    return x ? y : -1;
> >                   ^~
> > 
> > rather than just:
> > 
> >    return x ? y : -1;
> >                   ^
> > 
> > From my reading of the patch, it's capturing just the location of
> > the
> > first token within the subexpression (hence e.g. just the minus
> > token
> > in the example above, which happens to make some sense for this
> > case,
> > but wouldn't in general).
> 
> Right.
> 
> > Hopefully you can get at the location_t for the whole of the
> > subexpression using c_expr, rather than peeking at the first token.
> 
> It didn't seem obvious to me how to do that, but I've spent more time
> on this now.  I believe we need to use make_location (I've introduced
> a new overload), as in the patch below.  Or did you in mind anything
> else?

I think I was confused with the C++ frontend, where cp_expr has a
location_t representing all three of (caret, start, finish), whereas in
the C frontend c_expr has a source_range, representing just (start,
finish).

New overload looks reasonable.

> > > Bootstrapped/regtested on x86_64-linux, ok for trunk?
> > 
> > The patch doesn't have a testcase for the location information;
> > please
> > add one, using -fdiagnostics-show-caret and dg-begin-multiline-
> > output/
> > dg-end-multiline-output.  Please ensure that the pertinent
> > expressions
> > are more than one character wide, so that the test properly
> > verifies
> > the underlining.
> 
> Done.
> 
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

Thanks for updating the patch.

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).


Other than than, LGTM.


> 2017-08-01  Marek Polacek  <polacek@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..3f797377679 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 conditional
> expression "
> +				    "changes signedness: %qT to
> %qT",
> +				    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 conditional
> expression "
> +				    "changes signedness: %qT to
> %qT",
> +				    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..d6fde20b68d 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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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 conditional
> expression changes signedness: '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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]