virtual void visit(SgNode* node) { if (isSgBasicBlock(node)) { SgBasicBlock* c = isSgBasicBlock(node); SgStatementPtrList newStatements; for (SgStatementPtrList::const_iterator i = c->get_statements().begin(); i != c->get_statements().end(); ++i) { if (isSgBasicBlock(*i)) { SgBasicBlock* c2 = isSgBasicBlock(*i); const SgStatementPtrList& c2Stmts = c2->get_statements(); // We need to prevent a declaration from immediately following a label, as that is illegal if (!newStatements.empty() && isSgLabelStatement(newStatements.back()) && !c2Stmts.empty() && isSgVariableDeclaration(c2Stmts.front())) { newStatements.push_back(SageBuilder::buildExprStatement(SageBuilder::buildNullExpression())); } newStatements.insert(newStatements.end(), isSgBasicBlock(*i)->get_statements().begin(), isSgBasicBlock(*i)->get_statements().end()); } else { if (!newStatements.empty() && isSgLabelStatement(newStatements.back()) && isSgVariableDeclaration(*i)) { newStatements.push_back(SageBuilder::buildExprStatement(SageBuilder::buildNullExpression())); } newStatements.push_back(*i); } } if (!newStatements.empty() && isSgLabelStatement(newStatements.back())) { // Prevent block from ending with a label newStatements.push_back(SageBuilder::buildExprStatement(SageBuilder::buildNullExpression())); } for (SgStatementPtrList::const_iterator i = newStatements.begin(); i != newStatements.end(); ++i) { (*i)->set_parent(c); } c->get_statements() = newStatements; c->get_symbol_table()->get_table()->clear(); SageInterface::rebuildSymbolTable(c); } }
/** * handling error occured due to failed assertion * this error handler only works during parser phase since it uses * Token_t to know the line number * TODO: we need to make this function more general **/ void fortran_error_handler(int signum) { // get the current filename std::string sFilename = getCurrentFilename(); if (sFilename.size()==0) { fprintf(stderr, "ERROR while parsing the source code\n"); } else { SgScopeStatement* scope = astScopeStack.front(); SgStatement* lastStatement = scope; SgStatementPtrList statementList = scope->generateStatementList(); if (statementList.empty() == false) { lastStatement = statementList.back(); } int lineNumberOfLastStatement = (astScopeStack.empty() == false) ? lastStatement->get_file_info()->get_line() : 0; // get the latest token parsed if (lineNumberOfLastStatement > 0) std::cerr <<"FATAL ERROR in file "<<sFilename<<":"<<lineNumberOfLastStatement<<std::endl; else std::cerr <<"FATAL ERROR while parsing "<<sFilename<<std::endl; } fflush(NULL); // flush all stdio fortran_error_handler_end(); exit(-1); }