diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp index c2b8551..c45db9a 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -30,7 +30,7 @@ static void FillCommonTypes(map& types) types[letter.first] = new SgType(T_FLOAT); } -static void FindAllVars(SgExpression* expr, set& allVars, set& allVarsConst) +static void FindAllVars(SgExpression* expr, set& allVars, set& allVarsConst, SgStatement* scope) { if (expr == NULL) return; @@ -41,17 +41,22 @@ static void FindAllVars(SgExpression* expr, set& allVars, setsymbol(); if ((s->attributes() & EXTERNAL_BIT)) { - if (var == FUNC_CALL) + if (var == FUNC_CALL && !IS_BY_USE(s) && s->scope() == scope) allVars.insert(s); } else - allVars.insert(s); + { + if (!IS_BY_USE(s) && s->scope() == scope) + { + allVars.insert(s); + } + } } else if (var == CONST_REF) allVarsConst.insert(expr->symbol()); - FindAllVars(expr->lhs(), allVars, allVarsConst); - FindAllVars(expr->rhs(), allVars, allVarsConst); + FindAllVars(expr->lhs(), allVars, allVarsConst, scope); + FindAllVars(expr->rhs(), allVars, allVarsConst, scope); } static char getValue(SgExpression* ex) @@ -94,7 +99,7 @@ static void AddLettersToMap(SgExpression* expr, SgType* type, map } } -static vector getVars(const char* funcSymbol, set& toRename, +static vector getVars(const set& functionSymbs, set& toRename, const set& allVars, const map& types) { vector varsWithoutDecl; @@ -108,7 +113,7 @@ static vector getVars(const char* funcSymbol, set& toRenam for (auto& var : allVars) { - if (string(var->identifier()) == funcSymbol) + if (functionSymbs.count(var->identifier())) continue; vector allDecls; @@ -194,14 +199,31 @@ static map FunctionImplicitCheck(SgStatement* function, const map set allDataSymbols; for (auto s = function->symbol()->next(); s; s = s->next()) - if (s->attributes() & DATA_BIT) + if ((s->attributes() & DATA_BIT) && s->scope() == function) allDataSymbols.insert(s); + set functionSymbs = { function->symbol()->identifier() }; + if (isSgFuncHedrStmt(function)) + { + SgFuncHedrStmt* hedr = isSgFuncHedrStmt(function); + if (hedr->resultName()) + functionSymbs.insert(hedr->resultName()->identifier()); + } + for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) { if (skip.count(st->variant())) continue; + if (isDVM_stat(st) || isSPF_stat(st)) + continue; + + if (st->variant() == INTERFACE_STMT) + { + st = st->lastNodeOfStmt(); + continue; + } + if (st->variant() == DATA_DECL) { const string str = st->expr(0)->thellnd->entry.string_val; @@ -214,10 +236,14 @@ static map FunctionImplicitCheck(SgStatement* function, const map } for (int i = 0; i < 3; ++i) - FindAllVars(st->expr(i), allVars, allVarsConst); + FindAllVars(st->expr(i), allVars, allVarsConst, function); if (st->variant() == FOR_NODE) - allVars.insert(isSgForStmt(st)->doName()); + { + auto s = isSgForStmt(st)->doName(); + if (!IS_BY_USE(s) && s->scope() == function) + allVars.insert(s); + } } //add parameters @@ -232,8 +258,8 @@ static map FunctionImplicitCheck(SgStatement* function, const map } } - varsWithoutDecl = getVars(function->symbol()->identifier(), toRename, allVars, types); - varsWithoutDeclConst = getVars(function->symbol()->identifier(), toRename, allVarsConst, types); + varsWithoutDecl = getVars(functionSymbs, toRename, allVars, types); + varsWithoutDeclConst = getVars(functionSymbs, toRename, allVarsConst, types); if (!hasImplicitNone) { @@ -272,9 +298,16 @@ static map FunctionImplicitCheck(SgStatement* function, const map if (function->variant() == FUNC_HEDR) { + SgFuncHedrStmt* hedr = isSgFuncHedrStmt(function); + auto type_op = function->expr(1); if (type_op == NULL) - varsWithoutDecl.push_back(function->symbol()); + { + if (hedr->resultName()) + varsWithoutDecl.push_back(hedr->resultName()); + else + varsWithoutDecl.push_back(function->symbol()); + } } makeDeclaration(varsWithoutDecl, function); @@ -306,9 +339,12 @@ void implicitCheck(SgFile* file) { map> typesByFunctions; - for (int func = 0; func < file->numberOfFunctions(); ++func) + vector modulesAndFunctions; + getModulesAndFunctions(file, modulesAndFunctions); + + for (int func = 0; func < modulesAndFunctions.size(); ++func) { - SgStatement* function = file->functions(func); + SgStatement* function = modulesAndFunctions[func]; typesByFunctions[function] = FunctionImplicitCheck(function, typesByFunctions); } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index a5068c3..50f571b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -310,6 +310,8 @@ void InitPassesDependencies(map> &passDepsIn, set list({ CALL_GRAPH2, REVERT_SUBST_EXPR_RD }) <= Pass(REMOVE_DEAD_CODE); list({ REMOVE_DEAD_CODE, CONVERT_LOOP_TO_ASSIGN, RESTORE_LOOP_FROM_ASSIGN }) <= Pass(REMOVE_DEAD_CODE_AND_UNPARSE); + Pass(CORRECT_VAR_DECL) <= Pass(SET_IMPLICIT_NONE); + passesIgnoreStateDone.insert({ CREATE_PARALLEL_DIRS, INSERT_PARALLEL_DIRS, INSERT_SHADOW_DIRS, EXTRACT_PARALLEL_DIRS, EXTRACT_SHADOW_DIRS, CREATE_REMOTES, UNPARSE_FILE, REMOVE_AND_CALC_SHADOW, REVERSE_CREATED_NESTED_LOOPS, PREDICT_SCHEME, CALCULATE_STATS_SCHEME, REVERT_SPF_DIRS, CLEAR_SPF_DIRS, TRANSFORM_SHADOW_IF_FULL, diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp index ae78c98..02c2c11 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp @@ -997,7 +997,7 @@ static bool findSymbol(SgExpression *declLst, const string &toFind) SgExpression* ex = exs.top(); exs.pop(); - if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF) + if (ex->variant() == ARRAY_REF || ex->variant() == VAR_REF || ex->variant() == CONST_REF) { if (ex->symbol()->identifier() == toFind) return true; diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index ee7049e..f4f69b9 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2337" +#define VERSION_SPF "2339" diff --git a/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp b/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp index 99c38d6..0c6d0e9 100644 --- a/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp +++ b/sapfor/experts/Sapfor_2017/_src/VerificationCode/StructureChecker.cpp @@ -590,7 +590,6 @@ bool checkAndMoveFormatOperators(SgFile* file, vector& currMessages, b SgStatement* lastNode = st->lastNodeOfStmt(); vector toMove; - SgStatement* firstExec = NULL; while (st != lastNode) { if (st == NULL) @@ -602,11 +601,8 @@ bool checkAndMoveFormatOperators(SgFile* file, vector& currMessages, b if (st->variant() == CONTAINS_STMT) break; - if (isSgExecutableStatement(st) && !isDVM_stat(st) && !isSPF_stat(st)) - { - firstExec = st; + if (isSgExecutableStatement(st) && !isDVM_stat(st) && !isSPF_stat(st)) break; - } if (st->variant() == FORMAT_STAT) { @@ -630,9 +626,8 @@ bool checkAndMoveFormatOperators(SgFile* file, vector& currMessages, b { if (!withError) { - checkNull(firstExec, convertFileName(__FILE__).c_str(), __LINE__); for (auto& format : toMove) - firstExec->insertStmtBefore(*format, *firstExec->controlParent()); + lastNode->insertStmtBefore(*format, *lastNode->controlParent()); } else {