diff --git a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For4.pas b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For4.pas index d10ab5ca5..56a72f0b6 100644 --- a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For4.pas +++ b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For4.pas @@ -1,9 +1,8 @@ -// ÷икл for. —умма всех двузначных чисел -var s: integer; +// Цикл for. Сумма всех двузначных чисел begin - s := 0; + var s := 0; for var i:=10 to 99 do - s := s + i; // можно s += i - writeln('—умма всех двузначных чисел = ',s); + s += i; + Println('Сумма всех двузначных чисел =',s); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For5.pas b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For5.pas index 5b1a9a4cd..13de718d3 100644 --- a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For5.pas +++ b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For5.pas @@ -1,13 +1,13 @@ -// ÷икл for. a в степени n -var - a: real; - n: integer; +// Цикл for. Вычисление a в степени n begin - write('¬ведите a,n: '); - readln(a,n); - var p: real := 1; + var a := ReadlnReal('Введите a:'); + var n := ReadlnInteger('Введите n:'); + + var p := 1.0; for var i:=1 to n do - p := p * a; // можно p *= a - writelnFormat('{0} в степени {1} = {2}',a,n,p); + p *= a; + Println($'{a} в степени {n} = {p}'); + + Println($'Стандартная операция {a} ** {n} = {a ** n}'); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For6.pas b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For6.pas index d4073450f..32904674f 100644 --- a/InstallerSamples/!Tutorial/06_ForWhileRepeat/For6.pas +++ b/InstallerSamples/!Tutorial/06_ForWhileRepeat/For6.pas @@ -1,4 +1,4 @@ -// Öèêë for. Òàáëèöà ôóíêöèè +// Цикл for. Таблица функции var a: real := 0; b: real := 4; @@ -9,7 +9,7 @@ begin var x := a; for var i:=0 to n do begin - writelnFormat('{0:f2} {1:f4}',x,sqrt(x)); + WritelnFormat('{0:f2} {1:f4}',x,sqrt(x)); x += h; end; end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/06_ForWhileRepeat/while3.pas b/InstallerSamples/!Tutorial/06_ForWhileRepeat/while3.pas index 35345d005..684065291 100644 --- a/InstallerSamples/!Tutorial/06_ForWhileRepeat/while3.pas +++ b/InstallerSamples/!Tutorial/06_ForWhileRepeat/while3.pas @@ -1,18 +1,18 @@ -// ÷икл while. —умма цифр положительного числа -var m: integer; +// Цикл while. Сумма цифр положительного числа begin - writeln('¬ведите положительное число: '); - read(m); - write('÷ифры числа в обратном пор¤дке: '); + var m := ReadlnInteger('Введите положительное число: '); + + Print('Цифры числа в обратном порядке:'); var s := 0; while m>0 do begin var digit := m mod 10; - write(digit,' '); + Print(digit); s += digit; m := m div 10; end; - writeln; - writeln('—умма цифр = ',s); + + Println; + Println('Сумма цифр =',s); end. \ No newline at end of file diff --git a/TestSuite/errors/err0295.pas b/TestSuite/errors/err0295.pas new file mode 100644 index 000000000..07b648025 --- /dev/null +++ b/TestSuite/errors/err0295.pas @@ -0,0 +1,5 @@ +type + Enum = (X, Y); + +begin +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index cc850531f..5a91702d9 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -11248,6 +11248,35 @@ namespace PascalABCCompiler.TreeConverter //Проверяем параметры шаблона на совпадение друг с другом check_param_redeclared(ttn.template_args.idents); context.AddTemplate(ttn.name, tc, t_loc); + + // SSM 23.10.18. Bug fix #1395. Пытаемся проверить, что это - enum. Повторяем с изменениями код в enum_type_node + if (_type_declaration.type_def is enum_type_definition etd) + { + // значит это возможно enum + //var etd = + foreach (SyntaxTree.enumerator en in etd.enumerators.enumerators) + { + if (!((en.name is named_type_reference) && (en.name as named_type_reference).names.Count() == 1)) + { + // Это tupletype + return; + } + // Все - идентификаторы. Проверяем дальше + SyntaxTree.ident id = (en.name as named_type_reference).FirstIdent; + + // Если равен какому-то имени в параметрах обобщения, то это тип - пропускаем. Ищем не тип или неизвестное имя + if (ttn.template_args.idents.Select(ide => ide.name.ToLower()).Any(s => s.Equals(id.name.ToLower()))) + continue; + var si = context.CurrentScope.Find(id.name); + if ((si == null) || !(si.FirstOrDefault().sym_info is type_node)) + { + // Это точно enum. Выдавать ошибку - enumы не могут быть обобщёнными + AddError(get_location(ttn), "ENUMS_CANNOT_BE_GENERIC"); + } + } + } + // Это не enum. Значит, просто выйти. Так было в коде до SSM 23.10.18 + return; //is_template_synonym = true; diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat index 4f4bec1a2..051e7cd06 100644 --- a/bin/Lng/Eng/SemanticErrors_ms.dat +++ b/bin/Lng/Eng/SemanticErrors_ms.dat @@ -13,4 +13,5 @@ MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Missed semantic check for sugared nod OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Left operand of ?. operation must have reference type NAME_IN_PROPERTY_READ_SECTION_MUST_BE_FIELD_OR_METHOD_NAME=Name in property read section must be field name or method name of this class NAME_IN_PROPERTY_WRITE_SECTION_MUST_BE_FIELD_OR_METHOD_NAME=Name in property write section must be field name or method name of this class -STATIC_PROPERTY_MUST_HAVE_STATIC_ACCESSOR=Static property accessor must be static \ No newline at end of file +STATIC_PROPERTY_MUST_HAVE_STATIC_ACCESSOR=Static property accessor must be static +ENUMS_CANNOT_BE_GENERIC=Enumerator type cannot be generic \ No newline at end of file diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat index 4955272a0..909ace5c0 100644 --- a/bin/Lng/Rus/SemanticErrors_ms.dat +++ b/bin/Lng/Rus/SemanticErrors_ms.dat @@ -14,4 +14,5 @@ OPERATOR_DQ_MUST_BE_USED_WITH_A_REFERENCE_TYPE_VALUETYPE=Левый операн AUTOCLASS_MUST_NOT_CONTAIN_ENUM_TYPE_DEFINITION_IN_FIELD_TYPE=Автокласс не может содержать поля безымянного перечислимого типа NAME_IN_PROPERTY_READ_SECTION_MUST_BE_FIELD_OR_METHOD_NAME=Имя в секции read свойства должно быть именем поля или функции-метода этого класса NAME_IN_PROPERTY_WRITE_SECTION_MUST_BE_FIELD_OR_METHOD_NAME=Имя в секции write свойства должно быть именем поля или процедуры-метода этого класса -STATIC_PROPERTY_MUST_HAVE_STATIC_ACCESSOR=Акцессор статического свойства должен быть статическим \ No newline at end of file +STATIC_PROPERTY_MUST_HAVE_STATIC_ACCESSOR=Акцессор статического свойства должен быть статическим +ENUMS_CANNOT_BE_GENERIC=Перечислимый тип не может быть обобщенным \ No newline at end of file