From a1e136334724665b958d31b101f7e04aba6c0e1c Mon Sep 17 00:00:00 2001 From: miks1965 Date: Thu, 28 Jun 2018 22:12:52 +0300 Subject: [PATCH] bug fix #918 --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 2 +- Localization/DefaultLang.resources | Bin 84022 -> 84058 bytes .../PascalABCParserNewSaushkin/ABCPascal.cs | 2 +- .../PascalABCParserNewSaushkin/ABCPascal.y | 46 +++- .../ABCPascalYacc.cs | 48 +++- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- .../StandardSyntaxConverter.cs | 4 +- TestSuite/CompilationSamples/PABCSystem.pas | 40 +-- TestSuite/MinInt32Const.pas | 4 + .../formatter_tests/input/PABCSystem.pas | 232 ++++++++++++++---- bin/Lng/Eng/PascalABCParser.dat | 3 +- bin/Lng/Rus/PascalABCParser.dat | 3 +- bin/TestRunner.exe | Bin 31744 -> 37888 bytes 14 files changed, 308 insertions(+), 80 deletions(-) create mode 100644 TestSuite/MinInt32Const.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index db8a6b68d..f27ac01a1 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "4"; public const string Build = "0"; - public const string Revision = "1678"; + public const string Revision = "1682"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index df7d9118e..4e22e0aef 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=4 -%REVISION%=1678 +%REVISION%=1682 %COREVERSION%=0 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index a7959d5d993fd30000f548b2c5cee57fcd8bea5d..581640f5dc3b448ca369e8195a186e5dc7b9844e 100644 GIT binary patch delta 58 zcmV-A0LA~dkOkV11(4tYcCq2FKq5jxL|;ixR5Cr$>*)CE?(87!;Oph>{Oa!IAok_! Q?&S>%gN{MBjzIya2CQZv-T(jq delta 23 fcmcaLfpyyi)(H<7gEl@~@6f!(ar+iW#${{(iHZu) diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index ef301bb58..7f03a5195 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -2,7 +2,7 @@ // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 // Machine: DESKTOP-A6LT9RI -// DateTime: 12.06.2018 22:19:29 +// DateTime: 28.06.2018 21:28:15 // UserName: ????????? // GPLEX input file // GPLEX frame file diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index 4532a00fa..3306b46e7 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -836,6 +836,28 @@ const_factor } | sign const_factor { + // ðó÷íàß êîððåêöèß öåëûõ êîíñòàíò + if ($1.type == Operators.Minus) + { + var i64 = $2 as int64_const; + if (i64 != null && i64.val == (Int64)Int32.MaxValue + 1) + { + $$ = new int32_const(Int32.MinValue); + break; + } + var ui64 = $2 as uint64_const; + if (ui64 != null && ui64.val == (UInt64)Int64.MaxValue + 1) + { + $$ = new int64_const(Int64.MinValue); + break; + } + if (ui64 != null && ui64.val > (UInt64)Int64.MaxValue + 1) + { + parsertools.AddErrorFromResource("BAD_INT2",@$); + break; + } + // ìîæíî ñäåëàòü âû÷èñëåíèå êîíñòàíòû ñ âìîíòèðîâàííûì ìèíóñîì + } $$ = new un_expr($2, $1.type, @$); } | new_expr @@ -3364,7 +3386,29 @@ factor $$ = new un_expr($2, $1.type, @$); } | sign factor - { + { + if ($1.type == Operators.Minus) + { + var i64 = $2 as int64_const; + if (i64 != null && i64.val == (Int64)Int32.MaxValue + 1) + { + $$ = new int32_const(Int32.MinValue); + break; + } + var ui64 = $2 as uint64_const; + if (ui64 != null && ui64.val == (UInt64)Int64.MaxValue + 1) + { + $$ = new int64_const(Int64.MinValue); + break; + } + if (ui64 != null && ui64.val > (UInt64)Int64.MaxValue + 1) + { + parsertools.AddErrorFromResource("BAD_INT2",@$); + break; + } + // ìîæíî ñäåëàòü âû÷èñëåíèå êîíñòàíòû ñ âìîíòèðîâàííûì ìèíóñîì + } + $$ = new un_expr($2, $1.type, @$); } | tkDeref factor diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index c36b7e7ad..81f88b16d 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,7 +2,7 @@ // GPPG version 1.3.6 // Machine: DESKTOP-A6LT9RI -// DateTime: 12.06.2018 22:19:30 +// DateTime: 28.06.2018 21:28:15 // UserName: ????????? // Input file @@ -3163,6 +3163,28 @@ public partial class GPPGParser: ShiftReduceParser sign, const_factor { + // ������ ��������� ����� �������� + if (ValueStack[ValueStack.Depth-2].op.type == Operators.Minus) + { + var i64 = ValueStack[ValueStack.Depth-1].ex as int64_const; + if (i64 != null && i64.val == (Int64)Int32.MaxValue + 1) + { + CurrentSemanticValue.ex = new int32_const(Int32.MinValue); + break; + } + var ui64 = ValueStack[ValueStack.Depth-1].ex as uint64_const; + if (ui64 != null && ui64.val == (UInt64)Int64.MaxValue + 1) + { + CurrentSemanticValue.ex = new int64_const(Int64.MinValue); + break; + } + if (ui64 != null && ui64.val > (UInt64)Int64.MaxValue + 1) + { + parsertools.AddErrorFromResource("BAD_INT2",CurrentLocationSpan); + break; + } + // ����� ������� ���������� ��������� � �������������� ������� + } CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; @@ -5569,7 +5591,29 @@ public partial class GPPGParser: ShiftReduceParser sign, factor -{ +{ + if (ValueStack[ValueStack.Depth-2].op.type == Operators.Minus) + { + var i64 = ValueStack[ValueStack.Depth-1].ex as int64_const; + if (i64 != null && i64.val == (Int64)Int32.MaxValue + 1) + { + CurrentSemanticValue.ex = new int32_const(Int32.MinValue); + break; + } + var ui64 = ValueStack[ValueStack.Depth-1].ex as uint64_const; + if (ui64 != null && ui64.val == (UInt64)Int64.MaxValue + 1) + { + CurrentSemanticValue.ex = new int64_const(Int64.MinValue); + break; + } + if (ui64 != null && ui64.val > (UInt64)Int64.MaxValue + 1) + { + parsertools.AddErrorFromResource("BAD_INT2",CurrentLocationSpan); + break; + } + // ����� ������� ���������� ��������� � �������������� ������� + } + CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index a73166aeb..cd5513b4c 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.4.0.1678' +!define VERSION '3.4.0.1682' diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs index f6f541f5c..a13edb3e7 100644 --- a/SyntaxTreeConverters/StandardSyntaxConverter.cs +++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs @@ -22,7 +22,7 @@ namespace PascalABCCompiler.SyntaxTreeConverters // Выносим выражения с лямбдами из заголовка foreach StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root); - //--- Обработка синтаксически сахарных узлов + // type classes { var typeclasses = SyntaxVisitors.TypeclassVisitors.FindTypeclassesVisitor.New; @@ -32,7 +32,9 @@ namespace PascalABCCompiler.SyntaxTreeConverters SyntaxVisitors.TypeclassVisitors.ReplaceTypeclassVisitor.New(instancesAndRestrictedFunctions).ProcessNode(root); } root.FillParentsInAllChilds(); +#if DEBUG //new SimplePrettyPrinterVisitor("E:/projs/out.txt").ProcessNode(root); +#endif // loop LoopDesugarVisitor.New.ProcessNode(root); diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index dd8bcfb9a..215c7a2a7 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -7455,17 +7455,12 @@ end; function Pos(subs, s: string; from: integer): integer; begin - if (subs = nil) or (subs.Length = 0) then + if (subs = nil) or (subs.Length = 0) or (from > s.Length) then Result := 0 else Result := s.IndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; end; -function PosEx(subs, s: string; from: integer): integer; -begin - if (subs = nil) or (subs.Length = 0) then - Result := 0 - else Result := s.IndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; -end; +function PosEx(subs, s: string; from: integer) := Pos(subs,s,from); function LastPos(subs, s: string): integer; begin @@ -7476,20 +7471,19 @@ end; function LastPos(subs, s: string; from: integer): integer; begin - if (subs = nil) or (subs.Length = 0) then + if (subs = nil) or (subs.Length = 0) or (from > s.Length) then Result := 0 else Result := s.LastIndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; end; -function Pos(c: char; s: string; from: integer): integer; +{function Pos(c: char; s: string; from: integer): integer; begin + if from > s.Length then + Result := 0; Result := s.IndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; end; -function PosEx(c: char; s: string; from: integer): integer; -begin - Result := s.IndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; -end; +function PosEx(c: char; s: string; from: integer) := Pos(c,s,from); function LastPos(c: char; s: string): integer; begin @@ -7498,8 +7492,10 @@ end; function LastPos(c: char; s: string; from: integer): integer; begin + if from > s.Length then + Result := 0; Result := s.LastIndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; -end; +end;} function Length(s: string): integer; begin @@ -7530,7 +7526,7 @@ begin s := s.Substring(0, n) else if s.Length < n then if n <= sz then - s += new string(' ', n - s.Length ) + s += new string(' ', n - s.Length) else s += new String(' ', sz - s.Length) end; @@ -7543,12 +7539,6 @@ begin if index > s.Length + 1 then index := s.Length + 1; s := s.Insert(index - 1, source); - { try - s := s.Insert(index - 1, source); - except - on e: System.Exception do - s := s.Insert(s.Length, source); - end;} end; procedure InsertInShortString(source: string; var s: string; index, n: integer); @@ -7589,14 +7579,6 @@ begin if index + count - 1 > s.Length then count := s.Length - index + 1; Result := s.SubString(index - 1, count); - { try - if index - 1 >= s.Length then - Result := '' - else Result := s.SubString(index - 1, count); - except - on e: System.Exception do - Result := s.Substring(index - 1, s.Length - index + 1); - end;} end; function Concat(s1, s2: string): string; diff --git a/TestSuite/MinInt32Const.pas b/TestSuite/MinInt32Const.pas new file mode 100644 index 000000000..571be7829 --- /dev/null +++ b/TestSuite/MinInt32Const.pas @@ -0,0 +1,4 @@ +begin + var i: integer := -2147483648; + Assert(i.GetType = typeof(integer)); +end. \ No newline at end of file diff --git a/TestSuite/formatter_tests/input/PABCSystem.pas b/TestSuite/formatter_tests/input/PABCSystem.pas index 6206c1069..215c7a2a7 100644 --- a/TestSuite/formatter_tests/input/PABCSystem.pas +++ b/TestSuite/formatter_tests/input/PABCSystem.pas @@ -1220,6 +1220,8 @@ function Power(x: BigInteger; y: integer): BigInteger; /// Возвращает x, округленное до ближайшего целого. Если вещественное находится посередине между двумя целыми, ///то округление осуществляется к ближайшему четному (банковское округление): Round(2.5)=2, Round(3.5)=4 function Round(x: real): integer; +/// Возвращает x, округленное до ближайшего вещественного с digits знаками после десятичной точки +function Round(x: real; digits: integer): real; /// Возвращает x, округленное до ближайшего длинного целого function RoundBigInteger(x: real): BigInteger; /// Возвращает целую часть вещественного числа x @@ -2073,6 +2075,49 @@ type end; end; + +type + ///-- + __TypeclassRestrictedFunctionAttribute = class(Attribute) + public + constructor; + begin + end; + end; + + + ///-- + __TypeclassGenericParameterAttribute = class(Attribute) + public + constructor(instanceName: string); + begin + end; + end; + + ///-- + __TypeclassAttribute = class(Attribute) + public + constructor(typeclassName: string); + begin + end; + end; + + ///-- + __TypeclassMemberAttribute = class(Attribute) + public + constructor; + begin + end; + end; + + ///-- + __TypeclassInstanceAttribute = class(Attribute) + public + constructor(instanceName: string); + begin + end; + end; + // ----------------------------------------------------- // Internal procedures for PABCRTL.dll // ----------------------------------------------------- @@ -3494,7 +3539,7 @@ begin Result := Self; end; -function operator=(x,y: HashSet): boolean; extensionmethod; +function InternalEqual(x,y: HashSet): boolean; begin var xn := Object.ReferenceEquals(x,nil); var yn := Object.ReferenceEquals(y,nil); @@ -3505,7 +3550,9 @@ begin else Result := x.SetEquals(y); end; -function operator<>(x,y: HashSet); extensionmethod := not (x=y); +function operator=(x,y: HashSet): boolean; extensionmethod := InternalEqual(x,y); + +function operator<>(x,y: HashSet); extensionmethod := not InternalEqual(x,y); function operator-(x, y: HashSet): HashSet; extensionmethod; begin @@ -3579,7 +3626,7 @@ begin Result := Self; end; -function operator=(x,y: SortedSet): boolean; extensionmethod; +function InternalEqual(x,y: SortedSet): boolean; begin var xn := Object.ReferenceEquals(x,nil); var yn := Object.ReferenceEquals(y,nil); @@ -3590,7 +3637,9 @@ begin else Result := x.SetEquals(y); end; -function operator<>(x, y: SortedSet); extensionmethod := not x.SetEquals(y); +function operator=(x,y: SortedSet): boolean; extensionmethod := InternalEqual(x,y); + +function operator<>(x, y: SortedSet); extensionmethod := not InternalEqual(x,y); function operator-(x, y: SortedSet): SortedSet; extensionmethod; begin @@ -4238,6 +4287,7 @@ begin end; end; +///-- procedure Deconstruct(self: T; var res: T); extensionmethod; begin res := self; @@ -6594,14 +6644,14 @@ begin else if not cond then begin var err := 'Сбой подтверждения: ' + message + Environment.NewLine + 'Файл ' + sourceFile + ', строка ' + line.ToString(); - writeln(err); + Writeln(err); System.Threading.Thread.Sleep(500); raise new Exception(); end; end else //System.Diagnostics.Debug.Assert(cond, message); - System.Diagnostics.Contracts.Contract.Assert(cond,'Файл '+sourceFile+', строка '+line.ToString()) + System.Diagnostics.Contracts.Contract.Assert(cond,'Файл '+sourceFile+', строка '+line.ToString() + ': ' + message) end; function DiskFree(diskname: string): int64; @@ -6963,6 +7013,8 @@ function Power(x: BigInteger; y: integer) := BigInteger.Pow(x, y); function Round(x: real) := Convert.ToInt32(Math.Round(x)); +function Round(x: real; digits: integer) := Math.Round(x,digits); + function RoundBigInteger(x: real) := BigInteger.Create(Math.Round(x)); function Trunc(x: real) := Convert.ToInt32(Math.Truncate(x)); @@ -7403,17 +7455,12 @@ end; function Pos(subs, s: string; from: integer): integer; begin - if (subs = nil) or (subs.Length = 0) then + if (subs = nil) or (subs.Length = 0) or (from > s.Length) then Result := 0 else Result := s.IndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; end; -function PosEx(subs, s: string; from: integer): integer; -begin - if (subs = nil) or (subs.Length = 0) then - Result := 0 - else Result := s.IndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; -end; +function PosEx(subs, s: string; from: integer) := Pos(subs,s,from); function LastPos(subs, s: string): integer; begin @@ -7424,20 +7471,19 @@ end; function LastPos(subs, s: string; from: integer): integer; begin - if (subs = nil) or (subs.Length = 0) then + if (subs = nil) or (subs.Length = 0) or (from > s.Length) then Result := 0 else Result := s.LastIndexOf(subs, from - 1, System.StringComparison.Ordinal) + 1; end; -function Pos(c: char; s: string; from: integer): integer; +{function Pos(c: char; s: string; from: integer): integer; begin + if from > s.Length then + Result := 0; Result := s.IndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; end; -function PosEx(c: char; s: string; from: integer): integer; -begin - Result := s.IndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; -end; +function PosEx(c: char; s: string; from: integer) := Pos(c,s,from); function LastPos(c: char; s: string): integer; begin @@ -7446,8 +7492,10 @@ end; function LastPos(c: char; s: string; from: integer): integer; begin + if from > s.Length then + Result := 0; Result := s.LastIndexOf(c, from - 1, System.StringComparison.Ordinal) + 1; -end; +end;} function Length(s: string): integer; begin @@ -7478,7 +7526,7 @@ begin s := s.Substring(0, n) else if s.Length < n then if n <= sz then - s += new string(' ', n - s.Length ) + s += new string(' ', n - s.Length) else s += new String(' ', sz - s.Length) end; @@ -7491,12 +7539,6 @@ begin if index > s.Length + 1 then index := s.Length + 1; s := s.Insert(index - 1, source); - { try - s := s.Insert(index - 1, source); - except - on e: System.Exception do - s := s.Insert(s.Length, source); - end;} end; procedure InsertInShortString(source: string; var s: string; index, n: integer); @@ -7537,14 +7579,6 @@ begin if index + count - 1 > s.Length then count := s.Length - index + 1; Result := s.SubString(index - 1, count); - { try - if index - 1 >= s.Length then - Result := '' - else Result := s.SubString(index - 1, count); - except - on e: System.Exception do - Result := s.Substring(index - 1, s.Length - index + 1); - end;} end; function Concat(s1, s2: string): string; @@ -9952,6 +9986,12 @@ begin Result := Round(Self); end; +/// Возвращает x, округленное до ближайшего вещественного с digits знаками после десятичной точки +function Round(Self: real; digits: integer): real; extensionmethod; +begin + Result := Round(Self,digits); +end; + /// Возвращает число, округленное до ближайшего длинного целого function RoundBigInteger(Self: real): BigInteger; extensionmethod; begin @@ -10358,9 +10398,21 @@ begin end; ///-- -function operator= (Self: (T1,T2); v: (T1,T2)); extensionmethod := Object.ReferenceEquals(Self,nil) ? Object.ReferenceEquals(v,nil): Self.Equals(v); +function InternalEqual (x: (T1,T2); y: (T1,T2)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; + ///-- -function operator<> (Self: (T1,T2); v: (T1,T2)); extensionmethod := not (Self = v); +function operator= (x: (T1,T2); y: (T1,T2)): boolean; extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2); y: (T1,T2)): boolean; extensionmethod := not InternalEqual(x,y); ///-- function CompareToTup2(v1: (T1, T2); v2: (T1, T2)) := (v1 as System.IComparable).CompareTo(v2); ///-- @@ -10373,9 +10425,20 @@ function operator>(Self: (T1, T2); v: (T1, T2)); extensionmethod := Comp function operator>=(Self: (T1, T2); v: (T1, T2)); extensionmethod := CompareToTup2(Self, v) >= 0; ///-- -function operator= (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := Object.ReferenceEquals(Self,nil) ? Object.ReferenceEquals(v,nil): Self.Equals(v); +function InternalEqual (x: (T1,T2,T3); y: (T1,T2,T3)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; ///-- -function operator<> (Self: (T1,T2,T3); v: (T1,T2,T3)); extensionmethod := not (Self = v); +function operator= (x: (T1,T2,T3); y: (T1,T2,T3)); extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2,T3); y: (T1,T2,T3)); extensionmethod := not InternalEqual(x,y); ///-- function CompareToTup3(v1: (T1, T2, T3); v2: (T1, T2, T3)) := (v1 as System.IComparable).CompareTo(v2); ///-- @@ -10388,9 +10451,20 @@ function operator>(Self: (T1, T2, T3); v: (T1, T2, T3)); extensionmeth function operator>=(Self: (T1, T2, T3); v: (T1, T2, T3)); extensionmethod := CompareToTup3(Self, v) >= 0; ///-- -function operator= (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := Object.ReferenceEquals(Self,nil) ? Object.ReferenceEquals(v,nil): Self.Equals(v); +function InternalEqual (x: (T1,T2,T3,T4); y: (T1,T2,T3,T4)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; ///-- -function operator<> (Self: (T1,T2,T3,T4); v: (T1,T2,T3,T4)); extensionmethod := not (Self = v); +function operator= (x: (T1,T2,T3,T4); y: (T1,T2,T3,T4)); extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2,T3,T4); y: (T1,T2,T3,T4)); extensionmethod := not InternalEqual(x,y); ///-- function CompareToTup4(v1: (T1, T2, T3, T4); v2: (T1, T2, T3, T4)) := (v1 as System.IComparable).CompareTo(v2); ///-- @@ -10402,7 +10476,83 @@ function operator>(Self: (T1, T2, T3, T4); v: (T1, T2, T3, T4)); ex ///-- function operator>=(Self: (T1, T2, T3, T4); v: (T1, T2, T3, T4)); extensionmethod := CompareToTup4(Self, v) >= 0; +///-- +function InternalEqual (x: (T1,T2,T3,T4,T5); y: (T1,T2,T3,T4,T5)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; +///-- +function operator= (x: (T1,T2,T3,T4,T5); y: (T1,T2,T3,T4,T5)); extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2,T3,T4,T5); y: (T1,T2,T3,T4,T5)); extensionmethod := not InternalEqual(x,y); +///-- +function CompareToTup5(v1: (T1, T2, T3, T4,T5); v2: (T1, T2, T3, T4,T5)) := (v1 as System.IComparable).CompareTo(v2); +///-- +function operator<(Self: (T1, T2, T3, T4,T5); v: (T1, T2, T3, T4,T5)); extensionmethod := CompareToTup5(Self, v) < 0; +///-- +function operator<=(Self: (T1, T2, T3, T4,T5); v: (T1, T2, T3, T4,T5)); extensionmethod := CompareToTup5(Self, v) <= 0; +///-- +function operator>(Self: (T1, T2, T3, T4,T5); v: (T1, T2, T3, T4,T5)); extensionmethod := CompareToTup5(Self, v) > 0; +///-- +function operator>=(Self: (T1, T2, T3, T4,T5); v: (T1, T2, T3, T4,T5)); extensionmethod := CompareToTup5(Self, v) >= 0; +///-- +function InternalEqual (x: (T1,T2,T3,T4,T5,T6); y: (T1,T2,T3,T4,T5,T6)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; +///-- +function operator= (x: (T1,T2,T3,T4,T5,T6); y: (T1,T2,T3,T4,T5,T6)); extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2,T3,T4,T5,T6); y: (T1,T2,T3,T4,T5,T6)); extensionmethod := not InternalEqual(x,y); +///-- +function CompareToTup5(v1: (T1, T2, T3, T4,T5,T6); v2: (T1, T2, T3, T4,T5,T6)) := (v1 as System.IComparable).CompareTo(v2); +///-- +function operator<(Self: (T1, T2, T3, T4,T5,T6); v: (T1, T2, T3, T4,T5,T6)); extensionmethod := CompareToTup5(Self, v) < 0; +///-- +function operator<=(Self: (T1, T2, T3, T4,T5,T6); v: (T1, T2, T3, T4,T5,T6)); extensionmethod := CompareToTup5(Self, v) <= 0; +///-- +function operator>(Self: (T1, T2, T3, T4,T5,T6); v: (T1, T2, T3, T4,T5,T6)); extensionmethod := CompareToTup5(Self, v) > 0; +///-- +function operator>=(Self: (T1, T2, T3, T4,T5,T6); v: (T1, T2, T3, T4,T5,T6)); extensionmethod := CompareToTup5(Self, v) >= 0; + +///-- +function InternalEqual (x: (T1,T2,T3,T4,T5,T6,T7); y: (T1,T2,T3,T4,T5,T6,T7)): boolean; +begin + var xn := Object.ReferenceEquals(x,nil); + var yn := Object.ReferenceEquals(y,nil); + if xn then + Result := yn + else if yn then + Result := xn + else Result := x.Equals(y); +end; +///-- +function operator= (x: (T1,T2,T3,T4,T5,T6,T7); y: (T1,T2,T3,T4,T5,T6,T7)); extensionmethod := InternalEqual(x,y); +///-- +function operator<> (x: (T1,T2,T3,T4,T5,T6,T7); y: (T1,T2,T3,T4,T5,T6,T7)); extensionmethod := not InternalEqual(x,y); +///-- +function CompareToTup5(v1: (T1, T2, T3, T4,T5,T6,T7); v2: (T1, T2, T3, T4,T5,T6,T7)) := (v1 as System.IComparable).CompareTo(v2); +///-- +function operator<(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) < 0; +///-- +function operator<=(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) <= 0; +///-- +function operator>(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) > 0; +///-- +function operator>=(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) >= 0; // -------------------------------------------- // Методы расширения типа Tuple # Extension methods for Tuple // ------------------------------------------- diff --git a/bin/Lng/Eng/PascalABCParser.dat b/bin/Lng/Eng/PascalABCParser.dat index 35d442323..4055a1507 100644 --- a/bin/Lng/Eng/PascalABCParser.dat +++ b/bin/Lng/Eng/PascalABCParser.dat @@ -63,4 +63,5 @@ ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Tuple allows only base assignment := BAD_FORMAT_STRING=Interpolated string has invalid format TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Count of Tuple elements must be <=7 TWO_NILS_IN_QUESTION_EXPR=The conditional expression cannot contain nil constants on both branches -DOT_QUECTION_IN_SHORT_FUN=Expression with ?. cannot appear in a short function definition without a return value \ No newline at end of file +DOT_QUECTION_IN_SHORT_FUN=Expression with ?. cannot appear in a short function definition without a return value +BAD_INT2=Too small int64 \ No newline at end of file diff --git a/bin/Lng/Rus/PascalABCParser.dat b/bin/Lng/Rus/PascalABCParser.dat index 9268ef221..06e76f75e 100644 --- a/bin/Lng/Rus/PascalABCParser.dat +++ b/bin/Lng/Rus/PascalABCParser.dat @@ -62,4 +62,5 @@ ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Для кортежа допустимо толь BAD_FORMAT_STRING=Встречена неправильная форматная строка TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Количество элементов кортежа не должно быть больше 7 TWO_NILS_IN_QUESTION_EXPR=Условное выражение не может содержать константы nil по обеим веткам -DOT_QUECTION_IN_SHORT_FUN=Выражение с ?. не может фигурировать в коротком определении функции без возвращаемого значения \ No newline at end of file +DOT_QUECTION_IN_SHORT_FUN=Выражение с ?. не может фигурировать в коротком определении функции без возвращаемого значения +BAD_INT2=Слишком маленькое целое diff --git a/bin/TestRunner.exe b/bin/TestRunner.exe index 09afeb86ccc5924ee7768586ee9142301476beb6..75e161fd88c8e076909601fc2125379e25b4d939 100644 GIT binary patch literal 37888 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 literal 31744 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

SXZtg*;g)CHh9%jbW^-vP6f%Q- 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