diff --git a/.gitignore b/.gitignore index 26bbf69..ab041ca 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,5 @@ sapfor/experts/Sapfor_2017/Sapc++/Sapc++/x64/ sapfor/experts/Sapfor_2017/Sapc++/x64/ /build + +sapfor/experts/Sapfor_2017/out/ diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index efa3410..7759c53 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -2432,7 +2432,7 @@ int main(int argc, char **argv) int numVar = 0; out_free_form = 0; // F90 style out - out_upper_case = 1; + out_upper_case = 0; out_line_unlimit = 0; bool printText = false; diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp index 03316f2..c85d2e9 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/function_purifying.cpp @@ -1010,7 +1010,7 @@ void commonTransfer(const map>& allFuncInfo, const map } } -static string changeData(const string data, const map& constSymVars, const map& locVars) +static string changeData(const string& data, const map& constSymVars, const map& locVars) { int curChar = 0; string ident = ""; 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 b4c537c..c2b8551 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/set_implicit_none.cpp @@ -39,7 +39,12 @@ static void FindAllVars(SgExpression* expr, set& allVars, setsymbol(); - if ((s->attributes() & EXTERNAL_BIT) == 0) + if ((s->attributes() & EXTERNAL_BIT)) + { + if (var == FUNC_CALL) + allVars.insert(s); + } + else allVars.insert(s); } else if (var == CONST_REF) @@ -187,18 +192,34 @@ static map FunctionImplicitCheck(SgStatement* function, const map set skip = { EXTERN_STAT }; + set allDataSymbols; + for (auto s = function->symbol()->next(); s; s = s->next()) + if (s->attributes() & DATA_BIT) + allDataSymbols.insert(s); + for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT; st = st->lexNext()) { if (skip.count(st->variant())) continue; + if (st->variant() == DATA_DECL) + { + const string str = st->expr(0)->thellnd->entry.string_val; + + for (auto& data : allDataSymbols) + { + if (str.find(data->identifier()) != string::npos) + allVars.insert(data); + } + } + for (int i = 0; i < 3; ++i) FindAllVars(st->expr(i), allVars, allVarsConst); if (st->variant() == FOR_NODE) allVars.insert(isSgForStmt(st)->doName()); } - + //add parameters auto prog = isSgProgHedrStmt(function); if (prog) @@ -216,6 +237,8 @@ static map FunctionImplicitCheck(SgStatement* function, const map if (!hasImplicitNone) { + vector macro; + for (auto st = function->lexNext(); st != endOfFunc && st->variant() != CONTAINS_STMT && isSgExecutableStatement(st) == NULL; ) @@ -226,6 +249,12 @@ static map FunctionImplicitCheck(SgStatement* function, const map st = st->lexNext(); tmpStatement->deleteStmt(); } + else if (st->variant() == STMTFN_STAT) + { + auto stat = st; + st = st->lexNext(); + macro.push_back(stat->extractStmt()); + } else st = st->lexNext(); } @@ -253,6 +282,18 @@ static map FunctionImplicitCheck(SgStatement* function, const map auto declList = makeDeclaration(varsWithoutDeclConst, NULL); for (auto& decl : declList) insertPlace->insertStmtAfter(*decl, *function); + + if (macro.size()) + { + while (!isSgExecutableStatement(insertPlace) && insertPlace != NULL) + insertPlace = insertPlace->lexNext(); + + if (insertPlace == NULL) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + for (auto& elem : macro) + insertPlace->insertStmtBefore(*elem, *function); + } } for (auto& s : toRename) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp index 2b41882..ae78c98 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/SgUtils.cpp @@ -1002,12 +1002,14 @@ static bool findSymbol(SgExpression *declLst, const string &toFind) if (ex->symbol()->identifier() == toFind) return true; } + else + { + if (ex->lhs()) + exs.push(ex->lhs()); - if (ex->lhs()) - exs.push(ex->lhs()); - - if (ex->rhs()) - exs.push(ex->rhs()); + if (ex->rhs()) + exs.push(ex->rhs()); + } } return false; } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index f45280d..ee7049e 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 "2336" +#define VERSION_SPF "2337"