[flang-commits] [flang] [flang] Enumeration Type: (PR 2/5) Name Resolution + Expression + Relational + SELECT CASE (PR #193028)
via flang-commits
flang-commits at lists.llvm.org
Thu Jun 25 13:01:32 PDT 2026
================
@@ -6011,14 +6014,90 @@ bool DeclarationVisitor::Pre(const parser::Enumerator &enumerator) {
return false;
}
+void DeclarationVisitor::Post(const parser::EnumDef &) {
+ enumerationState_ = EnumeratorState{};
+}
+
+// F2023 R766 EnumerationTypeDef — scope is pushed in Post(EnumerationTypeStmt)
+// and popped in Post(EndEnumerationTypeStmt).
bool DeclarationVisitor::Pre(const parser::EnumerationTypeDef &x) {
- Say(std::get<parser::Statement<parser::EnumerationTypeStmt>>(x.t).source,
- "F2023 ENUMERATION TYPEs are not yet implemented"_err_en_US);
+ BeginAttrs();
+ return true;
+}
+
+// F2023 R767 EnumerationTypeStmt — create the enumeration type symbol
+// in the enclosing scope and push a DerivedType scope for it.
+void DeclarationVisitor::Post(const parser::EnumerationTypeStmt &x) {
+ const auto &name{std::get<parser::Name>(x.t)};
+ Attrs attrs{EndAttrs()};
+ if (const auto &optAccessSpec{
+ std::get<std::optional<parser::AccessSpec>>(x.t)};
+ optAccessSpec) {
+ if (!NonDerivedTypeScope().IsModule()) { // F2023 C7114
+ Say(currStmtSource().value(),
+ "Access specifier on ENUMERATION TYPE may only appear in the specification part of a module"_err_en_US);
+ }
+ }
+ DerivedTypeDetails details;
+ details.set_isEnumerationType(true);
+ auto &symbol{MakeSymbol(name, attrs, std::move(details))};
+ symbol.ReplaceName(name.source);
+ PushScope(Scope::Kind::DerivedType, &symbol);
+ // Add a hidden __ordinal component to hold the 1-based enumerator position.
+ // This is a compiler-created INTEGER(4) component that preserves ordinal
+ // identity through constant folding and enables enumerator comparison.
+ SourceName ordinalName{context().SaveTempName(std::string{"__ordinal"})};
----------------
kwyatt-ext wrote:
Done.
https://github.com/llvm/llvm-project/pull/193028
More information about the flang-commits
mailing list