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)


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


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