1 <!--===- docs/Preprocessing.md
3 Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 See https://llvm.org/LICENSE.txt for license information.
5 SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
9 # Fortran Preprocessing
16 ## Behavior common to (nearly) all compilers:
18 * Macro and argument names are sensitive to case.
19 * Fixed form right margin clipping after column 72 (or 132)
20 has precedence over macro name recognition, and also over
21 recognition of function-like parentheses and arguments.
22 * Fixed form right margin clipping does not apply to directive lines.
23 * Macro names are not recognized as such when spaces are inserted
24 into their invocations in fixed form.
25 This includes spaces at the ends of lines that have been clipped
26 at column 72 (or whatever).
27 * Text is rescanned after expansion of macros and arguments.
28 * Macros are not expanded within quoted character literals or
29 quoted FORMAT edit descriptors.
30 * Macro expansion occurs before any effective token pasting via fixed form
32 * C-like line continuations with backslash-newline are allowed in
33 directives, including the definitions of macro bodies.
34 * `/* Old style C comments */` are ignored in directives and
35 removed from the bodies of macro definitions.
36 * `// New style C comments` are not removed, since Fortran has OPERATOR(//).
37 * C-like line continuations with backslash-newline can appear in
38 old-style C comments in directives.
39 * After `#define FALSE TRUE`, `.FALSE.` is replaced by `.TRUE.`;
40 i.e., tokenization does not hide the names of operators or logical constants.
41 * `#define KWM c` allows the use of `KWM` in column 1 as a fixed form comment
43 * A `#define` directive intermixed with continuation lines can't
44 define a macro that's invoked earlier in the same continued statement.
46 ## Behavior that is not consistent over all extant compilers but which probably should be uncontroversial:
48 * Invoked macro names can straddle a Fortran line continuation.
49 * ... unless implicit fixed form card padding intervenes; i.e.,
50 in fixed form, a continued macro name has to be split at column
52 * Comment lines may appear with continuations in a split macro names.
53 * Function-like macro invocations can straddle a Fortran fixed form line
54 continuation between the name and the left parenthesis, and comment and
55 directive lines can be there too.
56 * Function-like macro invocations can straddle a Fortran fixed form line
57 continuation between the parentheses, and comment lines can be there too.
58 * Macros are not expanded within Hollerith constants or Hollerith
59 FORMAT edit descriptors.
60 * Token pasting with `##` works in function-like macros.
61 * Argument stringization with `#` works in function-like macros.
62 * Directives can be capitalized (e.g., `#DEFINE`) in fixed form.
63 * Fixed form clipping after column 72 or 132 is done before macro expansion,
65 * C-like line continuation with backslash-newline can appear in the name of
66 a keyword-like macro definition.
67 * If `#` is in column 6 in fixed form, it's a continuation marker, not a
69 * `#define KWM !` allows KWM to signal a comment.
71 ## Judgement calls, where precedents are unclear:
73 * Expressions in `#if` and `#elif` should support both Fortran and C
74 operators; e.g., `#if 2 .LT. 3` should work.
75 * If a function-like macro does not close its parentheses, line
76 continuation should be assumed.
77 * ... However, the leading parenthesis has to be on the same line as
78 the name of the function-like macro, or on a continuation line thereof.
79 * If macros expand to text containing `&`, it doesn't work as a free form
80 line continuation marker.
81 * `#define c 1` does not allow a `c` in column 1 to be used as a label
82 in fixed form, rather than as a comment line indicator.
83 * IBM claims to be ISO C compliant and therefore recognizes trigraph sequences.
84 * Fortran comments in macro actual arguments should be respected, on
85 the principle that a macro call should work like a function reference.
86 * If a `#define` or `#undef` directive appears among continuation
87 lines, it may or may not affect text in the continued statement that
88 appeared before the directive.
90 ## Behavior that few compilers properly support (or none), but should:
92 * A macro invocation can straddle free form continuation lines in all of their
93 forms, with continuation allowed in the name, before the arguments, and
95 * Directives can be capitalized in free form, too.
96 * `__VA_ARGS__` and `__VA_OPT__` work in variadic function-like macros.
98 ## In short, a Fortran preprocessor should work as if:
100 1. Fixed form lines are padded up to column 72 (or 132) and clipped thereafter.
101 2. Fortran comments are removed.
102 3. C-style line continuations are processed in preprocessing directives.
103 4. C old-style comments are removed from directives.
104 5. Fortran line continuations are processed (outside preprocessing directives).
105 Line continuation rules depend on source form.
106 Comment lines that are enabled compiler directives have their line
107 continuations processed.
108 Conditional compilation preprocessing directives (e.g., `#if`) may be
109 appear among continuation lines, and have their usual effects upon them.
110 6. Other preprocessing directives are processed and macros expanded.
111 Along the way, Fortran `INCLUDE` lines and preprocessor `#include` directives
112 are expanded, and all these steps applied recursively to the introduced text.
113 7. Any Fortran comments created by macro replacement are removed.
115 Steps 5 and 6 are interleaved with respect to the preprocessing state.
116 Conditional compilation preprocessing directives always reflect only the macro
117 definition state produced by the active `#define` and `#undef` preprocessing directives
120 If the source form is changed by means of a compiler directive (i.e.,
121 `!DIR$ FIXED` or `FREE`) in an included source file, its effects cease
122 at the end of that file.
124 Last, if the preprocessor is not integrated into the Fortran compiler,
125 new Fortran continuation line markers should be introduced into the final
128 OpenMP-style directives that look like comments are not addressed by
129 this scheme but are obvious extensions.
132 `N` in the table below means "not supported"; this doesn't
133 mean a bug, it just means that a particular behavior was
135 `E` signifies "error reported".
137 The abbreviation `KWM` stands for "keyword macro" and `FLM` means
138 "function-like macro".
140 The first block of tests (`pp0*.F`) are all fixed-form source files;
141 the second block (`pp1*.F90`) are free-form source files.
151 . . . . . . pp001.F keyword macros
152 . . . . . . pp002.F #undef
153 . . . . . . pp003.F function-like macros
154 . . . . . . pp004.F KWMs case-sensitive
155 . N . N N . pp005.F KWM split across continuation, implicit padding
156 . N . N N . pp006.F ditto, but with intervening *comment line
157 N N N N N N pp007.F KWM split across continuation, clipped after column 72
158 . . . . . . pp008.F KWM with spaces in name at invocation NOT replaced
159 . N . N N . pp009.F FLM call split across continuation, implicit padding
160 . N . N N . pp010.F ditto, but with intervening *comment line
161 N N N N N N pp011.F FLM call name split across continuation, clipped
162 . N . N N . pp012.F FLM call name split across continuation
163 . E . N N . pp013.F FLM call split between name and (
164 . N . N N . pp014.F FLM call split between name and (, with intervening *comment
165 . E . N N . pp015.F FLM call split between name and (, clipped
166 . E . N N . pp016.F FLM call split between name and ( and in argument
167 . . . . . . pp017.F KLM rescan
168 . . . . . . pp018.F KLM rescan with #undef (so rescan is after expansion)
169 . . . . . . pp019.F FLM rescan
170 . . . . . . pp020.F FLM expansion of argument
171 . . . . . . pp021.F KWM NOT expanded in 'literal'
172 . . . . . . pp022.F KWM NOT expanded in "literal"
173 . . E E . E pp023.F KWM NOT expanded in 9HHOLLERITH literal
174 . . . E . . pp024.F KWM NOT expanded in Hollerith in FORMAT
175 . . . . . . pp025.F KWM expansion is before token pasting due to fixed-form space removal
176 . . . E . E pp026.F ## token pasting works in FLM
177 E . . E E . pp027.F #DEFINE works in fixed form
178 . N . N N . pp028.F fixed-form clipping done before KWM expansion on source line
179 . . . . . . pp029.F \ newline allowed in #define
180 . . . . . . pp030.F /* C comment */ erased from #define
181 E E E E E E pp031.F // C++ comment NOT erased from #define
182 . . . . . . pp032.F /* C comment */ \ newline erased from #define
183 . . . . . . pp033.F /* C comment \ newline */ erased from #define
184 . . . . . N pp034.F \ newline allowed in name on KWM definition
185 . E . E E . pp035.F #if 2 .LT. 3 works
186 . . . . . . pp036.F #define FALSE TRUE ... .FALSE. -> .TRUE.
187 N N N N N N pp037.F fixed-form clipping NOT applied to #define
188 . . E . E E pp038.F FLM call with closing ')' on next line (not a continuation)
189 E . E . E E pp039.F FLM call with '(' on next line (not a continuation)
190 . . . . . . pp040.F #define KWM c, then KWM works as comment line initiator
191 E . E . . E pp041.F use KWM expansion as continuation indicators
192 N N N . . N pp042.F #define c 1, then use c as label in fixed-form
193 . . . . N . pp043.F #define with # in column 6 is a continuation line in fixed-form
194 E . . . . . pp044.F #define directive amid continuations
195 . . . . . . pp101.F90 keyword macros
196 . . . . . . pp102.F90 #undef
197 . . . . . . pp103.F90 function-like macros
198 . . . . . . pp104.F90 KWMs case-sensitive
199 . N N N N N pp105.F90 KWM call name split across continuation, with leading &
200 . N N N N N pp106.F90 ditto, with & ! comment
201 N N E E N . pp107.F90 KWM call name split across continuation, no leading &, with & ! comment
202 N N E E N . pp108.F90 ditto, but without & ! comment
203 . N N N N N pp109.F90 FLM call name split with leading &
204 . N N N N N pp110.F90 ditto, with & ! comment
205 N N E E N . pp111.F90 FLM call name split across continuation, no leading &, with & ! comment
206 N N E E N . pp112.F90 ditto, but without & ! comment
207 . N N N N E pp113.F90 FLM call split across continuation between name and (, leading &
208 . N N N N E pp114.F90 ditto, with & ! comment, leading &
209 N N N N N . pp115.F90 ditto, with & ! comment, no leading &
210 N N N N N . pp116.F90 FLM call split between name and (, no leading &
211 . . . . . . pp117.F90 KWM rescan
212 . . . . . . pp118.F90 KWM rescan with #undef, proving rescan after expansion
213 . . . . . . pp119.F90 FLM rescan
214 . . . . . . pp120.F90 FLM expansion of argument
215 . . . . . . pp121.F90 KWM NOT expanded in 'literal'
216 . . . . . . pp122.F90 KWM NOT expanded in "literal"
217 . . E E . E pp123.F90 KWM NOT expanded in Hollerith literal
218 . . E E . E pp124.F90 KWM NOT expanded in Hollerith in FORMAT
219 E . . E E . pp125.F90 #DEFINE works in free form
220 . . . . . . pp126.F90 \ newline works in #define
221 N . E . E E pp127.F90 FLM call with closing ')' on next line (not a continuation)
222 E . E . E E pp128.F90 FLM call with '(' on next line (not a continuation)
223 . . N . . N pp129.F90 #define KWM !, then KWM works as comment line initiator
224 E . E . . E pp130.F90 #define KWM &, use for continuation w/o pasting (ifort and nag seem to continue #define)