mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 10:58:11 +08:00
[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
This commit is contained in:
@@ -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
flang/test/Parser/OpenMP/cond-include.f90
Normal file
4
flang/test/Parser/OpenMP/cond-include.f90
Normal file
@@ -0,0 +1,4 @@
|
||||
! RUN: %flang_fc1 -fdebug-unparse -fopenmp %s | FileCheck %s
|
||||
!CHECK: STOP "pass"
|
||||
!$ include "cond-include.inc"
|
||||
end
|
||||
1
flang/test/Parser/OpenMP/cond-include.inc
Normal file
1
flang/test/Parser/OpenMP/cond-include.inc
Normal file
@@ -0,0 +1 @@
|
||||
STOP "pass"
|
||||
Reference in New Issue
Block a user