From 68a1a4f3c619789f9782fc250654ceb5f7a0a764 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Tue, 5 Jan 2021 20:06:56 +0100 Subject: [PATCH] #2347 --- NETGenerator/NETGenerator.cs | 2 +- TestSuite/where15.pas | 11 +++++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 4 ++-- TreeConverter/TreeRealization/generics.cs | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 TestSuite/where15.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 408e0eb7a..1bbdf2d05 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -2272,7 +2272,7 @@ namespace PascalABCCompiler.NETGenerator TypeAttributes ta = (not_exist) ? ConvertAttributes(value) : TypeAttributes.NotPublic; - if (value.base_type is ICompiledTypeNode && (value.base_type as ICompiledTypeNode).compiled_type == TypeFactory.EnumType) + if (value.base_type is ICompiledTypeNode && (value.base_type as ICompiledTypeNode).compiled_type == TypeFactory.EnumType && gtpb == null) { ta = TypeAttributes.Public; if (value.type_access_level == type_access_level.tal_internal) diff --git a/TestSuite/where15.pas b/TestSuite/where15.pas new file mode 100644 index 000000000..618078bbd --- /dev/null +++ b/TestSuite/where15.pas @@ -0,0 +1,11 @@ +uses System; + +function ToEnum(self: string): T; extensionmethod; where T: System.Enum; +begin + Result := T(Enum.Parse(typeof(T), self)); +end; + +begin + var color := 'Black'.ToEnum&(); + assert(color = ConsoleColor.Black); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 77383ff7c..6d37d9592 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -12743,10 +12743,10 @@ namespace PascalABCCompiler.TreeConverter { AddError(get_location(specificators[i]), "OBJECT_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR"); } - if (spec_type == SystemLibrary.SystemLibrary.enum_base_type) + /*if (spec_type == SystemLibrary.SystemLibrary.enum_base_type) { AddError(get_location(specificators[i]), "ENUM_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR"); - } + }*/ if (spec_type.IsStatic) AddError(get_location(specificators[i]), "STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR"); check_cycle_inheritance(param, spec_type); diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 8996ff0ec..7a67340a2 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -166,7 +166,7 @@ namespace PascalABCCompiler.TreeRealization return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_DERIVED_FROM_{1}", tn.PrintableName, base_type.name); } } - if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && tn.is_value && !gpe.base_class.is_value && gpe.base_class != SystemLibrary.SystemLibrary.value_type) + if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && tn.is_value && !gpe.base_class.is_value && gpe.base_class != SystemLibrary.SystemLibrary.value_type && gpe.base_class != SystemLibrary.SystemLibrary.enum_base_type) { return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName); }