From 15630a4ddd6507bf0a01d339368020f4e3c71a1b Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Wed, 22 May 2019 08:26:50 -0700 Subject: [PATCH] [flang] Prevent possible infinte loop in parameter folding Original-commit: flang-compiler/f18@38360930ce5b63987bc17fa235016743b90168ae Reviewed-on: https://github.com/flang-compiler/f18/pull/469 Tree-same-pre-rewrite: false --- flang/lib/evaluate/fold.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flang/lib/evaluate/fold.cc b/flang/lib/evaluate/fold.cc index 04bc338808ca..62c0da4fc692 100644 --- a/flang/lib/evaluate/fold.cc +++ b/flang/lib/evaluate/fold.cc @@ -806,6 +806,9 @@ static std::optional> GetParameterValue( auto converted{ConvertToType(*dyType, common::Clone(*init))}; semantics::ObjectEntityDetails *mutableObject{ const_cast(object)}; + // Reset expression now to prevent infinite loops if the init + // expression depends on symbol itself. + mutableObject->set_init(std::nullopt); if (converted.has_value()) { *converted = Fold(context, std::move(*converted)); auto *unwrapped{UnwrapExpr>(*converted)}; @@ -827,7 +830,6 @@ static std::optional> GetParameterValue( "Initialization expression for PARAMETER '%s' (%s) cannot be converted to its type (%s)"_err_en_US, symbol->name(), ss.str(), dyType->AsFortran()); } - mutableObject->set_init(std::nullopt); } } }