diff --git a/TestSuite/CompilationSamples/lib.dll b/TestSuite/CompilationSamples/lib.dll new file mode 100644 index 000000000..cb00a0532 Binary files /dev/null and b/TestSuite/CompilationSamples/lib.dll differ diff --git a/TestSuite/CompilationSamples/xpointers_in_dll.pas b/TestSuite/CompilationSamples/xpointers_in_dll.pas new file mode 100644 index 000000000..cfc84d98d --- /dev/null +++ b/TestSuite/CompilationSamples/xpointers_in_dll.pas @@ -0,0 +1,10 @@ +{$reference lib.dll} + +procedure p1; +begin + var r: lib.r1; // запись обязательно из библиотеки + var p: ^char; + r.p := p; // обязательно присвоить полю значение переменной. если присваивать nil - не воспроизводится +end; + +begin end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index 5ae2c72cd..0888ac6e4 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -1057,7 +1057,13 @@ namespace PascalABCCompiler.TreeRealization } if (rtn == null) { - return null; + if (ctn is compiled_type_node && (ctn as compiled_type_node).compiled_type.IsPointer) + { + if (this.pointed_type == compiled_type_node.get_type_node((ctn as compiled_type_node).compiled_type.GetElementType())) + return PascalABCCompiler.TreeConverter.convertion_data_and_alghoritms.get_empty_conversion(this, ctn, false); + return get_implicit_conversion_to(new ref_type_node(compiled_type_node.get_type_node((ctn as compiled_type_node).compiled_type.GetElementType()))); + } + return null; } if (rtn.pointed_type == null || this.pointed_type == null) return null;