diff options
Diffstat (limited to 'flang/lib/Parser/prescan.cpp')
| -rw-r--r-- | flang/lib/Parser/prescan.cpp | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp index fd69404..efce8fc 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;  | 
