diff --git a/TestSuite/where2.pas b/TestSuite/where2.pas new file mode 100644 index 000000000..c453bd674 --- /dev/null +++ b/TestSuite/where2.pas @@ -0,0 +1,9 @@ +function DQNToNullable2 (ff: System.Nullable; v: T): System.Nullable; where T: record; +begin + Result := new System.Nullable(v); +end; + +begin + var v := DQNToNullable2(2,2); + assert(v.Value = 2); +end. \ No newline at end of file diff --git a/TestSuite/where3.pas b/TestSuite/where3.pas new file mode 100644 index 000000000..48aaec155 --- /dev/null +++ b/TestSuite/where3.pas @@ -0,0 +1,16 @@ +function Test(a: T): T; where T:constructor; +begin + Result := new T; +end; + +function Test2(a: T): T; where T:record; +begin + Result := a; +end; + +begin + var obj := Test(new StringBuilder); + assert(obj.Length = 0); + assert(Test(new StringBuilder).Length = 0); + assert(Test2(2) = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 79cf40607..8a7ecdc72 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -11833,6 +11833,10 @@ namespace PascalABCCompiler.TreeConverter { visit_generic_params(context.top_function, _function_header.template_args.idents); } + if (_function_header.where_defs != null) + { + visit_where_list(_function_header.where_defs); + } SymbolInfoUnit si = context.create_special_names(); weak_node_test_and_visit(_function_header.parameters); type_node tn = null; @@ -12012,11 +12016,7 @@ namespace PascalABCCompiler.TreeConverter AddError(get_location(_function_header), "FUNCTION_NEED_RETURN_TYPE"); if (_function_header.where_defs != null) { - if (unique) - { - visit_where_list(_function_header.where_defs); - } - else + if (!unique) { AddError(get_location(_function_header.where_defs), "WHERE_SECTION_MUST_BE_ONLY_IN_FIRST_DECLARATION"); } @@ -12105,6 +12105,10 @@ namespace PascalABCCompiler.TreeConverter { visit_generic_params(context.top_function, _procedure_header.template_args.idents); } + if (_procedure_header.where_defs != null) + { + visit_where_list(_procedure_header.where_defs); + } weak_node_test_and_visit(_procedure_header.parameters); if (_procedure_header.name.class_name != null) with_class_name = true; @@ -12179,11 +12183,7 @@ namespace PascalABCCompiler.TreeConverter } if (_procedure_header.where_defs != null) { - if (unique) - { - visit_where_list(_procedure_header.where_defs); - } - else + if (!unique) { AddError(get_location(_procedure_header.where_defs), "WHERE_SECTION_MUST_BE_ONLY_IN_FIRST_DECLARATION"); }