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

Hopefully you can get at the location_t for the whole of the
subexpression using c_expr, rather than peeking at the first token.

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

Thanks
Dave


> 2017-07-31  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): Pass the
> locations of
>       OP1 and OP2 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.
> 
>       * 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..1876f89d321 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, exp1_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_loc = start;
>        cond.value = c_objc_common_truthvalue_conversion (cond_loc,
> exp1.value);
>        c_inhibit_evaluation_warnings += cond.value ==
> truthvalue_true_node;
>      }
> @@ -6553,6 +6554,7 @@ c_parser_conditional_expression (c_parser
> *parser, struct c_expr *after,
>       = c_objc_common_truthvalue_conversion
>       (cond_loc, default_conversion (cond.value));
>        c_inhibit_evaluation_warnings += cond.value ==
> truthvalue_false_node;
> +      exp1_loc = c_parser_peek_token (parser)->location;
>        exp1 = c_parser_expression_conv (parser);
>        mark_exp_read (exp1.value);
>        c_inhibit_evaluation_warnings +=
> @@ -6569,16 +6571,14 @@ c_parser_conditional_expression (c_parser
> *parser, struct c_expr *after,
>        ret.original_type = NULL;
>        return ret;
>      }
> -  {
> -    location_t exp2_loc = c_parser_peek_token (parser)->location;
> -    exp2 = c_parser_conditional_expression (parser, NULL,
> NULL_TREE);
> -    exp2 = convert_lvalue_to_rvalue (exp2_loc, exp2, true, true);
> -  }
> +  location_t exp2_loc = c_parser_peek_token (parser)->location;
> +  exp2 = c_parser_conditional_expression (parser, NULL, NULL_TREE);
> +  exp2 = convert_lvalue_to_rvalue (exp2_loc, exp2, true, true);
>    c_inhibit_evaluation_warnings -= cond.value ==
> truthvalue_true_node;
>    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, exp1_loc,
> +                                   exp2.value,
> exp2.original_type, exp2_loc);
>    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 7451f3249fd..8b0e020d4c9 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/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..cd7fa1310b7 100644
> --- gcc/testsuite/gcc.dg/Wsign-compare-1.c
> +++ gcc/testsuite/gcc.dg/Wsign-compare-1.c
> @@ -0,0 +1,45 @@
> +/* PR c/81417 */
> +/* { dg-do compile } */
> +/* { dg-options "-Wsign-compare" } */
> +
> +unsigned int
> +f1 (int x, unsigned int y)
> +{
> +  return x ? y : -1; /* { dg-warning "18:operand of conditional
> expression changes signedness: 'int' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f2 (int x, unsigned int y)
> +{
> +  return x ? -1 : y; /* { dg-warning "14:operand of conditional
> expression changes signedness: 'int' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f3 (unsigned int y)
> +{
> +  return y ?: -1; /* { dg-warning "15:operand of conditional
> expression changes signedness: 'int' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f4 (int x, unsigned y, short u)
> +{
> +  return x ? y : u; /* { dg-warning "18:operand of conditional
> expression changes signedness: 'short int' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f5 (int x, unsigned y, short u)
> +{
> +  return x ? u : y; /* { dg-warning "14:operand of conditional
> expression changes signedness: 'short int' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f6 (int x, unsigned y, signed char u)
> +{
> +  return x ? y : u; /* { dg-warning "18:operand of conditional
> expression changes signedness: 'signed char' to 'unsigned int'" } */
> +}
> +
> +unsigned int
> +f7 (int x, unsigned y, signed char u)
> +{
> +  return x ? u : y; /* { dg-warning "14:operand of conditional
> expression changes signedness: 'signed char' to 'unsigned int'" } */
> +}
> 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

Reply via email to