mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 07:00:35 +08:00
c-family: One more 40752 tweak for unsigned char.
My last patch didn't fix all the failures on unsignd char targets. We were missing one warning because by suppressing -Wsign-conversion for the second operand of + we missed an overflow that we want to warn about, and we properly don't warn about unsigned / or %. PR testsuite/93391 - PR 40752 test fails with unsigned plain char. * c-warn.c (conversion_warning): Change -Wsign-conversion handling. * lib/target-supports.exp (check_effective_target_unsigned_char): New.
This commit is contained in:
parent
54b3d52c3c
commit
6d00f052ef
gcc
@ -1,3 +1,7 @@
|
||||
2020-01-23 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* c-warn.c (conversion_warning): Change -Wsign-conversion handling.
|
||||
|
||||
2020-01-23 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c/84919
|
||||
|
@ -1315,10 +1315,14 @@ conversion_warning (location_t loc, tree type, tree expr, tree result)
|
||||
for (int i = 0; i < arith_ops; ++i)
|
||||
{
|
||||
tree op = TREE_OPERAND (expr, i);
|
||||
tree opr = convert (type, op);
|
||||
/* Avoid -Wsign-conversion for (unsigned)(x + (-1)). */
|
||||
bool minus = TREE_CODE (expr) == PLUS_EXPR && i == 1;
|
||||
if (unsafe_conversion_p (type, op, opr, !minus))
|
||||
if (TREE_CODE (expr) == PLUS_EXPR && i == 1
|
||||
&& INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
|
||||
&& TREE_CODE (op) == INTEGER_CST
|
||||
&& tree_int_cst_sgn (op) < 0)
|
||||
op = fold_build1 (NEGATE_EXPR, TREE_TYPE (op), op);
|
||||
tree opr = convert (type, op);
|
||||
if (unsafe_conversion_p (type, op, opr, true))
|
||||
goto op_unsafe;
|
||||
}
|
||||
/* The operands seem safe, we might still want to warn if
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-01-23 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* lib/target-supports.exp (check_effective_target_unsigned_char):
|
||||
New.
|
||||
|
||||
2020-01-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/93376
|
||||
|
@ -14,9 +14,10 @@ void foo(char c, char c2)
|
||||
c *= 2; /* { dg-warning "conversion" } */
|
||||
c *= c2; /* { dg-warning "conversion" } */
|
||||
c /= 2;
|
||||
c /= c2; /* { dg-warning "conversion" } */
|
||||
/* If char is unsigned we avoid promoting to int. */
|
||||
c /= c2; /* { dg-warning "conversion" "" { target { ! unsigned_char } } } */
|
||||
c %= 2;
|
||||
c %= c2; /* { dg-warning "conversion" } */
|
||||
c %= c2; /* { dg-warning "conversion" "" { target { ! unsigned_char } } } */
|
||||
c = -c2; /* { dg-warning "conversion" } */
|
||||
c = ~c2; /* { dg-warning "conversion" } */
|
||||
c = c2++;
|
||||
|
@ -3115,6 +3115,14 @@ proc check_effective_target_dfprt { } {
|
||||
}]
|
||||
}
|
||||
|
||||
# Return 1 iff target has unsigned plain 'char' by default.
|
||||
|
||||
proc check_effective_target_unsigned_char {} {
|
||||
return [check_no_compiler_messages unsigned_char assembly {
|
||||
char ar[(char)-1];
|
||||
}]
|
||||
}
|
||||
|
||||
proc check_effective_target_powerpc_popcntb_ok { } {
|
||||
return [check_cached_effective_target powerpc_popcntb_ok {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user