From a59f622e0c20803e3a0b385091fe2b5e26085ff7 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, 19 Feb 2017 12:27:51 +0100 Subject: [PATCH] bug fix #348 --- TestSuite/CompilationSamples/PABCSystem.pas | 57 ++++++++++++++++--- TestSuite/delegates8.pas | 15 +++++ .../convertion_data_and_alghoritms.cs | 16 +++++- 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 TestSuite/delegates8.pas diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 1ebfecdb0..97eb0f485 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -385,6 +385,8 @@ type function FullName: string; /// Возвращает в виде строки содержимое файла от текущего положения до конца function ReadToEnd: string; + /// Устанавливает файловый указатель на начало файла + procedure Reset; end; /// Тип текстового файла @@ -1213,8 +1215,27 @@ function Odd(i: uint64): boolean; // ----------------------------------------------------- /// Конструирует комплексное число с вещественной частью re и мнимой частью im function Cplx(re,im: real): Complex; -/// Вычисляет квадратный корень из комплексного числа +/// Конструирует комплексное число по полярным координатам +function CplxFromPolar(magnitude,phase: real) : Complex; +/// Возвращает квадратный корень из комплексного числа function Sqrt(c: Complex): Complex; +/// Возвращает модуль комплексного числа +function Abs(c: Complex): Complex; +/// Возвращает комплексно сопряженное число +function Conjugate(c: Complex): Complex; +/// Возвращает косинус комплексного числа +function Cos(c: Complex): Complex; +/// Возвращает экспоненту комплексного числа +function Exp(c: Complex): Complex; +/// Возвращает натуральный логарифм комплексного числа +function Log(c: Complex): Complex; +/// Возвращает десятичный логарифм комплексного числа +function Log10(c: Complex): Complex; +/// Возвращает степень комплексного числа +function Power(c,power: Complex): Complex; +/// Возвращает синус комплексного числа +function Sin(c: Complex): Complex; + // ----------------------------------------------------- //>> Процедуры для работы со стандартными множествами # Subroutines for set of T @@ -5207,6 +5228,12 @@ begin Result := sr.ReadToEnd end; +procedure Text.Reset; +begin + PABCSystem.Reset(Self); +end; + + // ----------------------------------------------------- // AbstractBinaryFile methods // ----------------------------------------------------- @@ -7038,16 +7065,27 @@ begin result := (i mod 2) <> 0; end; -function Cplx(re,im: real): Complex; -begin - Result := new Complex(re,im); -end; +function Cplx(re,im: real) := new Complex(re,im); -function Sqrt(c: Complex): Complex; -begin - Result := Complex.Sqrt(c); -end; +function CplxFromPolar(magnitude,phase: real) := Complex.FromPolarCoordinates(magnitude,phase); +function Sqrt(c: Complex) := Complex.Sqrt(c); + +function Abs(c: Complex) := Complex.Abs(c); + +function Conjugate(c: Complex) := Complex.Conjugate(c); + +function Cos(c: Complex) := Complex.Cos(c); + +function Exp(c: Complex) := Complex.Exp(c); + +function Log(c: Complex) := Complex.Log(c); + +function Log10(c: Complex) := Complex.Log10(c); + +function Power(c,power: Complex) := Complex.Pow(c,power); + +function Sin(c: Complex) := Complex.Sin(c); // ----------------------------------------------------- // Dynamic arrays: implementation @@ -9937,6 +9975,7 @@ function operator> (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensi ///-- function operator>= (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := CompareToTup4(Self,v) >= 0; + // -------------------------------------------- // Методы расширения типа Tuple # Extension methods for Tuple // ------------------------------------------- diff --git a/TestSuite/delegates8.pas b/TestSuite/delegates8.pas new file mode 100644 index 000000000..0dd550dcb --- /dev/null +++ b/TestSuite/delegates8.pas @@ -0,0 +1,15 @@ +var x: integer; +procedure pp; +begin + x := 1; +end; + +type proc = procedure; +begin + var p: procedure; + var o: object := p; + o := pp; + p := proc(o); + p; + assert(x = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 4eb99d834..2523ef9d2 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -1099,8 +1099,20 @@ namespace PascalABCCompiler.TreeConverter { if (is_alone_method_defined) { - error = new CanNotConvertTypes(factparams[i], factparams[i].type, formal_param_type, locg); - //AddError(new CanNotConvertTypes(factparams[i], factparams[i].type, formal_param_type, locg)); + //issue #348 + if (formal_param_type == SystemLibrary.SystemLibrary.object_type && factparams[i].type is delegated_methods) + { + possible_type_convertions ptci = new possible_type_convertions(); + ptci.first = null; + ptci.second = null; + ptci.from = factparams[i].type; + ptci.to = formal_param_type; + tc.AddElement(ptci); + factparams[i] = syntax_tree_visitor.CreateDelegateCall((factparams[i].type as delegated_methods).proper_methods[0]); + return tc; + } + else + error = new CanNotConvertTypes(factparams[i], factparams[i].type, formal_param_type, locg); } return null;