[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:
peter klausler 2020-07-21 17:57:06 -07:00
parent 8f2c5c4314
commit 320389e849
3 changed files with 21 additions and 5 deletions

View File

@ -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_) {

View File

@ -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);

View File

@ -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