readonly Expression ValueExpr;
readonly EnumMember prev_member;
- Constant value;
+ EnumConstant value;
bool in_transit;
// TODO: remove or simplify
return true;
if (in_transit) {
- // suppress cyclic errors
- value = new EnumConstant (New.Constantify (parent_enum.UnderlyingType), parent_enum.TypeBuilder);
Const.Error_CyclicDeclaration (this);
return false;
}
if (c is EnumConstant)
c = ((EnumConstant)c).Child;
- c = c.ToType (parent_enum.UnderlyingType, Location);
+ c = c.ImplicitConversionRequired (parent_enum.UnderlyingType, Location);
if (c == null)
return false;
return true;
}
- if (!prev_member.ResolveValue ())
+ if (!prev_member.ResolveValue ()) {
+ // Suppress cyclic error
+ prev_member.value = new EnumConstant (New.Constantify (parent_enum.UnderlyingType), parent_enum.TypeBuilder);
return false;
+ }
in_transit = true;
try {
- value = prev_member.value.Increment ();
+ value = (EnumConstant)prev_member.value.Increment ();
}
catch (OverflowException) {
Report.Error (543, Location, "The enumerator value `{0}' is too large to fit in its type `{1}'",
if (OptAttributes != null)
OptAttributes.Emit ();
- if (!ResolveValue ())
+ if (!ResolveValue ()) {
+ // Suppress cyclic errors
+ value = new EnumConstant(New.Constantify(parent_enum.UnderlyingType), parent_enum.TypeBuilder);
return;
+ }
builder.SetConstant (value.GetValue ());
base.Emit ();
#region IConstant Members
- public Constant Value {
- get {
- return value;
- }
+ public Constant CreateConstantReference (Location loc)
+ {
+ if (value == null)
+ return null;
+
+ return new EnumConstant (Constant.CreateConstant (value.Child.Type, value.Child.GetValue(), loc),
+ value.Type);
}
#endregion