[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:
Yussur Mustafa Oraji
2025-05-30 14:33:53 +02:00
committed by GitHub
parent b222fa8284
commit 5c3bf36c99
5 changed files with 29 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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_

View File

@@ -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)};

View 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__