[flang] Add __COUNTER__ preprocessor macro (#136827)
This commit adds support for the `__COUNTER__` preprocessor macro, which works the same as the one found in clang. It is useful to generate unique names at compile-time.
This commit is contained in:
committed by
GitHub
parent
b222fa8284
commit
5c3bf36c99
@@ -521,6 +521,8 @@ end
|
||||
* We respect Fortran comments in macro actual arguments (like GNU, Intel, NAG;
|
||||
unlike PGI and XLF) on the principle that macro calls should be treated
|
||||
like function references. Fortran's line continuation methods also work.
|
||||
* We implement the `__COUNTER__` preprocessing extension,
|
||||
see [Non-standard Extensions](Preprocessing.md#non-standard-extensions)
|
||||
|
||||
## Standard features not silently accepted
|
||||
|
||||
|
||||
@@ -138,6 +138,18 @@ text.
|
||||
OpenMP-style directives that look like comments are not addressed by
|
||||
this scheme but are obvious extensions.
|
||||
|
||||
## Currently implemented built-ins
|
||||
|
||||
* `__DATE__`: Date, given as e.g. "Jun 16 1904"
|
||||
* `__TIME__`: Time in 24-hour format including seconds, e.g. "09:24:13"
|
||||
* `__TIMESTAMP__`: Date, time and year of last modification, given as e.g. "Fri May 9 09:16:17 2025"
|
||||
* `__FILE__`: Current file
|
||||
* `__LINE__`: Current line
|
||||
|
||||
### Non-standard Extensions
|
||||
|
||||
* `__COUNTER__`: Replaced by sequential integers on each expansion, starting from 0.
|
||||
|
||||
## Appendix
|
||||
`N` in the table below means "not supported"; this doesn't
|
||||
mean a bug, it just means that a particular behavior was
|
||||
|
||||
@@ -122,6 +122,8 @@ private:
|
||||
std::list<std::string> names_;
|
||||
std::unordered_map<CharBlock, Definition> definitions_;
|
||||
std::stack<CanDeadElseAppear> ifStack_;
|
||||
|
||||
unsigned int counterVal_{0};
|
||||
};
|
||||
} // namespace Fortran::parser
|
||||
#endif // FORTRAN_PARSER_PREPROCESSOR_H_
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
@@ -299,6 +300,7 @@ void Preprocessor::DefineStandardMacros() {
|
||||
Define("__FILE__"s, "__FILE__"s);
|
||||
Define("__LINE__"s, "__LINE__"s);
|
||||
Define("__TIMESTAMP__"s, "__TIMESTAMP__"s);
|
||||
Define("__COUNTER__"s, "__COUNTER__"s);
|
||||
}
|
||||
|
||||
static const std::string idChars{
|
||||
@@ -495,6 +497,8 @@ std::optional<TokenSequence> Preprocessor::MacroReplacement(
|
||||
repl = "\""s + time + '"';
|
||||
}
|
||||
}
|
||||
} else if (name == "__COUNTER__") {
|
||||
repl = std::to_string(counterVal_++);
|
||||
}
|
||||
if (!repl.empty()) {
|
||||
ProvenanceRange insert{allSources_.AddCompilerInsertion(repl)};
|
||||
|
||||
9
flang/test/Preprocessing/counter.F90
Normal file
9
flang/test/Preprocessing/counter.F90
Normal file
@@ -0,0 +1,9 @@
|
||||
! RUN: %flang -E %s | FileCheck %s
|
||||
! CHECK: print *, 0
|
||||
! CHECK: print *, 1
|
||||
! CHECK: print *, 2
|
||||
! Check incremental counter macro
|
||||
#define foo bar
|
||||
print *, __COUNTER__
|
||||
print *, __COUNTER__
|
||||
print *, __COUNTER__
|
||||
Reference in New Issue
Block a user