fix #1707
This commit is contained in:
parent
bea912377e
commit
1968242990
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "4";
|
||||
public const string Build = "2";
|
||||
public const string Revision = "1972";
|
||||
public const string Revision = "1974";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=4
|
||||
%REVISION%=1972
|
||||
%REVISION%=1974
|
||||
%COREVERSION%=2
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.4.2.1972'
|
||||
!define VERSION '3.4.2.1974'
|
||||
|
|
|
|||
13
TestSuite/InterfNoCycle.pas
Normal file
13
TestSuite/InterfNoCycle.pas
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
type
|
||||
I6<T> = interface end;
|
||||
I0 = interface end;
|
||||
|
||||
I1 = interface(I0) end;
|
||||
I2 = interface(I1,I6<I2>,I6<object>) end;
|
||||
|
||||
t1 = class(I0, I2) end;
|
||||
t2 = class(I1, I2) end;
|
||||
t3 = class(I0, I1) end;
|
||||
begin
|
||||
Assert(1=1)
|
||||
end.
|
||||
|
|
@ -12095,6 +12095,10 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
private void check_cycle_interface_inheritance(common_type_node cnode, type_node base_of_cnode, List<common_type_node> interfaces)
|
||||
{
|
||||
// Для интерфейсов всё это излишне. Поскольку нельзя использовать предописанные интерфейсы в списке наследования, то
|
||||
// циклически интерфейс может наследовать только от себя. Поэтому достаточно проверять нерекурсивно свой список ImplementingInterfaces и если там есть этот интерфейс, то ошибка
|
||||
if (!cnode.IsInterface)
|
||||
return;
|
||||
interfaces.Add(cnode);
|
||||
common_type_node bt = base_of_cnode as common_type_node;
|
||||
if (bt != null && bt.original_generic != null)
|
||||
|
|
|
|||
|
|
@ -9201,7 +9201,7 @@ begin
|
|||
end;
|
||||
|
||||
/// Возвращает индекс первого минимального элемента начиная с позиции index
|
||||
function IndexMin<T>(Self: IList<T>; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
|
||||
function IndexMin<T>(Self: List<T>; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
|
||||
begin
|
||||
var min := Self[index];
|
||||
Result := index;
|
||||
|
|
@ -9214,7 +9214,7 @@ begin
|
|||
end;
|
||||
|
||||
/// Возвращает индекс первого максимального элемента начиная с позиции index
|
||||
function IndexMax<T>(self: IList<T>; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
function IndexMax<T>(Self: List<T>; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var max := Self[index];
|
||||
Result := index;
|
||||
|
|
@ -9226,12 +9226,12 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента
|
||||
function LastIndexMin<T>(Self: IList<T>): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
/// Возвращает индекс первого минимального элемента начиная с позиции index
|
||||
function IndexMin<T>(Self: array of T; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
|
||||
begin
|
||||
var min := Self[Self.Count - 1];
|
||||
Result := Self.Count - 1;
|
||||
for var i := Self.Count - 2 downto 0 do
|
||||
var min := Self[index];
|
||||
Result := index;
|
||||
for var i := index + 1 to Self.Count - 1 do
|
||||
if Self[i].CompareTo(min) < 0 then
|
||||
begin
|
||||
Result := i;
|
||||
|
|
@ -9239,8 +9239,21 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс первого максимального элемента начиная с позиции index
|
||||
function IndexMax<T>(Self: array of T; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var max := Self[index];
|
||||
Result := index;
|
||||
for var i := index + 1 to Self.Count - 1 do
|
||||
if Self[i].CompareTo(max) > 0 then
|
||||
begin
|
||||
Result := i;
|
||||
max := Self[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
|
||||
function LastIndexMin<T>(Self: IList<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
function LastIndexMin<T>(Self: List<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var min := Self[index];
|
||||
Result := index;
|
||||
|
|
@ -9252,21 +9265,33 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего максимального элемента
|
||||
function LastIndexMax<T>(Self: IList<T>): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
|
||||
function LastIndexMin<T>(Self: array of T; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var max := Self[Self.Count - 1];
|
||||
Result := Self.Count - 1;
|
||||
for var i := Self.Count - 2 downto 0 do
|
||||
if Self[i].CompareTo(max) > 0 then
|
||||
var min := Self[index];
|
||||
Result := index;
|
||||
for var i := index - 1 downto 0 do
|
||||
if Self[i].CompareTo(min) < 0 then
|
||||
begin
|
||||
Result := i;
|
||||
max := Self[i];
|
||||
min := Self[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента
|
||||
function LastIndexMin<T>(Self: List<T>): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
Result := Self.LastIndexMin(Self.Count - 1);
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента
|
||||
function LastIndexMin<T>(Self: array of T): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
Result := Self.LastIndexMin(Self.Count - 1);
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
|
||||
function LastIndexMax<T>(Self: IList<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
function LastIndexMax<T>(Self: List<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var max := Self[index];
|
||||
Result := index;
|
||||
|
|
@ -9278,6 +9303,31 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
|
||||
function LastIndexMax<T>(Self: array of T; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
var max := Self[index];
|
||||
Result := index;
|
||||
for var i := index - 1 downto 0 do
|
||||
if Self[i].CompareTo(max) > 0 then
|
||||
begin
|
||||
Result := i;
|
||||
max := Self[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего максимального элемента
|
||||
function LastIndexMax<T>(Self: List<T>): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
Result := Self.LastIndexMax(Self.Count - 1);
|
||||
end;
|
||||
|
||||
/// Возвращает индекс последнего максимального элемента
|
||||
function LastIndexMax<T>(Self: array of T): integer; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
Result := Self.LastIndexMax(Self.Count - 1);
|
||||
end;
|
||||
|
||||
/// Заменяет в массиве или списке все вхождения одного значения на другое
|
||||
procedure Replace<T>(Self: IList<T>; oldValue, newValue: T); extensionmethod;
|
||||
begin
|
||||
|
|
|
|||
Loading…
Reference in a new issue