[flang-commits] [flang] [flang][preprocessor] Extend handling of line continuation replacements (PR #107010)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Mon Sep 2 10:52:52 PDT 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/107010
Codes using traditional C preprocessors will sometimes put a keyword macro name in a free form continuation line in order to get macro replacement of part of an identifier, as in
call subr_&
&N&
&(1.)
where N is a keyword macro. f18 already handles this case, but not when there is white space between the macro name and the following continuation marker character '&'. Allow white space to appear.
Fixes https://github.com/llvm/llvm-project/issues/106931.
>From cfebb9d1239a7fd8797f54f8b05734f63c635729 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Mon, 2 Sep 2024 10:48:06 -0700
Subject: [PATCH] [flang][preprocessor] Extend handling of line continuation
replacements
Codes using traditional C preprocessors will sometimes put a keyword
macro name in a free form continuation line in order to get macro
replacement of part of an identifier, as in
call subr_&
&N&
&(1.)
where N is a keyword macro. f18 already handles this case, but not
when there is white space between the macro name and the following
continuation marker character '&'. Allow white space to appear.
Fixes https://github.com/llvm/llvm-project/issues/106931.
---
flang/lib/Parser/prescan.cpp | 12 ++++++++----
flang/test/Preprocessing/pp134.F90 | 12 ++++++++----
2 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/flang/lib/Parser/prescan.cpp b/flang/lib/Parser/prescan.cpp
index 804ada7d11e020..dc41f444020659 100644
--- a/flang/lib/Parser/prescan.cpp
+++ b/flang/lib/Parser/prescan.cpp
@@ -712,12 +712,16 @@ bool Prescanner::NextToken(TokenSequence &tokens) {
// Subtlety: When an identifier is split across three or more continuation
// 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.
+ // distinct pp-tokens so that macro replacement operates on them
+ // independently. This trick accommodates the historic practice of
+ // using line continuation for token pasting after replacement.
} else if (parts == 2) {
+ if (afterLast && afterLast < limit_) {
+ afterLast = SkipWhiteSpace(afterLast);
+ }
if ((start > start_ && start[-1] == '&') ||
- (afterLast < limit_ && (*afterLast == '&' || *afterLast == '\n'))) {
+ (afterLast && afterLast < limit_ &&
+ (*afterLast == '&' || *afterLast == '\n'))) {
// call & call foo& call foo&
// &MACRO& OR &MACRO& OR &MACRO
// &foo(...) &(...)
diff --git a/flang/test/Preprocessing/pp134.F90 b/flang/test/Preprocessing/pp134.F90
index bc34767224fa03..213baad900b602 100644
--- a/flang/test/Preprocessing/pp134.F90
+++ b/flang/test/Preprocessing/pp134.F90
@@ -1,7 +1,8 @@
! RUN: %flang -E %s 2>&1 | FileCheck %s
! CHECK: print *, ADC, 1
-! CHECK: print *, AD, 1
-! CHECK: print *, DC, 1
+! CHECK: print *, AD, 2
+! CHECK: print *, DC, 3
+! CHECK: print *, AD(1), 4
! CHECK: print *, AD
! CHECK: print *, AB
#define B D
@@ -12,10 +13,13 @@
&C, 1
print *, A&
&B&
- &, 1
+ &, 2
print *, &
&B&
- &C, 1
+ &C, 3
+print *, A&
+ &B &
+ &(1), 4
print *, A&
&B
print *, A&
More information about the flang-commits
mailing list