/* Finish the enumeration type. */
if (TREE_CODE (t->ctype) == ENUMERAL_TYPE)
{
- TYPE_MIN_VALUE (t->ctype) = TYPE_MIN_VALUE (basetype);
- TYPE_MAX_VALUE (t->ctype) = TYPE_MAX_VALUE (basetype);
- TYPE_UNSIGNED (t->ctype) = TYPE_UNSIGNED (basetype);
- SET_TYPE_ALIGN (t->ctype, TYPE_ALIGN (basetype));
- TYPE_SIZE (t->ctype) = NULL_TREE;
- TYPE_PRECISION (t->ctype) = dmd::size (t, t->sym->loc) * 8;
+ tree type = TYPE_MAIN_VARIANT (t->ctype);
- layout_type (t->ctype);
+ if (type == t->ctype)
+ {
+ TYPE_MIN_VALUE (type) = TYPE_MIN_VALUE (basetype);
+ TYPE_MAX_VALUE (type) = TYPE_MAX_VALUE (basetype);
+ TYPE_UNSIGNED (type) = TYPE_UNSIGNED (basetype);
+ SET_TYPE_ALIGN (type, TYPE_ALIGN (basetype));
+ TYPE_SIZE (type) = NULL_TREE;
+ TYPE_PRECISION (type) = dmd::size (t, t->sym->loc) * 8;
+
+ layout_type (type);
+ }
/* Fix up all forward-referenced variants of this enum type. */
- for (tree v = TYPE_MAIN_VARIANT (t->ctype); v;
- v = TYPE_NEXT_VARIANT (v))
+ for (tree variant = TYPE_NEXT_VARIANT (type); variant;
+ variant = TYPE_NEXT_VARIANT (variant))
{
- if (v == t->ctype)
- continue;
-
- TYPE_VALUES (v) = TYPE_VALUES (t->ctype);
- TYPE_LANG_SPECIFIC (v) = TYPE_LANG_SPECIFIC (t->ctype);
- TYPE_MIN_VALUE (v) = TYPE_MIN_VALUE (t->ctype);
- TYPE_MAX_VALUE (v) = TYPE_MAX_VALUE (t->ctype);
- TYPE_UNSIGNED (v) = TYPE_UNSIGNED (t->ctype);
- TYPE_SIZE (v) = TYPE_SIZE (t->ctype);
- TYPE_SIZE_UNIT (v) = TYPE_SIZE_UNIT (t->ctype);
- SET_TYPE_MODE (v, TYPE_MODE (t->ctype));
- TYPE_PRECISION (v) = TYPE_PRECISION (t->ctype);
- SET_TYPE_ALIGN (v, TYPE_ALIGN (t->ctype));
- TYPE_USER_ALIGN (v) = TYPE_USER_ALIGN (t->ctype);
+ TYPE_VALUES (variant) = TYPE_VALUES (type);
+ TYPE_LANG_SPECIFIC (variant) = TYPE_LANG_SPECIFIC (type);
+ TYPE_MIN_VALUE (variant) = TYPE_MIN_VALUE (type);
+ TYPE_MAX_VALUE (variant) = TYPE_MAX_VALUE (type);
+ TYPE_UNSIGNED (variant) = TYPE_UNSIGNED (type);
+ TYPE_SIZE (variant) = TYPE_SIZE (type);
+ TYPE_SIZE_UNIT (variant) = TYPE_SIZE_UNIT (type);
+ SET_TYPE_MODE (variant, TYPE_MODE (type));
+ TYPE_PRECISION (variant) = TYPE_PRECISION (type);
+ SET_TYPE_ALIGN (variant, TYPE_ALIGN (type));
+ TYPE_USER_ALIGN (variant) = TYPE_USER_ALIGN (type);
}
/* Complete forward-referenced fields of this enum type. */