Skip to content

Commit 04d5aab

Browse files
committed
[flang] Add __COUNTER__ preprocessor macro
1 parent 1a48e1d commit 04d5aab

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed

flang/docs/Preprocessing.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ text.
138138
OpenMP-style directives that look like comments are not addressed by
139139
this scheme but are obvious extensions.
140140

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+
141153
## Appendix
142154
`N` in the table below means "not supported"; this doesn't
143155
mean a bug, it just means that a particular behavior was

flang/include/flang/Parser/preprocessor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ class Preprocessor {
121121
std::list<std::string> names_;
122122
std::unordered_map<CharBlock, Definition> definitions_;
123123
std::stack<CanDeadElseAppear> ifStack_;
124+
125+
unsigned int counterVal_{0};
124126
};
125127
} // namespace Fortran::parser
126128
#endif // FORTRAN_PARSER_PREPROCESSOR_H_

flang/lib/Parser/preprocessor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <memory>
2323
#include <optional>
2424
#include <set>
25+
#include <string>
2526
#include <utility>
2627
#include <vector>
2728

@@ -299,6 +300,7 @@ void Preprocessor::DefineStandardMacros() {
299300
Define("__FILE__"s, "__FILE__"s);
300301
Define("__LINE__"s, "__LINE__"s);
301302
Define("__TIMESTAMP__"s, "__TIMESTAMP__"s);
303+
Define("__COUNTER__"s, "__COUNTER__"s);
302304
}
303305

304306
void Preprocessor::Define(const std::string &macro, const std::string &value) {
@@ -421,6 +423,8 @@ std::optional<TokenSequence> Preprocessor::MacroReplacement(
421423
repl = "\""s + time + '"';
422424
}
423425
}
426+
} else if (name == "__COUNTER__") {
427+
repl = std::to_string(counterVal_++);
424428
}
425429
if (!repl.empty()) {
426430
ProvenanceRange insert{allSources_.AddCompilerInsertion(repl)};

flang/test/Preprocessing/counter.F90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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__

0 commit comments

Comments
 (0)