From c71e1f19cb45756623aeb2e636e4dfe9342b23e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 11 Jun 2017 14:56:40 +0200 Subject: [PATCH] bug fix #420 --- TestSuite/where2.pas | 9 +++++++++ TestSuite/where3.pas | 16 +++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 20 +++++++++---------- 3 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 TestSuite/where2.pas create mode 100644 TestSuite/where3.pas 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"); }