File tree Expand file tree Collapse file tree 5 files changed +29
-0
lines changed Expand file tree Collapse file tree 5 files changed +29
-0
lines changed Original file line number Diff line number Diff line change 521
521
* We respect Fortran comments in macro actual arguments (like GNU, Intel, NAG;
522
522
unlike PGI and XLF) on the principle that macro calls should be treated
523
523
like function references. Fortran's line continuation methods also work.
524
+ * We implement the ` __COUNTER__ ` preprocessing extension,
525
+ see [ Non-standard Extensions] ( Preprocessing.md#non-standard-extensions )
524
526
525
527
## Standard features not silently accepted
526
528
Original file line number Diff line number Diff line change @@ -138,6 +138,18 @@ text.
138
138
OpenMP-style directives that look like comments are not addressed by
139
139
this scheme but are obvious extensions.
140
140
141
+ ## Currently implemented built-ins
142
+
143
+ * ` __DATE__ ` : Date, given as e.g. "Jun 16 1904"
144
+ * ` __TIME__ ` : Time in 24-hour format including seconds, e.g. "09:24:13"
145
+ * ` __TIMESTAMP__ ` : Date, time and year of last modification, given as e.g. "Fri May 9 09:16:17 2025"
146
+ * ` __FILE__ ` : Current file
147
+ * ` __LINE__ ` : Current line
148
+
149
+ ### Non-standard Extensions
150
+
151
+ * ` __COUNTER__ ` : Replaced by sequential integers on each expansion, starting from 0.
152
+
141
153
## Appendix
142
154
` N ` in the table below means "not supported"; this doesn't
143
155
mean a bug, it just means that a particular behavior was
Original file line number Diff line number Diff line change @@ -122,6 +122,8 @@ class Preprocessor {
122
122
std::list<std::string> names_;
123
123
std::unordered_map<CharBlock, Definition> definitions_;
124
124
std::stack<CanDeadElseAppear> ifStack_;
125
+
126
+ unsigned int counterVal_{0 };
125
127
};
126
128
} // namespace Fortran::parser
127
129
#endif // FORTRAN_PARSER_PREPROCESSOR_H_
Original file line number Diff line number Diff line change 22
22
#include < memory>
23
23
#include < optional>
24
24
#include < set>
25
+ #include < string>
25
26
#include < utility>
26
27
#include < vector>
27
28
@@ -299,6 +300,7 @@ void Preprocessor::DefineStandardMacros() {
299
300
Define (" __FILE__" s, " __FILE__" s);
300
301
Define (" __LINE__" s, " __LINE__" s);
301
302
Define (" __TIMESTAMP__" s, " __TIMESTAMP__" s);
303
+ Define (" __COUNTER__" s, " __COUNTER__" s);
302
304
}
303
305
304
306
static const std::string idChars{
@@ -495,6 +497,8 @@ std::optional<TokenSequence> Preprocessor::MacroReplacement(
495
497
repl = " \" " s + time + ' "' ;
496
498
}
497
499
}
500
+ } else if (name == " __COUNTER__" ) {
501
+ repl = std::to_string (counterVal_++);
498
502
}
499
503
if (!repl.empty ()) {
500
504
ProvenanceRange insert{allSources_.AddCompilerInsertion (repl)};
Original file line number Diff line number Diff line change
1
+ ! RUN: %flang -E %s | FileCheck %s
2
+ ! CHECK: print *, 0
3
+ ! CHECK: print *, 1
4
+ ! CHECK: print *, 2
5
+ ! Check incremental counter macro
6
+ #define foo bar
7
+ print * , __COUNTER__
8
+ print * , __COUNTER__
9
+ print * , __COUNTER__
You can’t perform that action at this time.
0 commit comments