[ilasm] Imlicitly set enums value__ special flags
authorMarek Safar <marek.safar@gmail.com>
Tue, 14 Jul 2015 09:31:20 +0000 (11:31 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 14 Jul 2015 09:32:23 +0000 (11:32 +0200)
mcs/ilasm/codegen/TypeDef.cs
mcs/ilasm/parser/ILParser.jay

index 55fbfd12675dfe4c329e5a6379f962e3cef2916c..793e47c8a2aeb8ea25919ae770aafa6bf61a66f9 100644 (file)
@@ -352,7 +352,7 @@ namespace Mono.ILASM {
                                         is_enum_class = true;
 
                                 if (!IsValueType (name_space, name) && !IsEnumType (name_space, name) &&
-                                        is_value_class && !is_enum_class && (attr & PEAPI.TypeAttr.Sealed) == 0) {
+                                        is_value_class && (attr & PEAPI.TypeAttr.Sealed) == 0) {
 
                                         attr |= PEAPI.TypeAttr.Sealed;
                                 }
@@ -415,6 +415,10 @@ namespace Mono.ILASM {
                 {
                         ArrayList fielddef_list = new ArrayList ();
                         foreach (FieldDef fielddef in field_list) {
+                                if (is_enum_class && fielddef.Name == "value__") {
+                                    fielddef.Attributes |= PEAPI.FieldAttr.SpecialName | PEAPI.FieldAttr.RTSpecialName;
+                                }
+
                                 fielddef.Define (code_gen, classdef);
                                 fielddef_list.Add (fielddef.PeapiFieldDef);
                         }
index e4a980cb115832ec2fcfd7c24a6e4bde09536a35..8f994051c9abc1c6e40e55aca9c53effc5bd5b71 100644 (file)
@@ -607,8 +607,7 @@ class_attr          : /* EMPTY */
                        | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
                        | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
                        | class_attr K_VALUE                    { is_value_class = true; }\r
-                       | class_attr K_ENUM                     { is_enum_class = true; is_value_class = true;\r
-                         }\r
+                       | class_attr K_ENUM                     { is_enum_class = true; }\r
                        | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
                        | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
                        | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r