From fac84536bcb9fbca2b3517ca83d382329d0e6c55 Mon Sep 17 00:00:00 2001 From: Peter Steinfeld Date: Thu, 30 Jul 2020 10:51:44 -0700 Subject: [PATCH] [flang] Fix an assert on duplicate initializations When declaring the same variable twice with an initialization, we were failing an internal check. I fixed this by checking to see if the associated symbol already had an error. I added tests for pointer and non-pointer initialization of duplicate names. Differential Revision: https://reviews.llvm.org/D84969 --- flang/lib/Semantics/resolve-names.cpp | 33 +++++++++++++++------------ flang/test/Semantics/resolve91.f90 | 11 +++++++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 744eee19ba43..eb7dd697b274 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -5680,22 +5680,25 @@ void DeclarationVisitor::NonPointerInitialization(const parser::Name &name, const parser::ConstantExpr &expr, bool inComponentDecl) { if (name.symbol) { Symbol &ultimate{name.symbol->GetUltimate()}; - if (IsPointer(ultimate)) { - Say(name, "'%s' is a pointer but is not initialized like one"_err_en_US); - } else if (auto *details{ultimate.detailsIf()}) { - CHECK(!details->init()); - Walk(expr); - // TODO: check C762 - all bounds and type parameters of component - // are colons or constant expressions if component is initialized - if (inComponentDecl) { - // Can't convert to type of component, which might not yet - // be known; that's done later during instantiation. - if (MaybeExpr value{EvaluateExpr(expr)}) { - details->set_init(std::move(*value)); + if (!context().HasError(ultimate)) { + if (IsPointer(ultimate)) { + Say(name, + "'%s' is a pointer but is not initialized like one"_err_en_US); + } else if (auto *details{ultimate.detailsIf()}) { + CHECK(!details->init()); + Walk(expr); + // TODO: check C762 - all bounds and type parameters of component + // are colons or constant expressions if component is initialized + if (inComponentDecl) { + // Can't convert to type of component, which might not yet + // be known; that's done later during instantiation. + if (MaybeExpr value{EvaluateExpr(expr)}) { + details->set_init(std::move(*value)); + } + } else if (MaybeExpr folded{EvaluateConvertedExpr( + ultimate, expr, expr.thing.value().source)}) { + details->set_init(std::move(*folded)); } - } else if (MaybeExpr folded{EvaluateConvertedExpr( - ultimate, expr, expr.thing.value().source)}) { - details->set_init(std::move(*folded)); } } } diff --git a/flang/test/Semantics/resolve91.f90 b/flang/test/Semantics/resolve91.f90 index 2fbcaa384dfc..c94cda458f3f 100644 --- a/flang/test/Semantics/resolve91.f90 +++ b/flang/test/Semantics/resolve91.f90 @@ -63,3 +63,14 @@ module m7 !ERROR: Derived type 'ubound' not found integer :: ivar = ubound(iarray)(1) end module m7 + +module m8 + integer :: iVar = 3 + !ERROR: The type of 'ivar' has already been declared + integer :: iVar = 4 + integer, target :: jVar = 5 + integer, target :: kVar = 5 + integer, pointer :: pVar => jVar + !ERROR: The type of 'pvar' has already been declared + integer, pointer :: pVar => kVar +end module m8