re PR c/56566 (bogus "is narrower than values of its type" warning)

PR c/56566
	* tree.c (tree_int_cst_min_precision): For integer_zerop (value)
	return 1 even for !unsignedp.

	* c-c++-common/pr56566.c: New test.

From-SVN: r196767
This commit is contained in:
Jakub Jelinek 2013-03-18 08:10:33 +01:00 committed by Jakub Jelinek
parent 136357ac8d
commit 12d2dc5e67
4 changed files with 30 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2013-03-18 Jakub Jelinek <jakub@redhat.com>
PR c/56566
* tree.c (tree_int_cst_min_precision): For integer_zerop (value)
return 1 even for !unsignedp.
2013-03-17 Uros Bizjak <ubizjak@gmail.com> 2013-03-17 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (isa): Add x64 and nox64. * config/i386/i386.md (isa): Add x64 and nox64.

View File

@ -1,3 +1,8 @@
2013-03-18 Jakub Jelinek <jakub@redhat.com>
PR c/56566
* c-c++-common/pr56566.c: New test.
2013-03-17 Jason Merrill <jason@redhat.com> 2013-03-17 Jason Merrill <jason@redhat.com>
* g++.dg/template/abstract-dr337.C: XFAIL. * g++.dg/template/abstract-dr337.C: XFAIL.

View File

@ -0,0 +1,14 @@
/* PR c/56566 */
/* { dg-do compile } */
/* { dg-options "" } */
struct S1 { enum E1 { N1 = -1, Z1 = 0 } e : 1; };
struct S2 { enum E2 { N2 = -1 } e : 1; };
struct S3 { enum E3 { Z3 = 0 } e : 1; };
struct S4 { enum E4 { N4 = -2, Z4 = 1 } e : 2; };
struct S5 { enum E5 { N5 = -3, Z5 = 1 } e : 3; };
struct S6 { enum E6 { N6 = -2, Z6 = 1 } e : 1; }; // { dg-warning "too small|narrower" }
struct S7 { enum E7 { N7 = -3, Z7 = 1 } e : 2; }; // { dg-warning "too small|narrower" }
struct S8 { enum E8 { Z8 = 1 } e : 1; };
struct S9 { enum E9 { Z9 = 2 } e : 2; };
struct S0 { enum E0 { Z0 = 2 } e : 1; }; // { dg-warning "too small|narrower" }

View File

@ -6648,8 +6648,6 @@ tree_int_cst_sgn (const_tree t)
unsigned int unsigned int
tree_int_cst_min_precision (tree value, bool unsignedp) tree_int_cst_min_precision (tree value, bool unsignedp)
{ {
int log;
/* If the value is negative, compute its negative minus 1. The latter /* If the value is negative, compute its negative minus 1. The latter
adjustment is because the absolute value of the largest negative value adjustment is because the absolute value of the largest negative value
is one larger than the largest positive value. This is equivalent to is one larger than the largest positive value. This is equivalent to
@ -6659,14 +6657,14 @@ tree_int_cst_min_precision (tree value, bool unsignedp)
value = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (value), value); value = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (value), value);
/* Return the number of bits needed, taking into account the fact /* Return the number of bits needed, taking into account the fact
that we need one more bit for a signed than unsigned type. */ that we need one more bit for a signed than unsigned type.
If value is 0 or -1, the minimum precision is 1 no matter
whether unsignedp is true or false. */
if (integer_zerop (value)) if (integer_zerop (value))
log = 0; return 1;
else else
log = tree_floor_log2 (value); return tree_floor_log2 (value) + 1 + !unsignedp;
return log + 1 + !unsignedp;
} }
/* Compare two constructor-element-type constants. Return 1 if the lists /* Compare two constructor-element-type constants. Return 1 if the lists