[flang-commits] [flang] [flang] Handle more use cases reported for issues/79590 (PR #79628)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Jan 26 10:29:33 PST 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/79628
I implemented legacy "token pasting" via line continuation for
call prefix&
&MACRO&
&suffix(1)
in a recent patch; this patch addresses the related cases
call prefix&
&MACRO&
&(1)
and
call &
&MACRO&
&suffix(1)
Fixes the latest https://github.com/llvm/llvm-project/issues/79590.
>From af5397017b9d549324b62b367fd72c7747fb2d31 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 26 Jan 2024 10:21:23 -0800
Subject: [PATCH] [flang] Handle more use cases reported for issues/79590
I implemented legacy "token pasting" via line continuation for
call prefix&
&MACRO&
&suffix(1)
in a recent patch; this patch addresses the related cases
call prefix&
&MACRO&
&(1)
and
call &
&MACRO&
&suffix(1)
Fixes the latest https://github.com/llvm/llvm-project/issues/79590.
---
flang/lib/Parser/prescan.cpp | 20 +++++++++++++++-----
flang/test/Preprocessing/pp134.F90 | 15 +++++++++++++--
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp
index f7f22177a7d0bfa..26c6dd5a7ffe9c7 100644
--- a/flang/lib/Parser/prescan.cpp
+++ b/flang/lib/Parser/prescan.cpp
@@ -630,9 +630,11 @@ bool Prescanner::NextToken(TokenSequence &tokens) {
preventHollerith_ = false;
} else if (IsLegalInIdentifier(*at_)) {
int parts{1};
+ const char *afterLast{nullptr};
do {
EmitChar(tokens, *at_);
++at_, ++column_;
+ afterLast = at_;
if (SkipToNextSignificantCharacter() && IsLegalIdentifierStart(*at_)) {
tokens.CloseToken();
++parts;
@@ -640,12 +642,20 @@ bool Prescanner::NextToken(TokenSequence &tokens) {
} while (IsLegalInIdentifier(*at_));
if (parts >= 3) {
// Subtlety: When an identifier is split across three or more continuation
- // lines, its parts are kept as distinct pp-tokens so that macro
- // operates on them independently. This trick accommodates the historic
- // practice of using line continuation for token pasting after
- // replacement.
+ // lines (or two continuation lines, immediately preceded or followed
+ // by '&' free form continuation line markers, its parts are kept as
+ // distinct pp-tokens so that macro operates on them independently.
+ // This trick accommodates the historic practice of using line
+ // continuation for token pasting after replacement.
} else if (parts == 2) {
- tokens.ReopenLastToken();
+ if ((start > start_ && start[-1] == '&') ||
+ (afterLast < limit_ && *afterLast == '&')) {
+ // call & call foo&
+ // &MACRO& OR &MACRO&
+ // &foo(...) &(...)
+ } else {
+ tokens.ReopenLastToken();
+ }
}
if (InFixedFormSource()) {
SkipSpaces();
diff --git a/flang/test/Preprocessing/pp134.F90 b/flang/test/Preprocessing/pp134.F90
index 01e7b010d426ece..1b13e6cb91d7550 100644
--- a/flang/test/Preprocessing/pp134.F90
+++ b/flang/test/Preprocessing/pp134.F90
@@ -1,9 +1,20 @@
! RUN: %flang -E %s 2>&1 | FileCheck %s
-! CHECK: print *, ADC
+! CHECK: print *, ADC, 1
+! CHECK: print *, AD, 1
+! CHECK: print *, DC, 1
+! CHECK: print *, AB
#define B D
implicit none
real ADC
print *, A&
&B&
- &C
+ &C, 1
+print *, A&
+ &B&
+ &, 1
+print *, &
+ &B&
+ &C, 1
+print *, A&
+ &B
end
More information about the flang-commits
mailing list