[flang] Fix ENUMERATOR declarations in nested scopes
authorPeter Klausler <pklausler@nvidia.com>
Fri, 20 Jan 2023 01:01:06 +0000 (17:01 -0800)
committerPeter Klausler <pklausler@nvidia.com>
Sun, 29 Jan 2023 23:55:26 +0000 (15:55 -0800)
ENUMERATOR declarations are checking for conflicts between new
enumerator names and names in both the local scope and scopes
that contain it.  ENUMERATOR declarations belong to the local
scope and so only a conflict with a name therein is an error.
(In short, use FindInScope rather than FindSymbol.)

Differential Revision: https://reviews.llvm.org/D142773

flang/lib/Semantics/resolve-names.cpp

index dfefd9e..594a718 100644 (file)
@@ -4256,7 +4256,7 @@ bool DeclarationVisitor::Pre(const parser::NamedConstant &x) {
 
 bool DeclarationVisitor::Pre(const parser::Enumerator &enumerator) {
   const parser::Name &name{std::get<parser::NamedConstant>(enumerator.t).v};
-  Symbol *symbol{FindSymbol(name)};
+  Symbol *symbol{FindInScope(name)};
   if (symbol && !symbol->has<UnknownDetails>()) {
     // Contrary to named constants appearing in a PARAMETER statement,
     // enumerator names should not have their type, dimension or any other