- Timestamp:
- Oct 7, 2020, 4:31:43 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 848439f
- Parents:
- ae2c27a (diff), 597c5d18 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 6 added
- 34 edited
-
AST/Convert.cpp (modified) (7 diffs)
-
AST/Decl.hpp (modified) (1 diff)
-
AST/ForallSubstitutor.hpp (modified) (2 diffs)
-
AST/Fwd.hpp (modified) (1 diff)
-
AST/GenericSubstitution.cpp (modified) (1 diff)
-
AST/Node.cpp (modified) (1 diff)
-
AST/Pass.hpp (modified) (6 diffs)
-
AST/Pass.impl.hpp (modified) (4 diffs)
-
AST/Pass.proto.hpp (modified) (2 diffs)
-
AST/Print.cpp (modified) (1 diff)
-
AST/SymbolTable.cpp (modified) (5 diffs)
-
AST/SymbolTable.hpp (modified) (1 diff)
-
AST/Type.cpp (modified) (6 diffs)
-
AST/Type.hpp (modified) (10 diffs)
-
AST/TypeSubstitution.cpp (modified) (1 diff)
-
AST/TypeSubstitution.hpp (modified) (1 diff)
-
Common/Examine.cc (added)
-
Common/Examine.h (added)
-
Common/Stats/ResolveTime.cc (added)
-
Common/Stats/ResolveTime.h (added)
-
Common/Stats/Stats.cc (modified) (2 diffs)
-
Common/module.mk (modified) (2 diffs)
-
Concurrency/Keywords.cc (modified) (17 diffs)
-
GenPoly/InstantiateGeneric.cc (modified) (2 diffs)
-
InitTweak/InitTweak.cc (modified) (1 diff)
-
Parser/lex.ll (modified) (3 diffs)
-
Parser/parser.yy (modified) (9 diffs)
-
ResolvExpr/CandidateFinder.cpp (modified) (5 diffs)
-
ResolvExpr/ConversionCost.cc (modified) (2 diffs)
-
ResolvExpr/ConversionCost.h (modified) (1 diff)
-
ResolvExpr/CurrentObject.cc (modified) (5 diffs)
-
ResolvExpr/Resolver.cc (modified) (9 diffs)
-
ResolvExpr/SatisfyAssertions.cpp (modified) (1 diff)
-
ResolvExpr/SpecCost.cc (modified) (1 diff)
-
ResolvExpr/Unify.cc (modified) (12 diffs)
-
SymTab/Mangler.cc (modified) (2 diffs)
-
SymTab/Validate.cc (modified) (6 diffs)
-
Virtual/Tables.cc (added)
-
Virtual/Tables.h (added)
-
Virtual/module.mk (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
rae2c27a rc76bd34 177 177 const ast::DeclWithType * visit( const ast::FunctionDecl * node ) override final { 178 178 if ( inCache( node ) ) return nullptr; 179 180 // function decl contains real variables that the type must use. 181 // the structural change means function type in and out of decl 182 // must be handled **differently** on convert back to old. 183 auto ftype = new FunctionType( 184 cv(node->type), 185 (bool)node->type->isVarArgs 186 ); 187 ftype->returnVals = get<DeclarationWithType>().acceptL(node->returns); 188 ftype->parameters = get<DeclarationWithType>().acceptL(node->params); 189 190 ftype->forall = get<TypeDecl>().acceptL( node->type->forall ); 191 192 visitType(node->type, ftype); 193 179 194 auto decl = new FunctionDecl( 180 195 node->name, 181 196 Type::StorageClasses( node->storage.val ), 182 197 LinkageSpec::Spec( node->linkage.val ), 183 get<FunctionType>().accept1( node->type ), 198 ftype, 199 //get<FunctionType>().accept1( node->type ), 184 200 {}, 185 201 get<Attribute>().acceptL( node->attributes ), … … 1152 1168 1153 1169 const ast::Type * visit( const ast::FunctionType * node ) override final { 1170 static std::string dummy_paramvar_prefix = "__param_"; 1171 static std::string dummy_returnvar_prefix = "__retval_"; 1172 1154 1173 auto ty = new FunctionType { 1155 1174 cv( node ), 1156 1175 (bool)node->isVarArgs 1157 1176 }; 1158 ty->returnVals = get<DeclarationWithType>().acceptL( node->returns ); 1159 ty->parameters = get<DeclarationWithType>().acceptL( node->params ); 1177 auto returns = get<Type>().acceptL(node->returns); 1178 auto params = get<Type>().acceptL(node->params); 1179 1180 int ret_index = 0; 1181 for (auto t: returns) { 1182 // xxx - LinkageSpec shouldn't matter but needs to be something 1183 ObjectDecl * dummy = new ObjectDecl(dummy_returnvar_prefix + std::to_string(ret_index++), {}, LinkageSpec::C, nullptr, t, nullptr); 1184 ty->returnVals.push_back(dummy); 1185 } 1186 int param_index = 0; 1187 for (auto t: params) { 1188 ObjectDecl * dummy = new ObjectDecl(dummy_paramvar_prefix + std::to_string(param_index++), {}, LinkageSpec::C, nullptr, t, nullptr); 1189 ty->parameters.push_back(dummy); 1190 } 1191 1192 // ty->returnVals = get<DeclarationWithType>().acceptL( node->returns ); 1193 // ty->parameters = get<DeclarationWithType>().acceptL( node->params ); 1160 1194 ty->forall = get<TypeDecl>().acceptL( node->forall ); 1161 1195 return visitType( node, ty ); 1162 1196 } 1163 1197 1164 const ast::Type * postvisit( const ast:: ReferenceToType * old, ReferenceToType * ty ) {1198 const ast::Type * postvisit( const ast::BaseInstType * old, ReferenceToType * ty ) { 1165 1199 ty->forall = get<TypeDecl>().acceptL( old->forall ); 1166 1200 ty->parameters = get<Expression>().acceptL( old->params ); … … 1374 1408 ast::Node * node = nullptr; 1375 1409 /// cache of nodes that might be referenced by readonly<> for de-duplication 1376 std::unordered_map< const BaseSyntaxNode *, ast::Node * > cache = {}; 1410 /// in case that some nodes are dropped by conversion (due to possible structural change) 1411 /// use smart pointers in cache value to prevent accidental invalidation. 1412 /// at conversion stage, all created nodes are guaranteed to be unique, therefore 1413 /// const_casting out of smart pointers is permitted. 1414 std::unordered_map< const BaseSyntaxNode *, ast::ptr<ast::Node> > cache = {}; 1377 1415 1378 1416 // Local Utilities: … … 1447 1485 auto it = cache.find( old ); 1448 1486 if ( it == cache.end() ) return false; 1449 node = it->second;1487 node = const_cast<ast::Node *>(it->second.get()); 1450 1488 return true; 1451 1489 } … … 1486 1524 virtual void visit( const FunctionDecl * old ) override final { 1487 1525 if ( inCache( old ) ) return; 1526 auto paramVars = GET_ACCEPT_V(type->parameters, DeclWithType); 1527 auto returnVars = GET_ACCEPT_V(type->returnVals, DeclWithType); 1528 auto forall = GET_ACCEPT_V(type->forall, TypeDecl); 1529 1530 // function type is now derived from parameter decls instead of storing them 1531 auto ftype = new ast::FunctionType((ast::ArgumentFlag)old->type->isVarArgs, cv(old->type)); 1532 ftype->params.reserve(paramVars.size()); 1533 ftype->returns.reserve(returnVars.size()); 1534 1535 for (auto & v: paramVars) { 1536 ftype->params.emplace_back(v->get_type()); 1537 } 1538 for (auto & v: returnVars) { 1539 ftype->returns.emplace_back(v->get_type()); 1540 } 1541 ftype->forall = std::move(forall); 1542 visitType(old->type, ftype); 1543 1488 1544 auto decl = new ast::FunctionDecl{ 1489 1545 old->location, 1490 1546 old->name, 1491 GET_ACCEPT_1(type, FunctionType), 1547 // GET_ACCEPT_1(type, FunctionType), 1548 std::move(paramVars), 1549 std::move(returnVars), 1492 1550 {}, 1493 1551 { old->storageClasses.val }, … … 1496 1554 { old->get_funcSpec().val } 1497 1555 }; 1556 1557 decl->type = ftype; 1498 1558 cache.emplace( old, decl ); 1559 1499 1560 decl->withExprs = GET_ACCEPT_V(withExprs, Expr); 1500 1561 decl->stmts = GET_ACCEPT_1(statements, CompoundStmt); … … 2515 2576 cv( old ) 2516 2577 }; 2517 ty->returns = GET_ACCEPT_V( returnVals, DeclWithType ); 2518 ty->params = GET_ACCEPT_V( parameters, DeclWithType ); 2578 auto returnVars = GET_ACCEPT_V(returnVals, DeclWithType); 2579 auto paramVars = GET_ACCEPT_V(parameters, DeclWithType); 2580 // ty->returns = GET_ACCEPT_V( returnVals, DeclWithType ); 2581 // ty->params = GET_ACCEPT_V( parameters, DeclWithType ); 2582 for (auto & v: returnVars) { 2583 ty->returns.emplace_back(v->get_type()); 2584 } 2585 for (auto & v: paramVars) { 2586 ty->params.emplace_back(v->get_type()); 2587 } 2519 2588 ty->forall = GET_ACCEPT_V( forall, TypeDecl ); 2520 2589 visitType( old, ty ); 2521 2590 } 2522 2591 2523 void postvisit( const ReferenceToType * old, ast:: ReferenceToType * ty ) {2592 void postvisit( const ReferenceToType * old, ast::BaseInstType * ty ) { 2524 2593 ty->forall = GET_ACCEPT_V( forall, TypeDecl ); 2525 2594 ty->params = GET_ACCEPT_V( parameters, Expr ); -
src/AST/Decl.hpp
rae2c27a rc76bd34 124 124 class FunctionDecl : public DeclWithType { 125 125 public: 126 std::vector<ptr<DeclWithType>> params; 127 std::vector<ptr<DeclWithType>> returns; 128 // declared type, derived from parameter declarations 126 129 ptr<FunctionType> type; 127 130 ptr<CompoundStmt> stmts; 128 131 std::vector< ptr<Expr> > withExprs; 129 132 130 FunctionDecl( const CodeLocation & loc, const std::string & name, FunctionType * type, 133 FunctionDecl( const CodeLocation & loc, const std::string & name, 134 std::vector<ptr<DeclWithType>>&& params, std::vector<ptr<DeclWithType>>&& returns, 131 135 CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C, 132 136 std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}) 133 : DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), type( type),137 : DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), params(std::move(params)), returns(std::move(returns)), 134 138 stmts( stmts ) {} 135 139 -
src/AST/ForallSubstitutor.hpp
rae2c27a rc76bd34 33 33 } 34 34 35 template<typename node_t > 36 std::vector<ptr<node_t>> operator() (const std::vector<ptr<node_t>> & o) { 37 std::vector<ptr<node_t>> n; 38 n.reserve(o.size()); 39 for (const node_t * d : o) { n.emplace_back(d->accept(*visitor)); } 40 return n; 41 } 42 43 /* 44 35 45 /// Substitute parameter/return type 36 46 std::vector< ptr< DeclWithType > > operator() ( const std::vector< ptr< DeclWithType > > & o ) { … … 48 58 return n; 49 59 } 60 61 */ 50 62 }; 51 63 -
src/AST/Fwd.hpp
rae2c27a rc76bd34 107 107 class QualifiedType; 108 108 class FunctionType; 109 class ReferenceToType;109 class BaseInstType; 110 110 template<typename decl_t> class SueInstType; 111 111 using StructInstType = SueInstType<StructDecl>; -
src/AST/GenericSubstitution.cpp
rae2c27a rc76bd34 42 42 private: 43 43 // make substitution for generic type 44 void makeSub( const ReferenceToType * ty ) {44 void makeSub( const BaseInstType * ty ) { 45 45 visit_children = false; 46 46 const AggregateDecl * aggr = ty->aggr(); -
src/AST/Node.cpp
rae2c27a rc76bd34 266 266 template class ast::ptr_base< ast::FunctionType, ast::Node::ref_type::weak >; 267 267 template class ast::ptr_base< ast::FunctionType, ast::Node::ref_type::strong >; 268 template class ast::ptr_base< ast:: ReferenceToType, ast::Node::ref_type::weak >;269 template class ast::ptr_base< ast:: ReferenceToType, ast::Node::ref_type::strong >;268 template class ast::ptr_base< ast::BaseInstType, ast::Node::ref_type::weak >; 269 template class ast::ptr_base< ast::BaseInstType, ast::Node::ref_type::strong >; 270 270 template class ast::ptr_base< ast::StructInstType, ast::Node::ref_type::weak >; 271 271 template class ast::ptr_base< ast::StructInstType, ast::Node::ref_type::strong >; -
src/AST/Pass.hpp
rae2c27a rc76bd34 50 50 // | PureVisitor - makes the visitor pure, it never modifies nodes in place and always 51 51 // clones nodes it needs to make changes to 52 // | With TypeSubstitution - provides polymorphic const TypeSubstitution * envfor the52 // | WithConstTypeSubstitution - provides polymorphic const TypeSubstitution * typeSubs for the 53 53 // current expression 54 54 // | WithStmtsToAdd - provides the ability to insert statements before or after the current … … 67 67 // | WithSymbolTable - provides symbol table functionality 68 68 // | WithForallSubstitutor - maintains links between TypeInstType and TypeDecl under mutation 69 // 70 // Other Special Members: 71 // | result - Either a method that takes no parameters or a field. If a method (or 72 // callable field) get_result calls it, otherwise the value is returned. 69 73 //------------------------------------------------------------------------------------------------- 70 74 template< typename core_t > … … 89 93 virtual ~Pass() = default; 90 94 95 /// Storage for the actual pass. 96 core_t core; 97 98 /// If the core defines a result, call it if possible, otherwise return it. 99 inline auto get_result() -> decltype( __pass::get_result( core, '0' ) ) { 100 return __pass::get_result( core, '0' ); 101 } 102 91 103 /// Construct and run a pass on a translation unit. 92 104 template< typename... Args > … … 96 108 } 97 109 110 /// Contruct and run a pass on a pointer to extract a value. 111 template< typename node_type, typename... Args > 112 static auto read( node_type const * node, Args&&... args ) { 113 Pass<core_t> visitor( std::forward<Args>( args )... ); 114 node_type const * temp = node->accept( visitor ); 115 assert( temp == node ); 116 return visitor.get_result(); 117 } 118 119 // Versions of the above for older compilers. 98 120 template< typename... Args > 99 121 static void run( std::list< ptr<Decl> > & decls ) { … … 102 124 } 103 125 104 /// Storage for the actual pass 105 core_t core; 126 template< typename node_type, typename... Args > 127 static auto read( node_type const * node ) { 128 Pass<core_t> visitor; 129 node_type const * temp = node->accept( visitor ); 130 assert( temp == node ); 131 return visitor.get_result(); 132 } 106 133 107 134 /// Visit function declarations … … 267 294 //------------------------------------------------------------------------------------------------- 268 295 269 /// Keep track of the polymorphic const TypeSubstitution * env for the current expression270 271 296 /// If used the visitor will always clone nodes. 272 297 struct PureVisitor {}; 273 298 299 /// Keep track of the polymorphic const TypeSubstitution * typeSubs for the current expression. 274 300 struct WithConstTypeSubstitution { 275 const TypeSubstitution * env= nullptr;301 const TypeSubstitution * typeSubs = nullptr; 276 302 }; 277 303 -
src/AST/Pass.impl.hpp
rae2c27a rc76bd34 154 154 __pedantic_pass_assert( expr ); 155 155 156 const ast::TypeSubstitution ** env_ptr = __pass::env( core, 0);157 if ( env_ptr && expr->env ) {158 * env_ptr = expr->env;156 const ast::TypeSubstitution ** typeSubs_ptr = __pass::typeSubs( core, 0 ); 157 if ( typeSubs_ptr && expr->env ) { 158 *typeSubs_ptr = expr->env; 159 159 } 160 160 … … 177 177 178 178 // These may be modified by subnode but most be restored once we exit this statemnet. 179 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass:: env( core, 0) );179 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass::typeSubs( core, 0 ) ); 180 180 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before ); 181 181 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after ); … … 465 465 __pass::symtab::addId( core, 0, func ); 466 466 VISIT( 467 // parameter declarations are now directly here 468 maybe_accept( node, &FunctionDecl::params ); 469 maybe_accept( node, &FunctionDecl::returns ); 470 // foralls are still in function type 467 471 maybe_accept( node, &FunctionDecl::type ); 468 472 // function body needs to have the same scope as parameters - CompoundStmt will not enter … … 1488 1492 1489 1493 // These may be modified by subnode but most be restored once we exit this statemnet. 1490 ValueGuardPtr< const ast::TypeSubstitution * > __old_env( __pass:: env( core, 0) );1494 ValueGuardPtr< const ast::TypeSubstitution * > __old_env( __pass::typeSubs( core, 0 ) ); 1491 1495 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before ); 1492 1496 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after ); -
src/AST/Pass.proto.hpp
rae2c27a rc76bd34 236 236 237 237 // List of fields and their expected types 238 FIELD_PTR( env, const ast::TypeSubstitution * )238 FIELD_PTR( typeSubs, const ast::TypeSubstitution * ) 239 239 FIELD_PTR( stmtsToAddBefore, std::list< ast::ptr< ast::Stmt > > ) 240 240 FIELD_PTR( stmtsToAddAfter , std::list< ast::ptr< ast::Stmt > > ) … … 421 421 422 422 } // namespace forall 423 424 template<typename core_t> 425 static inline auto get_result( core_t & core, char ) -> decltype( core.result() ) { 426 return core.result(); 427 } 428 429 template<typename core_t> 430 static inline auto get_result( core_t & core, int ) -> decltype( core.result ) { 431 return core.result; 432 } 433 434 template<typename core_t> 435 static inline void get_result( core_t &, long ) {} 423 436 } // namespace __pass 424 437 } // namespace ast -
src/AST/Print.cpp
rae2c27a rc76bd34 270 270 } 271 271 272 void preprint( const ast:: ReferenceToType * node ) {272 void preprint( const ast::BaseInstType * node ) { 273 273 print( node->forall ); 274 274 print( node->attributes ); -
src/AST/SymbolTable.cpp
rae2c27a rc76bd34 313 313 if ( ! expr->result ) continue; 314 314 const Type * resTy = expr->result->stripReferences(); 315 auto aggrType = dynamic_cast< const ReferenceToType * >( resTy );315 auto aggrType = dynamic_cast< const BaseInstType * >( resTy ); 316 316 assertf( aggrType, "WithStmt expr has non-aggregate type: %s", 317 317 toString( expr->result ).c_str() ); … … 335 335 } 336 336 337 /* 337 338 void SymbolTable::addFunctionType( const FunctionType * ftype ) { 338 339 addTypes( ftype->forall ); … … 340 341 addIds( ftype->params ); 341 342 } 343 */ 342 344 343 345 void SymbolTable::lazyInitScope() { … … 368 370 assert( ! params.empty() ); 369 371 // use base type of pointer, so that qualifiers on the pointer type aren't considered. 370 const Type * base = InitTweak::getPointerBase( params.front() ->get_type());372 const Type * base = InitTweak::getPointerBase( params.front() ); 371 373 assert( base ); 372 374 return Mangle::mangle( base ); … … 654 656 if ( dwt->name == "" ) { 655 657 const Type * t = dwt->get_type()->stripReferences(); 656 if ( auto rty = dynamic_cast<const ReferenceToType *>( t ) ) {658 if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) { 657 659 if ( ! dynamic_cast<const StructInstType *>(rty) 658 660 && ! dynamic_cast<const UnionInstType *>(rty) ) continue; -
src/AST/SymbolTable.hpp
rae2c27a rc76bd34 145 145 146 146 /// convenience function for adding all of the declarations in a function type to the indexer 147 void addFunctionType( const FunctionType * ftype );147 // void addFunctionType( const FunctionType * ftype ); 148 148 149 149 private: -
src/AST/Type.cpp
rae2c27a rc76bd34 102 102 // --- FunctionType 103 103 104 104 105 FunctionType::FunctionType( const FunctionType & o ) 105 106 : ParameterizedType( o.qualifiers, copy( o.attributes ) ), returns(), params(), … … 112 113 113 114 namespace { 114 bool containsTtype( const std::vector<ptr< DeclWithType>> & l ) {115 bool containsTtype( const std::vector<ptr<Type>> & l ) { 115 116 if ( ! l.empty() ) { 116 return Tuples::isTtype( l.back() ->get_type());117 return Tuples::isTtype( l.back() ); 117 118 } 118 119 return false; … … 124 125 } 125 126 126 // --- ReferenceToType127 128 void ReferenceToType::initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub ) {127 // --- BaseInstType 128 129 void BaseInstType::initWithSub( const BaseInstType & o, Pass< ForallSubstitutor > & sub ) { 129 130 ParameterizedType::initWithSub( o, sub ); // initialize substitution 130 131 params = sub.core( o.params ); // apply to parameters 131 132 } 132 133 133 ReferenceToType::ReferenceToType( const ReferenceToType & o )134 BaseInstType::BaseInstType( const BaseInstType & o ) 134 135 : ParameterizedType( o.qualifiers, copy( o.attributes ) ), params(), name( o.name ), 135 136 hoistType( o.hoistType ) { … … 138 139 } 139 140 140 std::vector<readonly<Decl>> ReferenceToType::lookup( const std::string& name ) const {141 std::vector<readonly<Decl>> BaseInstType::lookup( const std::string& name ) const { 141 142 assertf( aggr(), "Must have aggregate to perform lookup" ); 142 143 … … 153 154 SueInstType<decl_t>::SueInstType( 154 155 const decl_t * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 155 : ReferenceToType( b->name, q, move(as) ), base( b ) {}156 : BaseInstType( b->name, q, move(as) ), base( b ) {} 156 157 157 158 template<typename decl_t> … … 168 169 TraitInstType::TraitInstType( 169 170 const TraitDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as ) 170 : ReferenceToType( b->name, q, move(as) ), base( b ) {}171 : BaseInstType( b->name, q, move(as) ), base( b ) {} 171 172 172 173 // --- TypeInstType 173 174 174 175 TypeInstType::TypeInstType( const TypeInstType & o ) 175 : ReferenceToType( o.name, o.qualifiers, copy( o.attributes ) ), base(), kind( o.kind ) {176 : BaseInstType( o.name, o.qualifiers, copy( o.attributes ) ), base(), kind( o.kind ) { 176 177 Pass< ForallSubstitutor > sub; 177 178 initWithSub( o, sub ); // initialize substitution -
src/AST/Type.hpp
rae2c27a rc76bd34 302 302 class FunctionType final : public ParameterizedType { 303 303 public: 304 std::vector<ptr<DeclWithType>> returns; 305 std::vector<ptr<DeclWithType>> params; 304 // std::vector<ptr<DeclWithType>> returns; 305 // std::vector<ptr<DeclWithType>> params; 306 307 std::vector<ptr<Type>> returns; 308 std::vector<ptr<Type>> params; 306 309 307 310 /// Does the function accept a variable number of arguments following the arguments specified … … 329 332 330 333 /// base class for types that refer to types declared elsewhere (aggregates and typedefs) 331 class ReferenceToType : public ParameterizedType {334 class BaseInstType : public ParameterizedType { 332 335 protected: 333 336 /// Initializes forall and parameters based on substitutor 334 void initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub );337 void initWithSub( const BaseInstType & o, Pass< ForallSubstitutor > & sub ); 335 338 public: 336 339 std::vector<ptr<Expr>> params; … … 338 341 bool hoistType = false; 339 342 340 ReferenceToType(343 BaseInstType( 341 344 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 342 345 : ParameterizedType(q, std::move(as)), params(), name(n) {} 343 346 344 ReferenceToType( const ReferenceToType & o );347 BaseInstType( const BaseInstType & o ); 345 348 346 349 /// Gets aggregate declaration this type refers to … … 350 353 351 354 private: 352 virtual ReferenceToType * clone() const override = 0;355 virtual BaseInstType * clone() const override = 0; 353 356 MUTATE_FRIEND 354 357 }; … … 356 359 // Common implementation for the SUE instance types. Not to be used directly. 357 360 template<typename decl_t> 358 class SueInstType final : public ReferenceToType {361 class SueInstType final : public BaseInstType { 359 362 public: 360 363 using base_type = decl_t; … … 363 366 SueInstType( 364 367 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 365 : ReferenceToType( n, q, std::move(as) ), base() {}368 : BaseInstType( n, q, std::move(as) ), base() {} 366 369 367 370 SueInstType( … … 388 391 389 392 /// An instance of a trait type. 390 class TraitInstType final : public ReferenceToType {393 class TraitInstType final : public BaseInstType { 391 394 public: 392 395 readonly<TraitDecl> base; … … 394 397 TraitInstType( 395 398 const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ) 396 : ReferenceToType( n, q, std::move(as) ), base() {}399 : BaseInstType( n, q, std::move(as) ), base() {} 397 400 398 401 TraitInstType( … … 411 414 412 415 /// instance of named type alias (typedef or variable) 413 class TypeInstType final : public ReferenceToType {416 class TypeInstType final : public BaseInstType { 414 417 public: 415 418 readonly<TypeDecl> base; … … 419 422 const std::string& n, const TypeDecl * b, CV::Qualifiers q = {}, 420 423 std::vector<ptr<Attribute>> && as = {} ) 421 : ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}424 : BaseInstType( n, q, std::move(as) ), base( b ), kind( b->kind ) {} 422 425 TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {}, 423 426 std::vector<ptr<Attribute>> && as = {} ) 424 : ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {}427 : BaseInstType( n, q, std::move(as) ), base(), kind( k ) {} 425 428 426 429 TypeInstType( const TypeInstType & o ); -
src/AST/TypeSubstitution.cpp
rae2c27a rc76bd34 176 176 } 177 177 178 void TypeSubstitution::Substituter::handleAggregateType( const ReferenceToType * type ) {178 void TypeSubstitution::Substituter::handleAggregateType( const BaseInstType * type ) { 179 179 GuardValue( boundVars ); 180 180 // bind type variables from forall-qualifiers -
src/AST/TypeSubstitution.hpp
rae2c27a rc76bd34 169 169 void previsit( const ParameterizedType * type ); 170 170 /// Records type variable bindings from forall-statements and instantiations of generic types 171 void handleAggregateType( const ReferenceToType * type );171 void handleAggregateType( const BaseInstType * type ); 172 172 173 173 void previsit( const StructInstType * aggregateUseType ); -
src/Common/Stats/Stats.cc
rae2c27a rc76bd34 35 35 } 36 36 37 namespace ResolveTime { 38 bool enabled = false; 39 } 40 37 41 struct { 38 42 const char * const opt; … … 43 47 { "heap" , Heap::enabled }, 44 48 { "time" , Time::enabled }, 49 { "resolve" , ResolveTime::enabled }, 45 50 }; 46 51 -
src/Common/module.mk
rae2c27a rc76bd34 22 22 Common/ErrorObjects.h \ 23 23 Common/Eval.cc \ 24 Common/Examine.cc \ 25 Common/Examine.h \ 24 26 Common/FilterCombos.h \ 25 27 Common/Indenter.h \ … … 38 40 Common/Stats/Heap.cc \ 39 41 Common/Stats/Heap.h \ 42 Common/Stats/ResolveTime.cc \ 43 Common/Stats/ResolveTime.h \ 40 44 Common/Stats/Stats.cc \ 41 45 Common/Stats/Time.cc \ -
src/Concurrency/Keywords.cc
rae2c27a rc76bd34 19 19 #include <string> // for string, operator== 20 20 21 #include <iostream> 22 23 #include "Common/Examine.h" // for isMainFor 21 24 #include "Common/PassVisitor.h" // for PassVisitor 22 25 #include "Common/SemanticError.h" // for SemanticError … … 34 37 #include "SynTree/Type.h" // for StructInstType, Type, PointerType 35 38 #include "SynTree/Visitor.h" // for Visitor, acceptAll 39 #include "Virtual/Tables.h" 36 40 37 41 class Attribute; 38 42 39 43 namespace Concurrency { 44 inline static std::string getVTableName( std::string const & exception_name ) { 45 return exception_name.empty() ? std::string() : Virtual::vtableTypeName(exception_name); 46 } 47 40 48 //============================================================================================= 41 49 // Pass declarations … … 54 62 public: 55 63 56 ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error, bool needs_main, AggregateDecl::Aggregate cast_target ) : 57 type_name( type_name ), field_name( field_name ), getter_name( getter_name ), context_error( context_error ), needs_main( needs_main ), cast_target( cast_target ) {} 64 ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, 65 std::string&& getter_name, std::string&& context_error, std::string&& exception_name, 66 bool needs_main, AggregateDecl::Aggregate cast_target ) : 67 type_name( type_name ), field_name( field_name ), getter_name( getter_name ), 68 context_error( context_error ), vtable_name( getVTableName( exception_name ) ), 69 needs_main( needs_main ), cast_target( cast_target ) {} 58 70 59 71 virtual ~ConcurrentSueKeyword() {} … … 63 75 64 76 void handle( StructDecl * ); 77 void addVtableForward( StructDecl * ); 65 78 FunctionDecl * forwardDeclare( StructDecl * ); 66 79 ObjectDecl * addField( StructDecl * ); … … 76 89 const std::string getter_name; 77 90 const std::string context_error; 91 const std::string vtable_name; 78 92 bool needs_main; 79 93 AggregateDecl::Aggregate cast_target; … … 81 95 StructDecl * type_decl = nullptr; 82 96 FunctionDecl * dtor_decl = nullptr; 97 StructDecl * vtable_decl = nullptr; 83 98 }; 84 99 … … 101 116 "get_thread", 102 117 "thread keyword requires threads to be in scope, add #include <thread.hfa>\n", 118 "", 103 119 true, 104 120 AggregateDecl::Thread … … 133 149 "get_coroutine", 134 150 "coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>\n", 151 "CoroutineCancelled", 135 152 true, 136 153 AggregateDecl::Coroutine … … 167 184 "get_monitor", 168 185 "monitor keyword requires monitors to be in scope, add #include <monitor.hfa>\n", 186 "", 169 187 false, 170 188 AggregateDecl::Monitor … … 198 216 "get_generator", 199 217 "Unable to find builtin type $generator\n", 218 "", 200 219 true, 201 220 AggregateDecl::Generator … … 231 250 232 251 private: 233 DeclarationWithType * is_main( FunctionDecl * );234 252 bool is_real_suspend( FunctionDecl * ); 235 253 … … 359 377 handle( decl ); 360 378 } 379 else if ( !vtable_decl && vtable_name == decl->name && decl->body ) { 380 vtable_decl = decl; 381 } 382 // Might be able to get ride of is target. 383 assert( is_target(decl) == (cast_target == decl->kind) ); 361 384 return decl; 362 385 } 363 386 364 387 DeclarationWithType * ConcurrentSueKeyword::postmutate( FunctionDecl * decl ) { 365 if( !type_decl ) return decl; 366 if( !CodeGen::isDestructor( decl->name ) ) return decl; 367 368 auto params = decl->type->parameters; 369 if( params.size() != 1 ) return decl; 370 371 auto type = dynamic_cast<ReferenceType*>( params.front()->get_type() ); 372 if( !type ) return decl; 373 374 auto stype = dynamic_cast<StructInstType*>( type->base ); 375 if( !stype ) return decl; 376 if( stype->baseStruct != type_decl ) return decl; 377 378 if( !dtor_decl ) dtor_decl = decl; 388 if ( type_decl && isDestructorFor( decl, type_decl ) ) 389 dtor_decl = decl; 390 else if ( vtable_name.empty() ) 391 ; 392 else if ( auto param = isMainFor( decl, cast_target ) ) { 393 // This should never trigger. 394 assert( vtable_decl ); 395 // Should be safe because of isMainFor. 396 StructInstType * struct_type = static_cast<StructInstType *>( 397 static_cast<ReferenceType *>( param->get_type() )->base ); 398 assert( struct_type ); 399 400 declsToAddAfter.push_back( Virtual::makeVtableInstance( vtable_decl, { 401 new TypeExpr( struct_type->clone() ), 402 }, struct_type, nullptr ) ); 403 } 404 379 405 return decl; 380 406 } … … 400 426 if( !dtor_decl ) SemanticError( decl, context_error ); 401 427 428 addVtableForward( decl ); 402 429 FunctionDecl * func = forwardDeclare( decl ); 403 430 ObjectDecl * field = addField( decl ); 404 431 addRoutines( field, func ); 432 } 433 434 void ConcurrentSueKeyword::addVtableForward( StructDecl * decl ) { 435 if ( vtable_decl ) { 436 declsToAddBefore.push_back( Virtual::makeVtableForward( vtable_decl, { 437 new TypeExpr( new StructInstType( noQualifiers, decl ) ), 438 } ) ); 439 // Its only an error if we want a vtable and don't have one. 440 } else if ( ! vtable_name.empty() ) { 441 SemanticError( decl, context_error ); 442 } 405 443 } 406 444 … … 528 566 // Suspend keyword implementation 529 567 //============================================================================================= 530 DeclarationWithType * SuspendKeyword::is_main( FunctionDecl * func) {531 if(func->name != "main") return nullptr;532 if(func->type->parameters.size() != 1) return nullptr;533 534 auto param = func->type->parameters.front();535 536 auto type = dynamic_cast<ReferenceType * >(param->get_type());537 if(!type) return nullptr;538 539 auto obj = dynamic_cast<StructInstType *>(type->base);540 if(!obj) return nullptr;541 542 if(!obj->baseStruct->is_generator()) return nullptr;543 544 return param;545 }546 547 568 bool SuspendKeyword::is_real_suspend( FunctionDecl * func ) { 548 569 if(isMangled(func->linkage)) return false; // the real suspend isn't mangled … … 565 586 566 587 // Is this the main of a generator? 567 auto param = is _main( func);588 auto param = isMainFor( func, AggregateDecl::Aggregate::Generator ); 568 589 if(!param) return; 569 590 … … 910 931 { 911 932 new SingleInit( new AddressExpr( new VariableExpr( monitors ) ) ), 912 new SingleInit( new CastExpr( new VariableExpr( func ), generic_func->clone(), false ) ) 933 new SingleInit( new CastExpr( new VariableExpr( func ), generic_func->clone(), false ) ), 934 new SingleInit( new ConstantExpr( Constant::from_bool( false ) ) ) 913 935 }, 914 936 noDesignators, … … 1033 1055 // tab-width: 4 // 1034 1056 // End: // 1057 -
src/GenPoly/InstantiateGeneric.cc
rae2c27a rc76bd34 172 172 InstantiationMap< AggregateDecl, AggregateDecl > instantiations; 173 173 /// Set of types which are dtype-only generic (and therefore have static layout) 174 ScopedSet< AggregateDecl*> dtypeStatics;174 std::set<AggregateDecl *> dtypeStatics; 175 175 /// Namer for concrete types 176 176 UniqueName typeNamer; … … 505 505 void GenericInstantiator::beginScope() { 506 506 instantiations.beginScope(); 507 dtypeStatics.beginScope();508 507 } 509 508 510 509 void GenericInstantiator::endScope() { 511 510 instantiations.endScope(); 512 dtypeStatics.endScope();513 511 } 514 512 -
src/InitTweak/InitTweak.cc
rae2c27a rc76bd34 1026 1026 if ( ftype->params.size() != 2 ) return false; 1027 1027 1028 const ast::Type * t1 = getPointerBase( ftype->params.front() ->get_type());1028 const ast::Type * t1 = getPointerBase( ftype->params.front() ); 1029 1029 if ( ! t1 ) return false; 1030 const ast::Type * t2 = ftype->params.back() ->get_type();1030 const ast::Type * t2 = ftype->params.back(); 1031 1031 1032 1032 return ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, ast::SymbolTable{} ); -
src/Parser/lex.ll
rae2c27a rc76bd34 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Sat Feb 15 11:05:50202013 * Update Count : 7 3712 * Last Modified On : Tue Oct 6 18:15:41 2020 13 * Update Count : 743 14 14 */ 15 15 … … 62 62 #define IDENTIFIER_RETURN() RETURN_VAL( typedefTable.isKind( yytext ) ) 63 63 64 #ifdef HAVE_KEYWORDS_FLOATXX // GCC >= 7 => keyword, otherwise typedef64 #ifdef HAVE_KEYWORDS_FLOATXX // GCC >= 7 => keyword, otherwise typedef 65 65 #define FLOATXX(v) KEYWORD_RETURN(v); 66 66 #else … … 292 292 __restrict__ { KEYWORD_RETURN(RESTRICT); } // GCC 293 293 return { KEYWORD_RETURN(RETURN); } 294 /* resume { KEYWORD_RETURN(RESUME); } // CFA */294 /* resume { KEYWORD_RETURN(RESUME); } // CFA */ 295 295 short { KEYWORD_RETURN(SHORT); } 296 296 signed { KEYWORD_RETURN(SIGNED); } -
src/Parser/parser.yy
rae2c27a rc76bd34 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu May 28 12:11:45202013 // Update Count : 4 50012 // Last Modified On : Tue Oct 6 18:24:18 2020 13 // Update Count : 4610 14 14 // 15 15 … … 278 278 %token OTYPE FTYPE DTYPE TTYPE TRAIT // CFA 279 279 %token SIZEOF OFFSETOF 280 // %token RESUME // CFA281 %token SUSPEND // CFA280 // %token RESUME // CFA 281 %token SUSPEND // CFA 282 282 %token ATTRIBUTE EXTENSION // GCC 283 283 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN … … 329 329 %type<en> conditional_expression constant_expression assignment_expression assignment_expression_opt 330 330 %type<en> comma_expression comma_expression_opt 331 %type<en> argument_expression_list_opt argument_expression default_initialize_opt331 %type<en> argument_expression_list_opt argument_expression default_initialize_opt 332 332 %type<ifctl> if_control_expression 333 333 %type<fctl> for_control_expression for_control_expression_list … … 370 370 %type<decl> assertion assertion_list assertion_list_opt 371 371 372 %type<en> bit_subrange_size_opt bit_subrange_size372 %type<en> bit_subrange_size_opt bit_subrange_size 373 373 374 374 %type<decl> basic_declaration_specifier basic_type_name basic_type_specifier direct_type indirect_type … … 793 793 | '(' aggregate_control '&' ')' cast_expression // CFA 794 794 { $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); } 795 // VIRTUAL cannot be opt because of look ahead issues796 795 | '(' VIRTUAL ')' cast_expression // CFA 797 796 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $4 ), maybeMoveBuildType( nullptr ) ) ); } … … 920 919 | unary_expression assignment_operator assignment_expression 921 920 { 922 if ( $2 == OperKinds::AtAssn ) {923 SemanticError( yylloc, "C @= assignment is currently unimplemented." ); $$ = nullptr;924 } else {921 // if ( $2 == OperKinds::AtAssn ) { 922 // SemanticError( yylloc, "C @= assignment is currently unimplemented." ); $$ = nullptr; 923 // } else { 925 924 $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); 926 } // if925 // } // if 927 926 } 928 927 | unary_expression '=' '{' initializer_list_opt comma_opt '}' … … 1676 1675 1677 1676 typedef_expression: 1678 // GCC, naming expression type: typedef name = exp; gives a name to the type of an expression1677 // deprecated GCC, naming expression type: typedef name = exp; gives a name to the type of an expression 1679 1678 TYPEDEF identifier '=' assignment_expression 1680 1679 { 1681 // $$ = DeclarationNode::newName( 0 ); // unimplemented 1682 SemanticError( yylloc, "Typedef expression is currently unimplemented." ); $$ = nullptr; 1680 SemanticError( yylloc, "Typedef expression is deprecated, use typeof(...) instead." ); $$ = nullptr; 1683 1681 } 1684 1682 | typedef_expression pop ',' push identifier '=' assignment_expression 1685 1683 { 1686 // $$ = DeclarationNode::newName( 0 ); // unimplemented 1687 SemanticError( yylloc, "Typedef expression is currently unimplemented." ); $$ = nullptr; 1688 } 1689 ; 1690 1691 //c_declaration: 1692 // declaring_list pop ';' 1693 // | typedef_declaration pop ';' 1694 // | typedef_expression pop ';' // GCC, naming expression type 1695 // | sue_declaration_specifier pop ';' 1696 // ; 1697 // 1698 //declaring_list: 1699 // // A semantic check is required to ensure asm_name only appears on declarations with implicit or explicit static 1700 // // storage-class 1701 // declarator asm_name_opt initializer_opt 1702 // { 1703 // typedefTable.addToEnclosingScope( IDENTIFIER ); 1704 // $$ = ( $2->addType( $1 ))->addAsmName( $3 )->addInitializer( $4 ); 1705 // } 1706 // | declaring_list ',' attribute_list_opt declarator asm_name_opt initializer_opt 1707 // { 1708 // typedefTable.addToEnclosingScope( IDENTIFIER ); 1709 // $$ = $1->appendList( $1->cloneBaseType( $4->addAsmName( $5 )->addInitializer( $6 ) ) ); 1710 // } 1711 // ; 1684 SemanticError( yylloc, "Typedef expression is deprecated, use typeof(...) instead." ); $$ = nullptr; 1685 } 1686 ; 1712 1687 1713 1688 c_declaration: … … 1715 1690 { $$ = distAttr( $1, $2 ); } 1716 1691 | typedef_declaration 1717 | typedef_expression // GCC, naming expression type1692 | typedef_expression // deprecated GCC, naming expression type 1718 1693 | sue_declaration_specifier 1719 1694 ; … … 2094 2069 { yyy = true; $$ = AggregateDecl::Union; } 2095 2070 | EXCEPTION // CFA 2096 { yyy = true; $$ = AggregateDecl::Exception; } 2071 // { yyy = true; $$ = AggregateDecl::Exception; } 2072 { SemanticError( yylloc, "exception aggregate is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; } 2097 2073 ; 2098 2074 -
src/ResolvExpr/CandidateFinder.cpp
rae2c27a rc76bd34 188 188 189 189 // mark conversion cost and also specialization cost of param type 190 const ast::Type * paramType = (*param)->get_type();190 // const ast::Type * paramType = (*param)->get_type(); 191 191 cand->expr = ast::mutate_field_index( 192 192 appExpr, &ast::ApplicationExpr::args, i, 193 193 computeExpressionConversionCost( 194 args[i], paramType, symtab, cand->env, convCost ) );195 convCost.decSpec( specCost( paramType) );194 args[i], *param, symtab, cand->env, convCost ) ); 195 convCost.decSpec( specCost( *param ) ); 196 196 ++param; // can't be in for-loop update because of the continue 197 197 } … … 698 698 if ( targetType && ! targetType->isVoid() && ! funcType->returns.empty() ) { 699 699 // attempt to narrow based on expected target type 700 const ast::Type * returnType = funcType->returns.front() ->get_type();700 const ast::Type * returnType = funcType->returns.front(); 701 701 if ( ! unify( 702 702 returnType, targetType, funcEnv, funcNeed, funcHave, funcOpen, symtab ) … … 712 712 std::size_t genStart = 0; 713 713 714 for ( const ast::DeclWithType * param : funcType->params ) { 715 auto obj = strict_dynamic_cast< const ast::ObjectDecl * >( param ); 714 // xxx - how to handle default arg after change to ftype representation? 715 if (const ast::VariableExpr * varExpr = func->expr.as<ast::VariableExpr>()) { 716 if (const ast::FunctionDecl * funcDecl = varExpr->var.as<ast::FunctionDecl>()) { 717 // function may have default args only if directly calling by name 718 // must use types on candidate however, due to RenameVars substitution 719 auto nParams = funcType->params.size(); 720 721 for (size_t i=0; i<nParams; ++i) { 722 auto obj = funcDecl->params[i].strict_as<ast::ObjectDecl>(); 723 if (!instantiateArgument( 724 funcType->params[i], obj->init, args, results, genStart, symtab)) return; 725 } 726 goto endMatch; 727 } 728 } 729 for ( const auto & param : funcType->params ) { 716 730 // Try adding the arguments corresponding to the current parameter to the existing 717 731 // matches 732 // no default args for indirect calls 718 733 if ( ! instantiateArgument( 719 obj->type, obj->init, args, results, genStart, symtab ) ) return; 720 } 721 734 param, nullptr, args, results, genStart, symtab ) ) return; 735 } 736 737 endMatch: 722 738 if ( funcType->isVarArgs ) { 723 739 // append any unused arguments to vararg pack … … 816 832 /// Adds aggregate member interpretations 817 833 void addAggMembers( 818 const ast:: ReferenceToType * aggrInst, const ast::Expr * expr,834 const ast::BaseInstType * aggrInst, const ast::Expr * expr, 819 835 const Candidate & cand, const Cost & addedCost, const std::string & name 820 836 ) { … … 1263 1279 1264 1280 void postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) { 1265 const ast:: ReferenceToType * aggInst;1281 const ast::BaseInstType * aggInst; 1266 1282 if (( aggInst = offsetofExpr->type.as< ast::StructInstType >() )) ; 1267 1283 else if (( aggInst = offsetofExpr->type.as< ast::UnionInstType >() )) ; -
src/ResolvExpr/ConversionCost.cc
rae2c27a rc76bd34 520 520 return convertToReferenceCost( src, refType, srcIsLvalue, symtab, env, localPtrsAssignable ); 521 521 } else { 522 ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost ); 523 src->accept( converter ); 524 return converter.core.cost; 522 return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost ); 525 523 } 526 524 } … … 563 561 } 564 562 } else { 565 ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost ); 566 src->accept( converter ); 567 return converter.core.cost; 563 return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost ); 568 564 } 569 565 } else { -
src/ResolvExpr/ConversionCost.h
rae2c27a rc76bd34 88 88 static size_t traceId; 89 89 Cost cost; 90 Cost result() { return cost; } 90 91 91 92 ConversionCost_new( const ast::Type * dst, bool srcIsLvalue, const ast::SymbolTable & symtab, -
src/ResolvExpr/CurrentObject.cc
rae2c27a rc76bd34 594 594 class SimpleIterator final : public MemberIterator { 595 595 CodeLocation location; 596 readonly< Type >type = nullptr;596 const Type * type = nullptr; 597 597 public: 598 598 SimpleIterator( const CodeLocation & loc, const Type * t ) : location( loc ), type( t ) {} … … 630 630 class ArrayIterator final : public MemberIterator { 631 631 CodeLocation location; 632 readonly< ArrayType >array = nullptr;633 readonly< Type >base = nullptr;632 const ArrayType * array = nullptr; 633 const Type * base = nullptr; 634 634 size_t index = 0; 635 635 size_t size = 0; … … 923 923 924 924 MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type ) { 925 if ( auto aggr = dynamic_cast< const ReferenceToType * >( type ) ) {925 if ( auto aggr = dynamic_cast< const BaseInstType * >( type ) ) { 926 926 if ( auto sit = dynamic_cast< const StructInstType * >( aggr ) ) { 927 927 return new StructIterator{ loc, sit }; … … 932 932 dynamic_cast< const EnumInstType * >( type ) 933 933 || dynamic_cast< const TypeInstType * >( type ), 934 "Encountered unhandled ReferenceToType in createMemberIterator: %s",934 "Encountered unhandled BaseInstType in createMemberIterator: %s", 935 935 toString( type ).c_str() ); 936 936 return new SimpleIterator{ loc, type }; … … 965 965 DesignatorChain & d = *dit; 966 966 PRINT( std::cerr << "____actual: " << t << std::endl; ) 967 if ( auto refType = dynamic_cast< const ReferenceToType * >( t ) ) {967 if ( auto refType = dynamic_cast< const BaseInstType * >( t ) ) { 968 968 // concatenate identical field names 969 969 for ( const Decl * mem : refType->lookup( nexpr->name ) ) { -
src/ResolvExpr/Resolver.cc
rae2c27a rc76bd34 38 38 #include "Common/PassVisitor.h" // for PassVisitor 39 39 #include "Common/SemanticError.h" // for SemanticError 40 #include "Common/Stats/ResolveTime.h" // for ResolveTime::start(), ResolveTime::stop() 40 41 #include "Common/utility.h" // for ValueGuard, group_iterate 41 42 #include "InitTweak/GenInit.h" … … 965 966 /// Finds deleted expressions in an expression tree 966 967 struct DeleteFinder_new final : public ast::WithShortCircuiting { 967 const ast::DeletedExpr * delExpr= nullptr;968 const ast::DeletedExpr * result = nullptr; 968 969 969 970 void previsit( const ast::DeletedExpr * expr ) { 970 if ( delExpr) { visit_children = false; }971 else { delExpr= expr; }971 if ( result ) { visit_children = false; } 972 else { result = expr; } 972 973 } 973 974 974 975 void previsit( const ast::Expr * ) { 975 if ( delExpr) { visit_children = false; }976 if ( result ) { visit_children = false; } 976 977 } 977 978 }; … … 980 981 /// Check if this expression is or includes a deleted expression 981 982 const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr ) { 982 ast::Pass<DeleteFinder_new> finder; 983 expr->accept( finder ); 984 return finder.core.delExpr; 983 return ast::Pass<DeleteFinder_new>::read( expr ); 985 984 } 986 985 … … 1171 1170 const ast::Expr * untyped, const ast::SymbolTable & symtab 1172 1171 ) { 1173 return findKindExpression( untyped, symtab ); 1172 Stats::ResolveTime::start( untyped ); 1173 auto res = findKindExpression( untyped, symtab ); 1174 Stats::ResolveTime::stop(); 1175 return res; 1174 1176 } 1175 1177 } // anonymous namespace … … 1221 1223 template<typename Iter> 1222 1224 inline bool nextMutex( Iter & it, const Iter & end ) { 1223 while ( it != end && ! (*it)-> get_type()->is_mutex() ) { ++it; }1225 while ( it != end && ! (*it)->is_mutex() ) { ++it; } 1224 1226 return it != end; 1225 1227 } … … 1261 1263 const ast::ThrowStmt * previsit( const ast::ThrowStmt * ); 1262 1264 const ast::CatchStmt * previsit( const ast::CatchStmt * ); 1265 const ast::CatchStmt * postvisit( const ast::CatchStmt * ); 1263 1266 const ast::WaitForStmt * previsit( const ast::WaitForStmt * ); 1264 1267 … … 1493 1496 1494 1497 const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) { 1495 // TODO: This will need a fix for the decl/cond scoping problem. 1498 // Until we are very sure this invarent (ifs that move between passes have thenPart) 1499 // holds, check it. This allows a check for when to decode the mangling. 1500 if ( auto ifStmt = catchStmt->body.as<ast::IfStmt>() ) { 1501 assert( ifStmt->thenPart ); 1502 } 1503 // Encode the catchStmt so the condition can see the declaration. 1496 1504 if ( catchStmt->cond ) { 1497 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; 1498 catchStmt = ast::mutate_field( 1499 catchStmt, &ast::CatchStmt::cond, 1500 findSingleExpression( catchStmt->cond, boolType, symtab ) ); 1505 ast::CatchStmt * stmt = mutate( catchStmt ); 1506 stmt->body = new ast::IfStmt( stmt->location, stmt->cond, nullptr, stmt->body ); 1507 stmt->cond = nullptr; 1508 return stmt; 1509 } 1510 return catchStmt; 1511 } 1512 1513 const ast::CatchStmt * Resolver_new::postvisit( const ast::CatchStmt * catchStmt ) { 1514 // Decode the catchStmt so everything is stored properly. 1515 const ast::IfStmt * ifStmt = catchStmt->body.as<ast::IfStmt>(); 1516 if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) { 1517 assert( ifStmt->cond ); 1518 assert( ifStmt->elsePart ); 1519 ast::CatchStmt * stmt = ast::mutate( catchStmt ); 1520 stmt->cond = ifStmt->cond; 1521 stmt->body = ifStmt->elsePart; 1522 // ifStmt should be implicately deleted here. 1523 return stmt; 1501 1524 } 1502 1525 return catchStmt; … … 1615 1638 // Check if the argument matches the parameter type in the current 1616 1639 // scope 1617 ast::ptr< ast::Type > paramType = (*param)->get_type();1640 // ast::ptr< ast::Type > paramType = (*param)->get_type(); 1618 1641 if ( 1619 1642 ! unify( 1620 arg->expr->result, paramType, resultEnv, need, have, open,1643 arg->expr->result, *param, resultEnv, need, have, open, 1621 1644 symtab ) 1622 1645 ) { … … 1625 1648 ss << "candidate function not viable: no known conversion " 1626 1649 "from '"; 1627 ast::print( ss, (*param)->get_type());1650 ast::print( ss, *param ); 1628 1651 ss << "' to '"; 1629 1652 ast::print( ss, arg->expr->result ); -
src/ResolvExpr/SatisfyAssertions.cpp
rae2c27a rc76bd34 318 318 if ( ! func ) continue; 319 319 320 for ( const a st::DeclWithType *param : func->params ) {321 cost.decSpec( specCost( param ->get_type()) );320 for ( const auto & param : func->params ) { 321 cost.decSpec( specCost( param ) ); 322 322 } 323 323 -
src/ResolvExpr/SpecCost.cc
rae2c27a rc76bd34 178 178 void previsit( const ast::FunctionType * fty ) { 179 179 int minCount = std::numeric_limits<int>::max(); 180 updateMinimumPresent( minCount, fty->params, decl_type);181 updateMinimumPresent( minCount, fty->returns, decl_type);180 updateMinimumPresent( minCount, fty->params, type_deref ); 181 updateMinimumPresent( minCount, fty->returns, type_deref ); 182 182 // Add another level to minCount if set. 183 183 count = toNoneOrInc( minCount ); -
src/ResolvExpr/Unify.cc
rae2c27a rc76bd34 395 395 396 396 template< typename Iterator1, typename Iterator2 > 397 bool unify DeclList( Iterator1 list1Begin, Iterator1 list1End, Iterator2 list2Begin, Iterator2 list2End, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, const SymTab::Indexer &indexer ) {397 bool unifyTypeList( Iterator1 list1Begin, Iterator1 list1End, Iterator2 list2Begin, Iterator2 list2End, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, const SymTab::Indexer &indexer ) { 398 398 auto get_type = [](DeclarationWithType * dwt){ return dwt->get_type(); }; 399 399 for ( ; list1Begin != list1End && list2Begin != list2End; ++list1Begin, ++list2Begin ) { … … 489 489 || flatOther->isTtype() 490 490 ) { 491 if ( unify DeclList( flatFunc->parameters.begin(), flatFunc->parameters.end(), flatOther->parameters.begin(), flatOther->parameters.end(), env, needAssertions, haveAssertions, openVars, indexer ) ) {492 if ( unify DeclList( flatFunc->returnVals.begin(), flatFunc->returnVals.end(), flatOther->returnVals.begin(), flatOther->returnVals.end(), env, needAssertions, haveAssertions, openVars, indexer ) ) {491 if ( unifyTypeList( flatFunc->parameters.begin(), flatFunc->parameters.end(), flatOther->parameters.begin(), flatOther->parameters.end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 492 if ( unifyTypeList( flatFunc->returnVals.begin(), flatFunc->returnVals.end(), flatOther->returnVals.begin(), flatOther->returnVals.end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 493 493 494 494 // the original types must be used in mark assertions, since pointer comparisons are used … … 784 784 785 785 /// returns flattened version of `src` 786 static std::vector< ast::ptr< ast:: DeclWithType > > flattenList(787 const std::vector< ast::ptr< ast:: DeclWithType > > & src, ast::TypeEnvironment & env786 static std::vector< ast::ptr< ast::Type > > flattenList( 787 const std::vector< ast::ptr< ast::Type > > & src, ast::TypeEnvironment & env 788 788 ) { 789 std::vector< ast::ptr< ast:: DeclWithType > > dst;789 std::vector< ast::ptr< ast::Type > > dst; 790 790 dst.reserve( src.size() ); 791 for ( const a st::DeclWithType *d : src ) {791 for ( const auto & d : src ) { 792 792 ast::Pass<TtypeExpander_new> expander{ env }; 793 793 // TtypeExpander pass is impure (may mutate nodes in place) 794 794 // need to make nodes shared to prevent accidental mutation 795 ast::ptr<ast:: DeclWithType> dc = d->accept(expander);796 auto types = flatten( dc ->get_type());795 ast::ptr<ast::Type> dc = d->accept(expander); 796 auto types = flatten( dc ); 797 797 for ( ast::ptr< ast::Type > & t : types ) { 798 798 // outermost const, volatile, _Atomic qualifiers in parameters should not play … … 803 803 // requirements than a non-mutex function 804 804 remove_qualifiers( t, ast::CV::Const | ast::CV::Volatile | ast::CV::Atomic ); 805 dst.emplace_back( new ast::ObjectDecl{ dc->location, "", t });805 dst.emplace_back( t ); 806 806 } 807 807 } … … 811 811 /// Creates a tuple type based on a list of DeclWithType 812 812 template< typename Iter > 813 static ast::ptr< ast::Type > tupleFrom Decls( Iter crnt, Iter end ) {813 static ast::ptr< ast::Type > tupleFromTypes( Iter crnt, Iter end ) { 814 814 std::vector< ast::ptr< ast::Type > > types; 815 815 while ( crnt != end ) { 816 816 // it is guaranteed that a ttype variable will be bound to a flat tuple, so ensure 817 817 // that this results in a flat tuple 818 flatten( (*crnt)->get_type(), types );818 flatten( *crnt, types ); 819 819 820 820 ++crnt; … … 825 825 826 826 template< typename Iter > 827 static bool unify DeclList(827 static bool unifyTypeList( 828 828 Iter crnt1, Iter end1, Iter crnt2, Iter end2, ast::TypeEnvironment & env, 829 829 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, … … 831 831 ) { 832 832 while ( crnt1 != end1 && crnt2 != end2 ) { 833 const ast::Type * t1 = (*crnt1)->get_type();834 const ast::Type * t2 = (*crnt2)->get_type();833 const ast::Type * t1 = *crnt1; 834 const ast::Type * t2 = *crnt2; 835 835 bool isTuple1 = Tuples::isTtype( t1 ); 836 836 bool isTuple2 = Tuples::isTtype( t2 ); … … 840 840 // combine remainder of list2, then unify 841 841 return unifyExact( 842 t1, tupleFrom Decls( crnt2, end2 ), env, need, have, open,842 t1, tupleFromTypes( crnt2, end2 ), env, need, have, open, 843 843 noWiden(), symtab ); 844 844 } else if ( ! isTuple1 && isTuple2 ) { 845 845 // combine remainder of list1, then unify 846 846 return unifyExact( 847 tupleFrom Decls( crnt1, end1 ), t2, env, need, have, open,847 tupleFromTypes( crnt1, end1 ), t2, env, need, have, open, 848 848 noWiden(), symtab ); 849 849 } … … 860 860 if ( crnt1 != end1 ) { 861 861 // try unifying empty tuple with ttype 862 const ast::Type * t1 = (*crnt1)->get_type();862 const ast::Type * t1 = *crnt1; 863 863 if ( ! Tuples::isTtype( t1 ) ) return false; 864 864 return unifyExact( 865 t1, tupleFrom Decls( crnt2, end2 ), env, need, have, open,865 t1, tupleFromTypes( crnt2, end2 ), env, need, have, open, 866 866 noWiden(), symtab ); 867 867 } else if ( crnt2 != end2 ) { 868 868 // try unifying empty tuple with ttype 869 const ast::Type * t2 = (*crnt2)->get_type();869 const ast::Type * t2 = *crnt2; 870 870 if ( ! Tuples::isTtype( t2 ) ) return false; 871 871 return unifyExact( 872 tupleFrom Decls( crnt1, end1 ), t2, env, need, have, open,872 tupleFromTypes( crnt1, end1 ), t2, env, need, have, open, 873 873 noWiden(), symtab ); 874 874 } … … 877 877 } 878 878 879 static bool unify DeclList(880 const std::vector< ast::ptr< ast:: DeclWithType > > & list1,881 const std::vector< ast::ptr< ast:: DeclWithType > > & list2,879 static bool unifyTypeList( 880 const std::vector< ast::ptr< ast::Type > > & list1, 881 const std::vector< ast::ptr< ast::Type > > & list2, 882 882 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 883 883 const ast::OpenVarSet & open, const ast::SymbolTable & symtab 884 884 ) { 885 return unify DeclList(885 return unifyTypeList( 886 886 list1.begin(), list1.end(), list2.begin(), list2.end(), env, need, have, open, 887 887 symtab ); … … 928 928 ) return; 929 929 930 if ( ! unify DeclList( params, params2, tenv, need, have, open, symtab ) ) return;931 if ( ! unify DeclList(930 if ( ! unifyTypeList( params, params2, tenv, need, have, open, symtab ) ) return; 931 if ( ! unifyTypeList( 932 932 func->returns, func2->returns, tenv, need, have, open, symtab ) ) return; 933 933 … … 1232 1232 ast::ptr<ast::Type> extractResultType( const ast::FunctionType * func ) { 1233 1233 if ( func->returns.empty() ) return new ast::VoidType{}; 1234 if ( func->returns.size() == 1 ) return func->returns[0] ->get_type();1234 if ( func->returns.size() == 1 ) return func->returns[0]; 1235 1235 1236 1236 std::vector<ast::ptr<ast::Type>> tys; 1237 for ( const a st::DeclWithType *decl : func->returns ) {1238 tys.emplace_back( decl ->get_type());1237 for ( const auto & decl : func->returns ) { 1238 tys.emplace_back( decl ); 1239 1239 } 1240 1240 return new ast::TupleType{ std::move(tys) }; -
src/SymTab/Mangler.cc
rae2c27a rc76bd34 437 437 private: 438 438 void mangleDecl( const ast::DeclWithType *declaration ); 439 void mangleRef( const ast:: ReferenceToType *refType, std::string prefix );439 void mangleRef( const ast::BaseInstType *refType, std::string prefix ); 440 440 441 441 void printQualifiers( const ast::Type *type ); … … 551 551 GuardValue( inFunctionType ); 552 552 inFunctionType = true; 553 std::vector< ast::ptr< ast::Type > > returnTypes = getTypes( functionType->returns ); 554 if (returnTypes.empty()) mangleName << Encoding::void_t; 555 else accept_each( returnTypes, *visitor ); 553 if (functionType->returns.empty()) mangleName << Encoding::void_t; 554 else accept_each( functionType->returns, *visitor ); 556 555 mangleName << "_"; 557 std::vector< ast::ptr< ast::Type > > paramTypes = getTypes( functionType->params ); 558 accept_each( paramTypes, *visitor ); 556 accept_each( functionType->params, *visitor ); 559 557 mangleName << "_"; 560 558 } 561 559 562 void Mangler_new::mangleRef( const ast:: ReferenceToType * refType, std::string prefix ) {560 void Mangler_new::mangleRef( const ast::BaseInstType * refType, std::string prefix ) { 563 561 printQualifiers( refType ); 564 562 -
src/SymTab/Validate.cc
rae2c27a rc76bd34 960 960 } 961 961 962 static bool isNonParameterAttribute( Attribute * attr ) { 963 static const std::vector<std::string> bad_names = { 964 "aligned", "__aligned__", 965 }; 966 for ( auto name : bad_names ) { 967 if ( name == attr->name ) { 968 return true; 969 } 970 } 971 return false; 972 } 973 962 974 Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) { 963 975 // instances of typedef types will come here. If it is an instance … … 968 980 ret->location = typeInst->location; 969 981 ret->get_qualifiers() |= typeInst->get_qualifiers(); 970 // attributes are not carried over from typedef to function parameters/return values 971 if ( ! inFunctionType ) { 972 ret->attributes.splice( ret->attributes.end(), typeInst->attributes ); 973 } else { 974 deleteAll( ret->attributes ); 975 ret->attributes.clear(); 976 } 982 // GCC ignores certain attributes if they arrive by typedef, this mimics that. 983 if ( inFunctionType ) { 984 ret->attributes.remove_if( isNonParameterAttribute ); 985 } 986 ret->attributes.splice( ret->attributes.end(), typeInst->attributes ); 977 987 // place instance parameters on the typedef'd type 978 988 if ( ! typeInst->parameters.empty() ) { … … 1374 1384 /// Replaces enum types by int, and function/array types in function parameter and return 1375 1385 /// lists by appropriate pointers 1386 /* 1376 1387 struct EnumAndPointerDecay_new { 1377 1388 const ast::EnumDecl * previsit( const ast::EnumDecl * enumDecl ) { … … 1424 1435 } 1425 1436 }; 1437 */ 1426 1438 1427 1439 /// expand assertions from a trait instance, performing appropriate type variable substitutions … … 1508 1520 } 1509 1521 1510 void checkGenericParameters( const ast:: ReferenceToType * inst ) {1522 void checkGenericParameters( const ast::BaseInstType * inst ) { 1511 1523 for ( const ast::Expr * param : inst->params ) { 1512 1524 if ( ! dynamic_cast< const ast::TypeExpr * >( param ) ) { … … 1827 1839 const ast::Type * validateType( 1828 1840 const CodeLocation & loc, const ast::Type * type, const ast::SymbolTable & symtab ) { 1829 ast::Pass< EnumAndPointerDecay_new > epc;1841 // ast::Pass< EnumAndPointerDecay_new > epc; 1830 1842 ast::Pass< LinkReferenceToTypes_new > lrt{ loc, symtab }; 1831 1843 ast::Pass< ForallPointerDecay_new > fpd{ loc }; 1832 1844 1833 return type->accept( epc )->accept(lrt )->accept( fpd );1845 return type->accept( lrt )->accept( fpd ); 1834 1846 } 1835 1847 -
src/Virtual/module.mk
rae2c27a rc76bd34 15 15 ############################################################################### 16 16 17 SRC += Virtual/ExpandCasts.cc Virtual/ExpandCasts.h 17 SRC += Virtual/ExpandCasts.cc Virtual/ExpandCasts.h \ 18 Virtual/Tables.cc Virtual/Tables.h 19 20 SRCDEMANGLE += Virtual/Tables.cc
Note:
See TracChangeset
for help on using the changeset viewer.