[flang-commits] [flang] 77cd34e - [flang] Treat conditional comments as comments (#165881)
via flang-commits
flang-commits at lists.llvm.org
Fri Oct 31 10:28:09 PDT 2025
Author: Peter Klausler
Date: 2025-10-31T10:28:04-07:00
New Revision: 77cd34eedff3f79974cc98501af48f10bb423cc7
URL: https://github.com/llvm/llvm-project/commit/77cd34eedff3f79974cc98501af48f10bb423cc7
DIFF: https://github.com/llvm/llvm-project/commit/77cd34eedff3f79974cc98501af48f10bb423cc7.diff
LOG: [flang] Treat conditional comments as comments (#165881)
An OpenMP, OpenACC, or CUDA conditional line should be treated as a
comment when that's what its payload contains, not as a conditional
source line that will confuse the parser when it is indeed just a
comment.
Added:
flang/test/Preprocessing/cond-comment.f
flang/test/Preprocessing/cond-comment.f90
Modified:
flang/lib/Parser/prescan.cpp
flang/test/Preprocessing/bug136845.F
Removed:
################################################################################
diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp
index fd69404f313d3..efce8fc3d2e35 100644
--- a/flang/lib/Parser/prescan.cpp
+++ b/flang/lib/Parser/prescan.cpp
@@ -1642,6 +1642,17 @@ Prescanner::IsFixedFormCompilerDirectiveLine(const char *start) const {
// This is a Continuation line, not an initial directive line.
return std::nullopt;
}
+ ++column, ++p;
+ }
+ if (isOpenMPConditional) {
+ for (; column <= fixedFormColumnLimit_; ++column, ++p) {
+ if (IsSpaceOrTab(p)) {
+ } else if (*p == '!') {
+ return std::nullopt; // !$ ! is a comment, not a directive
+ } else {
+ break;
+ }
+ }
}
if (const char *ss{IsCompilerDirectiveSentinel(
sentinel, static_cast<std::size_t>(sp - sentinel))}) {
@@ -1657,8 +1668,17 @@ Prescanner::IsFreeFormCompilerDirectiveLine(const char *start) const {
p && *p++ == '!') {
if (auto maybePair{IsCompilerDirectiveSentinel(p)}) {
auto offset{static_cast<std::size_t>(p - start - 1)};
- return {LineClassification{LineClassification::Kind::CompilerDirective,
- offset, maybePair->first}};
+ const char *sentinel{maybePair->first};
+ if ((sentinel[0] == '$' && sentinel[1] == '\0') || sentinel[1] == '@') {
+ if (const char *comment{IsFreeFormComment(maybePair->second)}) {
+ if (*comment == '!') {
+ // Conditional line comment - treat as comment
+ return std::nullopt;
+ }
+ }
+ }
+ return {LineClassification{
+ LineClassification::Kind::CompilerDirective, offset, sentinel}};
}
}
return std::nullopt;
diff --git a/flang/test/Preprocessing/bug136845.F b/flang/test/Preprocessing/bug136845.F
index ce52c2953bb57..311ee0a2d874c 100644
--- a/flang/test/Preprocessing/bug136845.F
+++ b/flang/test/Preprocessing/bug136845.F
@@ -18,7 +18,6 @@
*$1 continue
end
-!PREPRO:!$ &
!PREPRO: continue
!PREPRO: k=0
!PREPRO: k=0
diff --git a/flang/test/Preprocessing/cond-comment.f b/flang/test/Preprocessing/cond-comment.f
new file mode 100644
index 0000000000000..a484fcbfa8fa7
--- /dev/null
+++ b/flang/test/Preprocessing/cond-comment.f
@@ -0,0 +1,5 @@
+!RUN: %flang_fc1 -fopenmp -fdebug-unparse %s 2>&1 | FileCheck %s
+!CHECK: END
+!CHECK-NOT: error:
+ end
+c$ !
diff --git a/flang/test/Preprocessing/cond-comment.f90 b/flang/test/Preprocessing/cond-comment.f90
new file mode 100644
index 0000000000000..457614ae9372e
--- /dev/null
+++ b/flang/test/Preprocessing/cond-comment.f90
@@ -0,0 +1,5 @@
+!RUN: %flang_fc1 -fopenmp -fdebug-unparse %s 2>&1 | FileCheck %s
+!CHECK: END
+!CHECK-NOT: error:
+end
+!$ !
More information about the flang-commits
mailing list