Skip to content

Commit

Permalink
[flang][OpenMP] Skip invalid conditional compilation sentinels (#126282)
Browse files Browse the repository at this point in the history
In fixed form, an initial line can have an OpenMP conditional
compilation sentinel only if columns 3 through 5 have only
white space or numbers.

Fixes llvm/llvm-project#89560
  • Loading branch information
luporl authored Feb 13, 2025
1 parent e657b96 commit 46ffacc
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
15 changes: 15 additions & 0 deletions flang/lib/Parser/prescan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1432,6 +1432,21 @@ Prescanner::IsFixedFormCompilerDirectiveLine(const char *start) const {
}
*sp++ = ToLowerCaseLetter(*p);
}
// A fixed form OpenMP conditional compilation sentinel must satisfy the
// following criteria, for initial lines:
// - Columns 3 through 5 must have only white space or numbers.
// - Column 6 must be space or zero.
if (column == 3 && sentinel[0] == '$') {
const char *q{p};
for (int col{3}; col < 6; ++col, ++q) {
if (!IsSpaceOrTab(q) && !IsDecimalDigit(*q)) {
return std::nullopt;
}
}
if (*q != ' ' && *q != '0') {
return std::nullopt;
}
}
if (column == 6) {
if (*p == '0') {
++p;
Expand Down
30 changes: 30 additions & 0 deletions flang/test/Parser/OpenMP/sentinels.f
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,34 @@ subroutine sub(a, b)
C $ This is a comment line
c $ his is a comment line
* $ This is a comment line

! Test non-space/non-number char in columns 3-5, for initial lines.
! CHECK-NOT: "comment"
c$x PRINT *, "comment"
c$ + PRINT *, "comment"
c$ * PRINT *, "comment"

! Test non-space/non-number char in columns 3-5, for continuation lines.
! CHECK: "msg1"
! CHECK-NOT: "comment"
c$ x PRINT *, "comment"
c$1 & , "comment"
c$ x & , "comment"
c$ +& , "comment"

c$ PRINT *, "msg1"
c$1 & , "comment"
c$ x & , "comment"
c$ +& , "comment"

! Test valid chars in initial and continuation lines.
! CHECK: "msg2"
! CHECK-SAME: "msg3"
c$ 20 PRINT *, "msg2"
c$ & , "msg3"

! CHECK: "msg4"
! CHECK-SAME: "msg5"
c$ 0PRINT *, "msg4",
c$ + "msg5"
end

0 comments on commit 46ffacc

Please sign in to comment.