Changes in src/InitTweak/FixInitNew.cpp [fb4dc28:e563edf]
- File:
-
- 1 edited
-
src/InitTweak/FixInitNew.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/FixInitNew.cpp
rfb4dc28 re563edf 14 14 #include <utility> // for pair 15 15 16 #include "AST/DeclReplacer.hpp"17 #include "AST/Expr.hpp"18 16 #include "AST/Inspect.hpp" // for getFunction, getPointerBase, g... 19 #include "AST/Node.hpp"20 #include "AST/Pass.hpp"21 #include "AST/Print.hpp"22 #include "AST/SymbolTable.hpp"23 #include "AST/Type.hpp"24 17 #include "CodeGen/GenType.h" // for genPrettyType 25 18 #include "CodeGen/OperatorTable.h" 19 #include "Common/CodeLocationTools.hpp" 26 20 #include "Common/PassVisitor.h" // for PassVisitor, WithStmtsToAdd 27 21 #include "Common/SemanticError.h" // for SemanticError 28 #include "Common/ToString.hpp" // for toCString29 22 #include "Common/UniqueName.h" // for UniqueName 23 #include "Common/utility.h" // for CodeLocation, ValueGuard, toSt... 30 24 #include "FixGlobalInit.h" // for fixGlobalInit 31 25 #include "GenInit.h" // for genCtorDtor … … 34 28 #include "ResolvExpr/Unify.h" // for typesCompatible 35 29 #include "SymTab/Autogen.h" // for genImplicitCall 36 #include "SymTab/GenImplicitCall.hpp" // for genImplicitCall37 30 #include "SymTab/Indexer.h" // for Indexer 38 31 #include "SymTab/Mangler.h" // for Mangler … … 52 45 #include "Validate/FindSpecialDecls.h" // for dtorStmt, dtorStructDestroy 53 46 47 #include "AST/Expr.hpp" 48 #include "AST/Node.hpp" 49 #include "AST/Pass.hpp" 50 #include "AST/Print.hpp" 51 #include "AST/SymbolTable.hpp" 52 #include "AST/Type.hpp" 53 #include "AST/DeclReplacer.hpp" 54 54 55 extern bool ctordtorp; // print all debug 55 56 extern bool ctorp; // print ctor debug … … 62 63 namespace InitTweak { 63 64 namespace { 64 65 // Shallow copy the pointer list for return.66 std::vector<ast::ptr<ast::TypeDecl>> getGenericParams( const ast::Type * t ) {67 if ( auto inst = dynamic_cast<const ast::StructInstType *>( t ) ) {68 return inst->base->params;69 }70 if ( auto inst = dynamic_cast<const ast::UnionInstType *>( t ) ) {71 return inst->base->params;72 }73 return {};74 }75 76 /// Given type T, generate type of default ctor/dtor, i.e. function type void (*) (T &).77 ast::FunctionDecl * genDefaultFunc(78 const CodeLocation loc,79 const std::string fname,80 const ast::Type * paramType,81 bool maybePolymorphic = true) {82 std::vector<ast::ptr<ast::TypeDecl>> typeParams;83 if ( maybePolymorphic ) typeParams = getGenericParams( paramType );84 auto dstParam = new ast::ObjectDecl( loc,85 "_dst",86 new ast::ReferenceType( paramType ),87 nullptr,88 {},89 ast::Linkage::Cforall90 );91 return new ast::FunctionDecl( loc,92 fname,93 std::move(typeParams),94 {dstParam},95 {},96 new ast::CompoundStmt(loc),97 {},98 ast::Linkage::Cforall99 );100 }101 102 65 struct SelfAssignChecker { 103 66 void previsit( const ast::ApplicationExpr * appExpr ); … … 144 107 private: 145 108 /// hack to implement WithTypeSubstitution while conforming to mutation safety. 146 ast::TypeSubstitution * env = nullptr;147 bool envModified = false;109 ast::TypeSubstitution * env; 110 bool envModified; 148 111 }; 149 112 … … 158 121 void previsit( const ast::FunctionDecl * ) { visit_children = false; } 159 122 160 protected:123 protected: 161 124 ObjectSet curVars; 162 125 }; … … 239 202 240 203 SemanticErrorException errors; 241 private:204 private: 242 205 template< typename... Params > 243 206 void emit( CodeLocation, const Params &... params ); … … 325 288 static UniqueName dtorNamer( "__cleanup_dtor" ); 326 289 std::string name = dtorNamer.newName(); 327 ast::FunctionDecl * dtorFunc = genDefaultFunc( loc, name, objDecl->type->stripReferences(), false );290 ast::FunctionDecl * dtorFunc = SymTab::genDefaultFunc( loc, name, objDecl->type->stripReferences(), false ); 328 291 stmtsToAdd.push_back( new ast::DeclStmt(loc, dtorFunc ) ); 329 292 … … 559 522 { 560 523 static UniqueName tempNamer("_tmp_cp"); 524 assert( env ); 561 525 const CodeLocation loc = impCpCtorExpr->location; 562 526 // CP_CTOR_PRINT( std::cerr << "Type Substitution: " << *env << std::endl; ) … … 570 534 571 535 // xxx - this originally mutates arg->result in place. is it correct? 572 assert( env );573 536 result = env->applyFree( result.get() ).node; 574 537 auto mutResult = result.get_and_mutate(); … … 1117 1080 void InsertDtors::previsit( const ast::BranchStmt * stmt ) { 1118 1081 switch( stmt->kind ) { 1119 case ast::BranchStmt::Continue:1120 case ast::BranchStmt::Break:1082 case ast::BranchStmt::Continue: 1083 case ast::BranchStmt::Break: 1121 1084 // could optimize the break/continue case, because the S_L-S_G check is unnecessary (this set should 1122 1085 // always be empty), but it serves as a small sanity check. 1123 case ast::BranchStmt::Goto:1086 case ast::BranchStmt::Goto: 1124 1087 handleGoto( stmt ); 1125 1088 break; 1126 default:1089 default: 1127 1090 assert( false ); 1128 1091 } // switch … … 1340 1303 } 1341 1304 1305 template< typename Visitor, typename... Params > 1306 void error( Visitor & v, CodeLocation loc, const Params &... params ) { 1307 SemanticErrorException err( loc, toString( params... ) ); 1308 v.errors.append( err ); 1309 } 1310 1342 1311 template< typename... Params > 1343 1312 void GenStructMemberCalls::emit( CodeLocation loc, const Params &... params ) { 1344 SemanticErrorException err( loc, toString( params... ) ); 1345 errors.append( err ); 1313 // toggle warnings vs. errors here. 1314 // warn( params... ); 1315 error( *this, loc, params... ); 1346 1316 } 1347 1317 … … 1349 1319 // xxx - functions returning ast::ptr seems wrong... 1350 1320 auto res = ResolvExpr::findVoidExpression( untypedExpr, { symtab, transUnit().global } ); 1351 return res.release(); 1321 // Fix CodeLocation (at least until resolver is fixed). 1322 auto fix = localFillCodeLocations( untypedExpr->location, res.release() ); 1323 return strict_dynamic_cast<const ast::Expr *>( fix ); 1352 1324 } 1353 1325
Note:
See TracChangeset
for help on using the changeset viewer.