mirror of git://gcc.gnu.org/git/gcc.git
re PR c/69669 (ICE with enum __attribute__((mode(QI))))
PR c/69669 * c-decl.c (finish_enum): When honoring mode attribute, make sure to use proper TYPE_MIN_VALUE and TYPE_MAX_VALUE. * c-c++-common/pr69669.c: New test. From-SVN: r233154
This commit is contained in:
parent
25f738f210
commit
1066e9b533
|
|
@ -1,3 +1,9 @@
|
||||||
|
2016-02-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c/69669
|
||||||
|
* c-decl.c (finish_enum): When honoring mode attribute,
|
||||||
|
make sure to use proper TYPE_MIN_VALUE and TYPE_MAX_VALUE.
|
||||||
|
|
||||||
2016-01-29 Jakub Jelinek <jakub@redhat.com>
|
2016-01-29 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR debug/69518
|
PR debug/69518
|
||||||
|
|
|
||||||
|
|
@ -8037,7 +8037,24 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||||
precision = MAX (tree_int_cst_min_precision (minnode, sign),
|
precision = MAX (tree_int_cst_min_precision (minnode, sign),
|
||||||
tree_int_cst_min_precision (maxnode, sign));
|
tree_int_cst_min_precision (maxnode, sign));
|
||||||
|
|
||||||
if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
|
/* If the precision of the type was specified with an attribute and it
|
||||||
|
was too small, give an error. Otherwise, use it. */
|
||||||
|
if (TYPE_PRECISION (enumtype) && lookup_attribute ("mode", attributes))
|
||||||
|
{
|
||||||
|
if (precision > TYPE_PRECISION (enumtype))
|
||||||
|
{
|
||||||
|
TYPE_PRECISION (enumtype) = 0;
|
||||||
|
error ("specified mode too small for enumeral values");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
precision = TYPE_PRECISION (enumtype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
TYPE_PRECISION (enumtype) = 0;
|
||||||
|
|
||||||
|
if (TYPE_PACKED (enumtype)
|
||||||
|
|| precision > TYPE_PRECISION (integer_type_node)
|
||||||
|
|| TYPE_PRECISION (enumtype))
|
||||||
{
|
{
|
||||||
tem = c_common_type_for_size (precision, sign == UNSIGNED ? 1 : 0);
|
tem = c_common_type_for_size (precision, sign == UNSIGNED ? 1 : 0);
|
||||||
if (tem == NULL)
|
if (tem == NULL)
|
||||||
|
|
@ -8054,17 +8071,7 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||||
TYPE_UNSIGNED (enumtype) = TYPE_UNSIGNED (tem);
|
TYPE_UNSIGNED (enumtype) = TYPE_UNSIGNED (tem);
|
||||||
TYPE_ALIGN (enumtype) = TYPE_ALIGN (tem);
|
TYPE_ALIGN (enumtype) = TYPE_ALIGN (tem);
|
||||||
TYPE_SIZE (enumtype) = 0;
|
TYPE_SIZE (enumtype) = 0;
|
||||||
|
TYPE_PRECISION (enumtype) = TYPE_PRECISION (tem);
|
||||||
/* If the precision of the type was specified with an attribute and it
|
|
||||||
was too small, give an error. Otherwise, use it. */
|
|
||||||
if (TYPE_PRECISION (enumtype)
|
|
||||||
&& lookup_attribute ("mode", attributes))
|
|
||||||
{
|
|
||||||
if (precision > TYPE_PRECISION (enumtype))
|
|
||||||
error ("specified mode too small for enumeral values");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
TYPE_PRECISION (enumtype) = TYPE_PRECISION (tem);
|
|
||||||
|
|
||||||
layout_type (enumtype);
|
layout_type (enumtype);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-02-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c/69669
|
||||||
|
* c-c++-common/pr69669.c: New test.
|
||||||
|
|
||||||
2016-02-04 Michael Meissner <meissner@linux.vnet.ibm.com>
|
2016-02-04 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
PR target/69667
|
PR target/69667
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
/* PR c/69669 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
|
||||||
|
enum __attribute__((mode(QI))) E { F = 1 };
|
||||||
|
|
||||||
|
void
|
||||||
|
foo (enum E *x, int y)
|
||||||
|
{
|
||||||
|
*x = (enum E) y;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue