This commit is contained in:
Mikhalkovich Stanislav 2020-06-19 13:04:44 +03:00
parent de14051dad
commit 97a6a3d047
11 changed files with 96 additions and 32 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
public const string Revision = "2512";
public const string Revision = "2513";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=3
%REVISION%=2512
%MINOR%=6
%REVISION%=2513
%COREVERSION%=3
%MAJOR%=3

Binary file not shown.

View file

@ -1 +1 @@
3.6.3.2512
3.6.3.2513

View file

@ -1 +1 @@
!define VERSION '3.6.3.2512'
!define VERSION '3.6.3.2513'

View file

@ -0,0 +1,14 @@
type
t1<T> = class
where T: record, constructor;
end;
t2<T> = class(t1<T>)
where T: record;
end;
begin
Assert(1=1)
end.

View file

@ -0,0 +1,14 @@
type
t1<T> = class
where T: object, constructor;
end;
t2<T> = class(t1<T>)
where T: record;
end;
begin
Assert(1=1)
end.

View file

@ -0,0 +1,14 @@
type
t1<T> = class
where T: DateTime, constructor;
end;
t2<T> = class(t1<T>)
where T: record;
end;
begin
Assert(1=1)
end.

View file

@ -0,0 +1,14 @@
type
t1<T> = class
where T: List<integer>;
end;
t2<T> = class(t1<T>)
where T: List<real>, constructor;
end;
begin
Assert(1=1)
end.

View file

@ -12381,9 +12381,17 @@ namespace PascalABCCompiler.TreeConverter
continue;
if (t.is_class || t.is_value_type || t.methods.Length > 0 || t.base_type != SystemLibrary.SystemLibrary.object_type)
{
if (thist.is_class != t.is_class || thist.is_value_type != t.is_value_type && !(t.is_value_type && thist.base_type.is_value_type)
|| thist.methods.Length != t.methods.Length ||
t.base_type != thist.base_type && !type_table.is_derived(t.base_type as type_node, thist.base_type as type_node))
//if (thist.is_class != t.is_class || thist.is_value_type != t.is_value_type /*&& !(t.is_value_type && thist.base_type.is_value_type)*/ // последнее непонятно
// || thist.methods.Length != t.methods.Length || // это наличие конструктора
// t.base_type != thist.base_type && !type_table.is_derived(t.base_type as type_node, thist.base_type as type_node))
if (t.is_class && !thist.is_class)
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
if (t.is_value_type && !thist.is_value_type)
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
if (t.methods.Length > thist.methods.Length)
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
if (t.base_type != SystemLibrary.SystemLibrary.object_type && t.base_type != thist.base_type)
AddError(ctn.loc, "WHERE_SPECIFIER_MISMATCH");
}
}

View file

@ -44,7 +44,7 @@ EXPECTED_TYPE_{0}=Ожидался тип {0}
CAN_NOT_WRITE_REFERENCE_DATA_TO_BINARY_FILE=Невозможно записать данные ссылочного типа в бинарный файл
CAN_NOT_READ_REFERENCE_DATA_FROM_BINARY_FILE=Невозможно считать данные ссылочного типа из бинарного файла
WHERE_SECTION_ALLOWED_ONLY_IN_GENERICS=Секция where допустима только в generic-типах и generic-подпрограммах
TEMPLATE_PARAMS_EXPECTED=В шаблонном типе необходим список шаблонных параметров
TEMPLATE_PARAMS_EXPECTED=В обобщённом типе необходим список обобщённых параметров
CAN_NOT_GENERATE_ACCESSOR_{0}=Невозможно сгенерировать аккессор, так как имя {0} уже занято
EXPECTED_DERIVED_CLASSES=Ожидался класс-потомок или класс-предок
SPECIFICATORS_FOR_{0}_ALREADY_EXIST=Спецификаторы для параметра {0} уже объявлены
@ -52,20 +52,20 @@ SPECIFICATOR_MUST_BE_TYPE_REFERENCE=Спецификатор должен быт
PARENT_SPECIFICATOR_MUST_BE_FIRST=Спецификатор предка должен быть первым в списке
CLASS_OR_RECORD_SPECIFICATOR_MUST_BE_FIRST=Спецификатор class/record должен быть первым в списке
CONSTRUCTOR_SPECIFICATOR_MUST_BE_LAST=Спецификатор constructor должен быть последним в списке
OBJECT_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Тип object не может быть использован для указания предка шаблонного параметра
RECORD_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Тип записи не может быть использован для указания предка шаблонного параметра
OBJECT_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Тип object не может быть использован для указания предка обобщённого параметра
RECORD_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Тип записи не может быть использован для указания предка обобщённого параметра
TYPE_{0}_DERIVED_FROM_ITSELF=Тип {0} наследуется циклически от самого себя
AMBIGUITY_BETWEEN_NAMES_{0}_AND_{1}=Двусмысленность между именами {0} и {1}
POINTERS_OF_GENERIC_PARAMETERS_NOT_ALLOWED=Указатели на параметр generic-типа недопустимы
OPERATOR_AS_CAN_NOT_BE_USED_WITH_GENERIC_PARAMETER_{0}_WITHOUT_CLASS_CONSTRAINT=Операция as не может быть применена к generic-параметру {0}, не имеющему спецификатора "class"
POINTERS_OF_GENERIC_PARAMETERS_NOT_ALLOWED=Указатели на параметр обобщённого типа недопустимы
OPERATOR_AS_CAN_NOT_BE_USED_WITH_GENERIC_PARAMETER_{0}_WITHOUT_CLASS_CONSTRAINT=Операция as не может быть применена к обобщённому параметру {0}, не имеющему спецификатора "class"
FORWARD_DECLARATION_{0}_AS_IMPLEMENTING_INTERFACE=Предописание {0} не может быть использовано как реализуемый интерфейс
FORWARD_TEMPLATE_{0}_DECLARATION_MISMATCH_DECLARATION=Предописание шаблонного типа {0} не соответствует его описанию
GENERIC_TYPE_NOT_ALLOWED_HERE=Описывать generic-тип можно только в секции описаний type
FORWARD_TEMPLATE_{0}_DECLARATION_MISMATCH_DECLARATION=Предописание обобщённого типа {0} не соответствует его описанию
GENERIC_TYPE_NOT_ALLOWED_HERE=Описывать обобщённый тип можно только в секции описаний type
STATIC_CONSTRUCTOR_MUST_BE_PARAMETERLESS=Статический конструктор должен быть без параметров
CONSTRUCTOR_CAN_NOT_BE_VIRTUAL=Конструктор не может быть виртуальным
CANNOT_USE_DIAPASON_AS_GENERIC_ARGUMENT=Диапазонный тип не может выступать в качестве параметра управляемого шаблона
CANNOT_USE_BOUNDED_ARRAY_AS_GENERIC_ARGUMENT=Тип статического массива не может выступать в качестве параметра управляемого шаблона
CANNOT_USE_TYPED_FILE_AS_GENERIC_ARGUMENT=Тип типизированного файла не может выступать в качестве параметра управляемого шаблона
CANNOT_USE_DIAPASON_AS_GENERIC_ARGUMENT=Диапазонный тип не может выступать в качестве параметра обобщения
CANNOT_USE_BOUNDED_ARRAY_AS_GENERIC_ARGUMENT=Тип статического массива не может выступать в качестве параметра обобщения
CANNOT_USE_TYPED_FILE_AS_GENERIC_ARGUMENT=Тип типизированного файла не может выступать в качестве параметра обобщения
INDEX_PROPERTY_ACCESSOR_CAN_NOT_BE_VARIABLE=Акцессор индексного свойства не может быть определен через поле
ACCESSOR_NAME_EXPECTED=Необходимо указать имя акцессора
PROPERTY_TYPE_MISMATCH_ACCESSOR_FIELD_TYPE=Тип свойства не совпадает с типом поля для акцессора
@ -86,14 +86,14 @@ NO_OVERLOAD_FUNCTION_{0}_USEFUL_FOR_ACCESSOR=Среди перегруженны
ACCESSOR_CAN_BE_FIELD_OR_METHOD_ONLY=В качестве акцессора можно указывать только метод или поле класса
CAN_NOT_DEFINE_METHOD_OF_COMPILED_TYPE=Недопустимы описания методов для типа из внешней сборки
NO_DEFAULT_PROPERTY_TO_FUNCTION_TYPE=Нет индексного свойства по умолчанию для функционального типа
TYPE_{0}_HAS_{1}_GENERIC_PARAMETERS=Количество шаблонных параметров типа {0} должно равняться {1}
TYPE_{0}_HAS_{1}_GENERIC_PARAMETERS=Количество обобщённых параметров типа {0} должно равняться {1}
TRIANGLE_BRACKETS_NOT_AWAITED=Угловые скобки не должны использоваться с данным выражением
TRIANGLE_BRACKETS_NOT_ALLOWED_WITH_COMMON_FUNCTIONS=Спецификация при помощи угловых скобок недопустима для обычных функций (допустима для generic-функций)
FUNCTION_{0}_DEPEND_FROM_{1}_TYPE_PARAMS=Число типов-параметров в спецификации generic-подпрограммы {0} должно быть равно {1}
TRIANGLE_BRACKETS_NOT_ALLOWED_WITH_COMMON_FUNCTIONS=Спецификация при помощи угловых скобок недопустима для обычных функций (допустима для обобщённых функций)
FUNCTION_{0}_DEPEND_FROM_{1}_TYPE_PARAMS=Число типов-параметров в спецификации обобщённой подпрограммы {0} должно быть равно {1}
WHERE_SECTION_MUST_BE_ONLY_IN_FIRST_DECLARATION=Секцию where следует указывать только в предописании (предописание найдено)
CAN_NOT_INHERIT_FROM_GENERIC_PARAMETER=Нельзя наследовать от generic-параметра
GENERIC_FUNCTION_{0}_CAN_NOT_BE_CALLED_WITH_THESE_PARAMETERS=Generic-функция {0} не может быть вызвана с данным набором фактических параметров
CAN_NOT_DEDUCE_TYPE_PARAMS_FROM_CALL_{0}=Невозможно вывести типы-параметры generic-подпрограммы {0} (укажите типы-параметры явно)
GENERIC_FUNCTION_{0}_CAN_NOT_BE_CALLED_WITH_THESE_PARAMETERS=Обобщённая функция {0} не может быть вызвана с данным набором фактических параметров
CAN_NOT_DEDUCE_TYPE_PARAMS_FROM_CALL_{0}=Невозможно вывести типы-параметры обобщённой подпрограммы {0} (укажите типы-параметры явно)
CAN_NOT_CALL_ANY_GENERIC_FUNCTION_{0}_WITH_THESE_PARAMETERS=С данным списком формальных параметров невозможно вызвать ни одну из перегруженных generic-подпрограмм {0}
OPERATOR_SIZEOF_CAN_NOT_BE_USED_WITH_GENERIC_TYPE=Операция sizeof не применима к generic-типам
CAN_NOT_INHERIT_FROM_VALUE_TYPE=Нельзя явно наследовать от System.ValueType (от него неявно наследуются все размерные типы)
@ -107,17 +107,17 @@ COULD_NOT_DEFINE_GENERIC_FUNCTION_OF_COMPILED_TYPE=Невозможно опре
PARAMETER_{0}_MUST_BE_NAMED_{1}=Шаблонный параметр номер {0} должен быть назван {1}
TEMPLATES_AND_GENERICS_ARE_INCOMPATIBLE=Недопустимо совмещение управляемых и неуправляемых шаблонов
TEMPLATE_CAN_BE_CLASS_ONLY=Только класс, запись или интерфейс может быть шаблонным типом
CANNOT_USE_SHORT_STRING_AS_GENERIC_ARGUMENT=Тип коротких строк не может выступать в качестве параметра управляемого шаблона
CANNOT_USE_SHORT_STRING_AS_GENERIC_ARGUMENT=Тип коротких строк не может выступать в качестве параметра обобщения
TYPE_REFERENCE_EXPECTED=Ожидалось имя типа
DELEGATE_CAN_NOT_USE_COMPREHENSIVE_GENERIC_PARAMETER=При описании делегата нельзя использовать тип-параметр объемлющего generic-шаблона
DELEGATE_CAN_NOT_USE_COMPREHENSIVE_GENERIC_PARAMETER=При описании делегата нельзя использовать тип-параметр объемлющего обобщения
CAN_NOT_DEFINE_METHOD_OF_TEMPLATE_TYPE_SYNONYM=Недопустимо описывать метод для синонима шаблонного типа
ENUM_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Специальный тип System.Enum не может быть использован для указания предка шаблонного параметра
CONSTRUCTOR_CAN_NOT_BE_GENERIC=Конструктор не может быть шаблонным
GENERIC_DELEGATE_INNER_FUNCTION=Недопустимо описывать тип шаблонного делегата внутри подпрограммы
GENERIC_NESTED_FUNCTIONS_NOT_ALLOWED=Вложенные generic-подпрограммы запрещены
NESTED_FUNCTIONS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED=Вложенные подпрограммы запрещены внутри generic-подпрограмм
NESTED_RECORDS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED=Определение типа записи в generic-подпрограмме запрещено
GENERIC_TYPE_{0}_NEEDS_{1}_GENERIC_PARAMETERS=Количество шаблонных параметров типа {0} должно быть равно {1}
ENUM_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Специальный тип System.Enum не может быть использован для указания предка обобщённого параметра
CONSTRUCTOR_CAN_NOT_BE_GENERIC=Конструктор не может быть обобщённоым
GENERIC_DELEGATE_INNER_FUNCTION=Недопустимо описывать тип обобщённого делегата внутри подпрограммы
GENERIC_NESTED_FUNCTIONS_NOT_ALLOWED=Вложенные обобщённые подпрограммы запрещены
NESTED_FUNCTIONS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED=Вложенные подпрограммы запрещены внутри обобщённых подпрограмм
NESTED_RECORDS_IN_GENERIC_FUNCTIONS_NOT_ALLOWED=Определение типа записи в обобщённой подпрограмме запрещено
GENERIC_TYPE_{0}_NEEDS_{1}_GENERIC_PARAMETERS=Количество обобщённых параметров типа {0} должно быть равно {1}
EXPRESSION_IS_NOT_ADDRESSED1=Это выражение не может стоять в левой части оператора присваивания или передаваться как var-параметр в подпрограмму
EXPRESSION_IS_NOT_ADDRESSED=Это выражение не может стоять в левой части оператора присваивания