From 97a6a3d0476c5a7e26af6dfc3442ab1bcbc462a0 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Fri, 19 Jun 2020 13:04:44 +0300 Subject: [PATCH] fix #2255 --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- Localization/DefaultLang.resources | Bin 94145 -> 94137 bytes Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/errors/err0366_where.pas | 14 +++++ TestSuite/errors/err0367_where.pas | 14 +++++ TestSuite/errors/err0368_where.pas | 14 +++++ TestSuite/errors/err0369_where.pas | 14 +++++ .../TreeConversion/syntax_tree_visitor.cs | 14 +++-- bin/Lng/Rus/SemanticErrors_ssyy.dat | 48 +++++++++--------- 11 files changed, 96 insertions(+), 32 deletions(-) create mode 100644 TestSuite/errors/err0366_where.pas create mode 100644 TestSuite/errors/err0367_where.pas create mode 100644 TestSuite/errors/err0368_where.pas create mode 100644 TestSuite/errors/err0369_where.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index c5894a2e7..96d2b9919 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 = "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; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 2f1090bfd..412c11554 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=3 -%REVISION%=2512 %MINOR%=6 +%REVISION%=2513 +%COREVERSION%=3 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index b6391ce72952b37330a29abba66e43e675ae4292..b1bcdca8634bfe0d588b6caaac137dbb3fa43151 100644 GIT binary patch delta 383 zcmX?jpLOSb)(H<7uWo#3^^)z~!*>sV?wG9bN*c=C?C|O|6HHj(Z3T?k`}Q>tMDg3V z?;gKXnB4HL10nF{v%+M7_wQhenLmVa!xaC1sjxZmgAOAnSm5c~7yl#M@#!@ncp{C7aJRsI+;a-Rcx7UscW8hZ({;DuNoSiWoE&z1g^lj{nflw{mfxg+A4gglW{v`ka delta 338 zcmdmapY`B<)(H<7?{0i(^^*0+gNLu*O;&s*4Pk9|dUcu!Dk%K60?L~B_BBU(YF=tl zX0q<&j&~ghj?DXaP&EP{!r;Q23qR;EPM+{oZ1Read0<-cQx1sUJmb?(cBoC$e~B={ zbxhv&I}*;>EcM5Tk>4F^;g`>EUwwP=e{$kO;mL)6YY?h_{B>dj89LpSg>i`h%za=F zy?vlCdCpJi>Ab9r#~{{Czsbtz#SW2tJ6(s3(GDtJz{VI1H*@m(YogO1voXfPMW%bR YGlnC0YuOnCp&p+8OJTbT2jkRq01Qm5pa1{> diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 16796b107..a0d9a6e55 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.6.3.2512 +3.6.3.2513 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 9395bee7f..7debbbf17 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.6.3.2512' +!define VERSION '3.6.3.2513' diff --git a/TestSuite/errors/err0366_where.pas b/TestSuite/errors/err0366_where.pas new file mode 100644 index 000000000..17e2a89f9 --- /dev/null +++ b/TestSuite/errors/err0366_where.pas @@ -0,0 +1,14 @@ +type + t1 = class + where T: record, constructor; + + end; + + t2 = class(t1) + where T: record; + + end; + +begin + Assert(1=1) +end. \ No newline at end of file diff --git a/TestSuite/errors/err0367_where.pas b/TestSuite/errors/err0367_where.pas new file mode 100644 index 000000000..1169943d1 --- /dev/null +++ b/TestSuite/errors/err0367_where.pas @@ -0,0 +1,14 @@ +type + t1 = class + where T: object, constructor; + + end; + + t2 = class(t1) + where T: record; + + end; + +begin + Assert(1=1) +end. \ No newline at end of file diff --git a/TestSuite/errors/err0368_where.pas b/TestSuite/errors/err0368_where.pas new file mode 100644 index 000000000..dd5cd1a2e --- /dev/null +++ b/TestSuite/errors/err0368_where.pas @@ -0,0 +1,14 @@ +type + t1 = class + where T: DateTime, constructor; + + end; + + t2 = class(t1) + where T: record; + + end; + +begin + Assert(1=1) +end. \ No newline at end of file diff --git a/TestSuite/errors/err0369_where.pas b/TestSuite/errors/err0369_where.pas new file mode 100644 index 000000000..2813c6898 --- /dev/null +++ b/TestSuite/errors/err0369_where.pas @@ -0,0 +1,14 @@ +type + t1 = class + where T: List; + + end; + + t2 = class(t1) + where T: List, constructor; + + end; + +begin + Assert(1=1) +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index d51f1a080..26f091a57 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -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"); } } diff --git a/bin/Lng/Rus/SemanticErrors_ssyy.dat b/bin/Lng/Rus/SemanticErrors_ssyy.dat index 56ace9523..05e839774 100644 --- a/bin/Lng/Rus/SemanticErrors_ssyy.dat +++ b/bin/Lng/Rus/SemanticErrors_ssyy.dat @@ -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=Это выражение не может стоять в левой части оператора присваивания