summaryrefslogtreecommitdiff
path: root/gcc/c-decl.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-04-14 23:01:38 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-04-14 23:01:38 +0000
commit8b2f77e739c14399642546438df48e64b7783809 (patch)
treea2e2acceef2effbca1fa1f23ebeb60b09e26acbf /gcc/c-decl.c
parentaa076a66e129e2e28f87beeda744e4175c621683 (diff)
downloadgcc-8b2f77e739c14399642546438df48e64b7783809.tar.gz
(finish_enum): Don't crash if no type can represent all enumeration values.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@11771 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r--gcc/c-decl.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 6ad09d94ba5..249992b23ba 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5894,8 +5894,16 @@ finish_enum (enumtype, values, attributes)
if (flag_short_enums || TYPE_PACKED (enumtype)
|| precision > TYPE_PRECISION (integer_type_node))
- /* Use the width of the narrowest normal C type which is wide enough. */
- TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
+ {
+ tree narrowest = type_for_size (precision, 1);
+ if (narrowest == 0)
+ {
+ warning ("enumeration values exceed range of largest integer");
+ narrowest = long_long_integer_type_node;
+ }
+
+ TYPE_PRECISION (enumtype) = TYPE_PRECISION (narrowest);
+ }
else
TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);