diff --git a/TestSuite/errors/err0517_as_generic_parameter.pas b/TestSuite/errors/err0517_as_generic_parameter.pas new file mode 100644 index 000000000..9dfd2ec9a --- /dev/null +++ b/TestSuite/errors/err0517_as_generic_parameter.pas @@ -0,0 +1,9 @@ +//!Операция as не может быть применена к обобщённому параметру T, не имеющему спецификатора "class" +type + A = class + public static procedure Test(x: T) := Print(x as T); + end; + +begin + A&.Test(2); // выводит мусор +end. diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 05f3a050c..bd7647141 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -3179,7 +3179,7 @@ namespace PascalABCCompiler.TreeConverter } else { - if (tp.is_generic_parameter && !tp.is_class && !(tp.base_type != null && tp.base_type.is_class) && !(tp.base_type != null && tp.base_type.original_generic != null && tp.base_type.original_generic.is_class)) + if (tp.is_generic_parameter && !tp.is_class && !(tp.base_type != null && tp.base_type.is_class && tp.base_type != SystemLibrary.SystemLibrary.object_type) && !(tp.base_type != null && tp.base_type.original_generic != null && tp.base_type.original_generic.is_class)) AddError(get_location(node.type_def), "OPERATOR_AS_CAN_NOT_BE_USED_WITH_GENERIC_PARAMETER_{0}_WITHOUT_CLASS_CONSTRAINT", tp.name); if (tp.is_value_type) AddError(get_location(node.type_def), "OPERATOR_AS_MUST_BE_USED_WITCH_A_REFERENCE_TYPE_VALUETYPE{0}", tp.PrintableName);