[PATCH] D86554: [flang] Don't completely left-justify fixed-form tokenization

Peter Klausler via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 25 10:28:05 PDT 2020


klausler created this revision.
klausler added reviewers: sscalpone, PeteSteinfeld.
klausler added a project: Flang.
Herald added a reviewer: jdoerfert.
Herald added a reviewer: DavidTruby.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
klausler requested review of this revision.

If the label field is empty, and macro replacement occurs,
the rescanned text might be misclassified as a comment card
if it happens to begin with a C or a D.  Insert a leading
space into these otherwise empty label fields.

Fixes https://bugs.llvm.org/show_bug.cgi?id=47173


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D86554

Files:
  flang/lib/Parser/prescan.cpp
  flang/lib/Parser/prescan.h
  flang/test/Preprocessing/fixed-rescan.F
  flang/test/Preprocessing/pp029.F


Index: flang/test/Preprocessing/pp029.F
===================================================================
--- flang/test/Preprocessing/pp029.F
+++ flang/test/Preprocessing/pp029.F
@@ -1,5 +1,5 @@
 ! RUN: %f18 -E %s 2>&1 | FileCheck %s
-! CHECK: if(77 7.eq.777)then
+! CHECK: if(777.eq.777)then
 * \ newline allowed in #define
       integer, parameter :: KWM = 666
 #define KWM 77\
Index: flang/test/Preprocessing/fixed-rescan.F
===================================================================
--- /dev/null
+++ flang/test/Preprocessing/fixed-rescan.F
@@ -0,0 +1,7 @@
+! RUN: %f18 -E %s | FileCheck %s
+! CHECK: callbar
+! Ensure that rescanned lines after macro replacement are not
+! misinterpreted as fixed-form comments when they start with C or D.
+#define foo bar
+      call foo
+      end
Index: flang/lib/Parser/prescan.h
===================================================================
--- flang/lib/Parser/prescan.h
+++ flang/lib/Parser/prescan.h
@@ -147,7 +147,7 @@
                     common::LanguageFeature::ClassicCComments)));
   }
 
-  void LabelField(TokenSequence &, int outCol = 1);
+  void LabelField(TokenSequence &);
   void SkipToEndOfLine();
   bool MustSkipToEndOfLine() const;
   void NextChar();
Index: flang/lib/Parser/prescan.cpp
===================================================================
--- flang/lib/Parser/prescan.cpp
+++ flang/lib/Parser/prescan.cpp
@@ -245,8 +245,9 @@
   }
 }
 
-void Prescanner::LabelField(TokenSequence &token, int outCol) {
+void Prescanner::LabelField(TokenSequence &token) {
   const char *bad{nullptr};
+  int outCol{1};
   for (; *at_ != '\n' && column_ <= 6; ++at_) {
     if (*at_ == '\t') {
       ++at_;
@@ -256,20 +257,26 @@
     if (*at_ != ' ' &&
         !(*at_ == '0' && column_ == 6)) { // '0' in column 6 becomes space
       EmitChar(token, *at_);
+      ++outCol;
       if (!bad && !IsDecimalDigit(*at_)) {
         bad = at_;
       }
-      ++outCol;
     }
     ++column_;
   }
-  if (outCol > 1) {
+  if (outCol == 1) { // empty label field
+    // Emit a space so that, if the line is rescanned after preprocessing,
+    // a leading 'C' or 'D' won't be left-justified and then accidentally
+    // misinterpreted as a comment card.
+    EmitChar(token, ' ');
+    ++outCol;
+  } else {
     if (bad && !preprocessor_.IsNameDefined(token.CurrentOpenToken())) {
       Say(GetProvenance(bad),
           "Character in fixed-form label field must be a digit"_en_US);
     }
-    token.CloseToken();
   }
+  token.CloseToken();
   SkipToNextSignificantCharacter();
   if (IsDecimalDigit(*at_)) {
     Say(GetProvenance(at_),


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86554.287705.patch
Type: text/x-patch
Size: 2620 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200825/37df26f0/attachment.bin>


More information about the llvm-commits mailing list