[flang-commits] [PATCH] D155973: [flang] Portability warning and documentation for an obscure extension

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Fri Jul 21 08:41:22 PDT 2023


klausler created this revision.
klausler added a reviewer: vzakhari.
klausler added a project: Flang.
Herald added subscribers: sunshaoce, jdoerfert.
Herald added a reviewer: sscalpone.
Herald added a project: All.
klausler requested review of this revision.

A quotation mark can appear in a Fortran character literal by doubling
it; for example, PRINT *, "'""'" prints '"'.  When those doubled
quotation marks are split by a free form line continuation, the
continuation line should have an ampersand before the second quotation
mark.  But most compilers, including this one, allow the second
quotation mark to appear as the first character on the continuation
line, too.

So this works:

  print *, "'"&

"'"

but it really should be written as:

  print *, "'"&

&"'"

Emit a portability warning and document that we support this near-universal
extension.


https://reviews.llvm.org/D155973

Files:
  flang/docs/Extensions.md
  flang/lib/Parser/prescan.cpp
  flang/test/Parser/continuation-before-quote.f90


Index: flang/test/Parser/continuation-before-quote.f90
===================================================================
--- /dev/null
+++ flang/test/Parser/continuation-before-quote.f90
@@ -0,0 +1,10 @@
+! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s
+! Continuation between repeated quotation marks
+subroutine test
+!CHECK: portability: Repeated quote mark in character literal continuation line should have been preceded by '&'
+  print *, 'needs an '&
+'ampersand'''
+!CHECK-NOT: portability: Repeated quote mark in character literal continuation line should have been preceded by '&'
+  print *, 'has an '&
+&'ampersand'''
+end
Index: flang/lib/Parser/prescan.cpp
===================================================================
--- flang/lib/Parser/prescan.cpp
+++ flang/lib/Parser/prescan.cpp
@@ -726,6 +726,11 @@
         break;
       }
       inCharLiteral_ = true;
+      if (insertASpace_) {
+        Say(GetProvenanceRange(at_, end),
+            "Repeated quote mark in character literal continuation line should have been preceded by '&'"_port_en_US);
+        insertASpace_ = false;
+      }
     }
   }
   inCharLiteral_ = false;
Index: flang/docs/Extensions.md
===================================================================
--- flang/docs/Extensions.md
+++ flang/docs/Extensions.md
@@ -291,6 +291,10 @@
   numeric character literal kind prefix on the file name.
 * Intrinsic procedures TAND and ATAND. Constant folding is currently
   not supported for these procedures but this is planned.
+* When a pair of quotation marks in a character literal are split
+  by a line continuation in free form, the second quotation mark
+  may appear at the beginning of the continuation line without an
+  ampersand, althought one is required by the standard.
 
 ### Extensions supported when enabled by options
 
@@ -607,3 +611,4 @@
 * `ENCODING=` is not in the list of changeable modes on an I/O unit,
   but every Fortran compiler allows the encoding to be changed on an
   open unit.
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155973.542948.patch
Type: text/x-patch
Size: 2015 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230721/9e35c92d/attachment-0001.bin>


More information about the flang-commits mailing list