Unverified Commit 2734f154 authored by Peter Klausler's avatar Peter Klausler
Browse files

[flang][openmp] Handle !$INCLUDE "foo" (bug #64128)

Detect and process INCLUDE lines that are guarded by OpenMP conditional
compilation markers (!$), when enabled.

Fixes https://github.com/llvm/llvm-project/issues/64128.

Differential Revision: https://reviews.llvm.org/D156759
parent 1e491c42
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ void Prescanner::Statement() {
  case LineClassification::Kind::PreprocessorDirective:
    preprocessor_.Directive(TokenizePreprocessorDirective(), *this);
    return;
  case LineClassification::Kind::CompilerDirective:
  case LineClassification::Kind::CompilerDirective: {
    directiveSentinel_ = line.sentinel;
    CHECK(InCompilerDirective());
    BeginStatementAndAdvance();
@@ -118,22 +118,22 @@ void Prescanner::Statement() {
      }
      CHECK(*at_ == '!');
    }
    std::optional<int> condOffset;
    if (directiveSentinel_[0] == '$' && directiveSentinel_[1] == '\0') {
      // OpenMP conditional compilation line.  Remove the sentinel and then
      // treat the line as if it were normal source.
      at_ += 2, column_ += 2;
      if (inFixedForm_) {
        LabelField(tokens);
      } else {
        SkipSpaces();
      }
      // OpenMP conditional compilation line.
      condOffset = 2;
    } else if (directiveSentinel_[0] == '@' && directiveSentinel_[1] == 'c' &&
        directiveSentinel_[2] == 'u' && directiveSentinel_[3] == 'f' &&
        directiveSentinel_[4] == '\0') {
      // CUDA conditional compilation line.  Remove the sentinel and then
      // treat the line as if it were normal source.
      at_ += 5, column_ += 5;
      if (inFixedForm_) {
      // CUDA conditional compilation line.
      condOffset = 5;
    }
    if (condOffset) {
      at_ += *condOffset, column_ += *condOffset;
      if (auto payload{IsIncludeLine(at_)}) {
        FortranInclude(at_ + *payload);
        return;
      } else if (inFixedForm_) {
        LabelField(tokens);
      } else {
        SkipSpaces();
@@ -153,6 +153,7 @@ void Prescanner::Statement() {
      tokens.CloseToken();
    }
    break;
  }
  case LineClassification::Kind::Source:
    BeginStatementAndAdvance();
    if (inFixedForm_) {
+4 −0
Original line number Diff line number Diff line
! RUN: %flang_fc1 -fdebug-unparse -fopenmp %s | FileCheck %s
!CHECK: STOP "pass"
!$ include "cond-include.inc"
end
+1 −0
Original line number Diff line number Diff line
STOP "pass"