Index: flang/lib/Parser/prescan.cpp =================================================================== --- flang/lib/Parser/prescan.cpp +++ flang/lib/Parser/prescan.cpp @@ -106,7 +106,7 @@ 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 @@ } CHECK(*at_ == '!'); } + std::optional 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 @@ tokens.CloseToken(); } break; + } case LineClassification::Kind::Source: BeginStatementAndAdvance(); if (inFixedForm_) { Index: flang/test/Parser/OpenMP/cond-include.f90 =================================================================== --- /dev/null +++ flang/test/Parser/OpenMP/cond-include.f90 @@ -0,0 +1,4 @@ +! RUN: %flang_fc1 -fdebug-unparse -fopenmp %s | FileCheck %s +!CHECK: STOP "pass" +!$ include "cond-include.inc" +end Index: flang/test/Parser/OpenMP/cond-include.inc =================================================================== --- /dev/null +++ flang/test/Parser/OpenMP/cond-include.inc @@ -0,0 +1 @@ +STOP "pass"