fix #2255
This commit is contained in:
parent
de14051dad
commit
97a6a3d047
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=3
|
||||
%REVISION%=2512
|
||||
%MINOR%=6
|
||||
%REVISION%=2513
|
||||
%COREVERSION%=3
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1 +1 @@
|
|||
3.6.3.2512
|
||||
3.6.3.2513
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.6.3.2512'
|
||||
!define VERSION '3.6.3.2513'
|
||||
|
|
|
|||
14
TestSuite/errors/err0366_where.pas
Normal file
14
TestSuite/errors/err0366_where.pas
Normal 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.
|
||||
14
TestSuite/errors/err0367_where.pas
Normal file
14
TestSuite/errors/err0367_where.pas
Normal 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.
|
||||
14
TestSuite/errors/err0368_where.pas
Normal file
14
TestSuite/errors/err0368_where.pas
Normal 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.
|
||||
14
TestSuite/errors/err0369_where.pas
Normal file
14
TestSuite/errors/err0369_where.pas
Normal 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.
|
||||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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=Это выражение не может стоять в левой части оператора присваивания
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue