forked from OSchip/llvm-project
[flang] Fix source line continuation in potential macro calls (bugzilla 46768)
The prescanner looks for implicit continuation lines when there are unclosed parentheses at the end of a line, so that source preprocessing macro references with arguments that span lines are recognized. The condition that determines this implicit continuation has been put into a predicate member function and corrected to apply only when the following line is source (not a preprocessing directive, comment, &c.). Fixes bugzilla #46768. Reviewed By: sscalpone Differential Revision: https://reviews.llvm.org/D84280
This commit is contained in:
parent
8f2c5c4314
commit
320389e849
|
@ -887,10 +887,8 @@ const char *Prescanner::FixedFormContinuationLine(bool mightNeedSpace) {
|
|||
return nextLine_ + 6;
|
||||
}
|
||||
}
|
||||
if (delimiterNesting_ > 0) {
|
||||
if (!IsFixedFormCommentChar(col1)) {
|
||||
return nextLine_;
|
||||
}
|
||||
if (IsImplicitContinuation()) {
|
||||
return nextLine_;
|
||||
}
|
||||
}
|
||||
return nullptr; // not a continuation line
|
||||
|
@ -927,7 +925,7 @@ const char *Prescanner::FreeFormContinuationLine(bool ampersand) {
|
|||
return p + 1;
|
||||
} else if (*p == '!' || *p == '\n' || *p == '#') {
|
||||
return nullptr;
|
||||
} else if (ampersand || delimiterNesting_ > 0) {
|
||||
} else if (ampersand || IsImplicitContinuation()) {
|
||||
if (p > nextLine_) {
|
||||
--p;
|
||||
} else {
|
||||
|
@ -981,6 +979,14 @@ bool Prescanner::FreeFormContinuation() {
|
|||
return false;
|
||||
}
|
||||
|
||||
// Implicit line continuation allows a preprocessor macro call with
|
||||
// arguments to span multiple lines.
|
||||
bool Prescanner::IsImplicitContinuation() const {
|
||||
return !inPreprocessorDirective_ && !inCharLiteral_ &&
|
||||
delimiterNesting_ > 0 && nextLine_ < limit_ &&
|
||||
ClassifyLine(nextLine_).kind == LineClassification::Kind::Source;
|
||||
}
|
||||
|
||||
bool Prescanner::Continuation(bool mightNeedFixedFormSpace) {
|
||||
if (*at_ == '\n' || *at_ == '&') {
|
||||
if (inFixedForm_) {
|
||||
|
|
|
@ -166,6 +166,7 @@ private:
|
|||
const char *IsPreprocessorDirectiveLine(const char *) const;
|
||||
const char *FixedFormContinuationLine(bool mightNeedSpace);
|
||||
const char *FreeFormContinuationLine(bool ampersand);
|
||||
bool IsImplicitContinuation() const;
|
||||
bool FixedFormContinuation(bool mightNeedSpace);
|
||||
bool FreeFormContinuation();
|
||||
bool Continuation(bool mightNeedFixedFormSpace);
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
! RUN: %f18 -funparse %s 2>&1 | FileCheck %s
|
||||
! CHECK: CALL foo("N","N")
|
||||
#ifdef transpose
|
||||
call foo('T',
|
||||
#else
|
||||
call foo('N',
|
||||
#endif
|
||||
$ 'N')
|
||||
end
|
Loading…
Reference in New Issue