[flang][runtime] Enforce restrictions on unlimited format repetition

A repeated format item group with an unlimited ('*') repetition count
can appear only as the last item at the top level of a format; it can't
be nested in more parentheses and it can't be followed by anything
else.

Differential Revision: https://reviews.llvm.org/D125054
This commit is contained in:
Peter Klausler 2022-04-28 14:23:31 -07:00
parent cea8b8a72d
commit fb9ec95cf0
2 changed files with 17 additions and 3 deletions

View File

@ -207,6 +207,13 @@ int FormatControl<CONTEXT>::CueUpNextDataEdit(Context &context, bool stop) {
maybeReversionPoint);
return 0;
}
if (height_ != 1) {
ReportBadFormat(context,
"Invalid FORMAT: '*' must be nested in exactly one set of "
"parentheses",
maybeReversionPoint);
return 0;
}
}
ch = Capitalize(ch);
if (ch == '(') {
@ -251,12 +258,20 @@ int FormatControl<CONTEXT>::CueUpNextDataEdit(Context &context, bool stop) {
++restart;
}
if (stack_[height_ - 1].remaining == Iteration::unlimited) {
offset_ = restart;
if (height_ > 1 && GetNextChar(context) != ')') {
ReportBadFormat(context,
"Unlimited repetition in FORMAT may not be followed by more "
"items",
restart);
return 0;
}
if (offset_ == unlimitedLoopCheck) {
ReportBadFormat(context,
"Unlimited repetition in FORMAT lacks data edit descriptors",
restart);
return 0;
}
offset_ = restart;
} else if (stack_[height_ - 1].remaining-- > 0) {
offset_ = restart;
} else {

View File

@ -107,8 +107,7 @@ TEST(FormatTests, FormatStringTraversal) {
ResultsTy{"'PI='", "F9.7", "'PI='", "F9.7", "'done'"}, 1},
{2, "(3('PI=',F9.7,:),'tooFar')",
ResultsTy{"'PI='", "F9.7", "'PI='", "F9.7"}, 1},
{2, "(*('PI=',F9.7,:),'tooFar')",
ResultsTy{"'PI='", "F9.7", "'PI='", "F9.7"}, 1},
{2, "(*('PI=',F9.7,:))", ResultsTy{"'PI='", "F9.7", "'PI='", "F9.7"}, 1},
{1, "(3F9.7)", ResultsTy{"2*F9.7"}, 2},
};