[flang] Handle more use cases reported for issues/78797#79628
Merged
[flang] Handle more use cases reported for issues/78797#79628
Conversation
Member
|
@llvm/pr-subscribers-flang-parser Author: Peter Klausler (klausler) ChangesI implemented legacy "token pasting" via line continuation for call prefix& in a recent patch; this patch addresses the related cases call prefix& and call & Fixes the latest #79590. Full diff: https://github.com/llvm/llvm-project/pull/79628.diff 2 Files Affected:
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
|
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)
and
call prefix&
&MACRO
Fixes the latest llvm#79590.
mjklemm
approved these changes
Jan 31, 2024
Contributor
mjklemm
left a comment
There was a problem hiding this comment.
This PR looks good to me.
|
Is there anything holding up this PR? |
Contributor
Peter is in PTO right now. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 #79590.