Changeset 53449a4 for src/AST/Convert.cpp
- Timestamp:
- Dec 16, 2020, 4:01:57 PM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 8ba363e, c8025a21
- Parents:
- b3c8496 (diff), 3e5dd913 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
rb3c8496 r53449a4 55 55 56 56 // these need to be accessed in new FixInit now 57 ast:: Type *sizeType = nullptr;58 ast::FunctionDecl * dereferenceOperator = nullptr;59 ast::StructDecl * dtorStruct = nullptr;60 ast::FunctionDecl * dtorStructDestroy = nullptr;57 ast::ptr<ast::Type> sizeType = nullptr; 58 const ast::FunctionDecl * dereferenceOperator = nullptr; 59 const ast::StructDecl * dtorStruct = nullptr; 60 const ast::FunctionDecl * dtorStructDestroy = nullptr; 61 61 62 62 } … … 205 205 ftype->parameters = get<DeclarationWithType>().acceptL(node->params); 206 206 207 ftype->forall = get<TypeDecl>().acceptL( node->type->forall ); 207 ftype->forall = get<TypeDecl>().acceptL( node->type_params ); 208 if (!node->assertions.empty()) { 209 assert(!ftype->forall.empty()); 210 // find somewhere to place assertions back, for convenience it is the last slot 211 ftype->forall.back()->assertions = get<DeclarationWithType>().acceptL(node->assertions); 212 } 208 213 209 214 visitType(node->type, ftype); … … 233 238 const ast::Decl * namedTypePostamble( NamedTypeDecl * decl, const ast::NamedTypeDecl * node ) { 234 239 // base comes from constructor 235 decl->parameters = get<TypeDecl>().acceptL( node->params );236 240 decl->assertions = get<DeclarationWithType>().acceptL( node->assertions ); 237 241 declPostamble( decl, node ); … … 603 607 604 608 for (decltype(src->begin()) src_i = src->begin(); src_i != src->end(); src_i++) { 605 rslt->add( src_i->first ,609 rslt->add( src_i->first.typeString(), 606 610 get<Type>().accept1(src_i->second) ); 607 }608 609 for (decltype(src->beginVar()) src_i = src->beginVar(); src_i != src->endVar(); src_i++) {610 rslt->addVar( src_i->first,611 get<Expression>().accept1(src_i->second) );612 611 } 613 612 … … 1213 1212 // ty->returnVals = get<DeclarationWithType>().acceptL( node->returns ); 1214 1213 // ty->parameters = get<DeclarationWithType>().acceptL( node->params ); 1215 ty->forall = get<TypeDecl>().acceptL( node->forall ); 1214 1215 auto types = get<TypeInstType>().acceptL( node->forall ); 1216 for (auto t : types) { 1217 auto newT = new TypeDecl(*t->baseType); 1218 newT->name = t->name; // converted by typeString() 1219 for (auto asst : newT->assertions) delete asst; 1220 newT->assertions.clear(); 1221 ty->forall.push_back(newT); 1222 } 1223 auto assts = get<VariableExpr>().acceptL( node->assertions ); 1224 if (!assts.empty()) { 1225 assert(!types.empty()); 1226 for (auto asst : assts) { 1227 auto newDecl = new ObjectDecl(*strict_dynamic_cast<ObjectDecl*>(asst->var)); 1228 delete newDecl->type; 1229 newDecl->type = asst->result->clone(); 1230 newDecl->storageClasses.is_extern = true; // hack 1231 ty->forall.back()->assertions.push_back(newDecl); 1232 } 1233 } 1234 1216 1235 return visitType( node, ty ); 1217 1236 } 1218 1237 1219 1238 const ast::Type * postvisit( const ast::BaseInstType * old, ReferenceToType * ty ) { 1220 ty->forall = get<TypeDecl>().acceptL( old->forall );1221 1239 ty->parameters = get<Expression>().acceptL( old->params ); 1222 1240 ty->hoistType = old->hoistType; … … 1301 1319 ty = new TypeInstType{ 1302 1320 cv( node ), 1303 node-> name,1321 node->typeString(), 1304 1322 get<TypeDecl>().accept1( node->base ), 1305 1323 get<Attribute>().acceptL( node->attributes ) … … 1308 1326 ty = new TypeInstType{ 1309 1327 cv( node ), 1310 node-> name,1328 node->typeString(), 1311 1329 node->kind == ast::TypeDecl::Ftype, 1312 1330 get<Attribute>().acceptL( node->attributes ) … … 1433 1451 /// at conversion stage, all created nodes are guaranteed to be unique, therefore 1434 1452 /// const_casting out of smart pointers is permitted. 1435 std::unordered_map< const BaseSyntaxNode *, ast:: ptr<ast::Node> > cache = {};1453 std::unordered_map< const BaseSyntaxNode *, ast::readonly<ast::Node> > cache = {}; 1436 1454 1437 1455 // Local Utilities: … … 1567 1585 // can function type have attributes? seems not to be the case. 1568 1586 // visitType(old->type, ftype); 1587 1588 // collect assertions and put directly in FunctionDecl 1589 std::vector<ast::ptr<ast::DeclWithType>> assertions; 1590 for (auto & param: forall) { 1591 for (auto & asst: param->assertions) { 1592 assertf(asst->unique(), "newly converted decl must be unique"); 1593 assertions.emplace_back(asst); 1594 } 1595 auto mut = param.get_and_mutate(); 1596 assertf(mut == param, "newly converted decl must be unique"); 1597 mut->assertions.clear(); 1598 } 1569 1599 1570 1600 auto decl = new ast::FunctionDecl{ … … 1586 1616 cache.emplace( old, decl ); 1587 1617 1618 decl->assertions = std::move(assertions); 1588 1619 decl->withExprs = GET_ACCEPT_V(withExprs, Expr); 1589 1620 decl->stmts = GET_ACCEPT_1(statements, CompoundStmt); … … 1704 1735 cache.emplace( old, decl ); 1705 1736 decl->assertions = GET_ACCEPT_V(assertions, DeclWithType); 1706 decl->params = GET_ACCEPT_V(parameters, TypeDecl);1707 1737 decl->extension = old->extension; 1708 1738 decl->uniqueId = old->uniqueId; … … 1720 1750 ); 1721 1751 decl->assertions = GET_ACCEPT_V(assertions, DeclWithType); 1722 decl->params = GET_ACCEPT_V(parameters, TypeDecl);1723 1752 decl->extension = old->extension; 1724 1753 decl->uniqueId = old->uniqueId; … … 2070 2099 } 2071 2100 2101 // TypeSubstitution shouldn't exist yet in old. 2072 2102 ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) { 2073 2103 2074 2104 if (!old) return nullptr; 2075 2105 if (old->empty()) return nullptr; 2106 assert(false); 2107 2108 /* 2076 2109 ast::TypeSubstitution *rslt = new ast::TypeSubstitution(); 2077 2110 … … 2081 2114 } 2082 2115 2083 for (decltype(old->beginVar()) old_i = old->beginVar(); old_i != old->endVar(); old_i++) {2084 rslt->addVar( old_i->first,2085 getAccept1<ast::Expr>(old_i->second) );2086 }2087 2088 2116 return rslt; 2117 */ 2089 2118 } 2090 2119 … … 2614 2643 ty->params.emplace_back(v->get_type()); 2615 2644 } 2616 ty->forall = GET_ACCEPT_V( forall, TypeDecl ); 2645 // xxx - when will this be non-null? 2646 // will have to create dangling (no-owner) decls to be pointed to 2647 auto foralls = GET_ACCEPT_V( forall, TypeDecl ); 2648 2649 for (auto & param : foralls) { 2650 ty->forall.emplace_back(new ast::TypeInstType(param->name, param)); 2651 for (auto asst : param->assertions) { 2652 ty->assertions.emplace_back(new ast::VariableExpr({}, asst)); 2653 } 2654 } 2617 2655 visitType( old, ty ); 2618 2656 } 2619 2657 2620 2658 void postvisit( const ReferenceToType * old, ast::BaseInstType * ty ) { 2621 ty->forall = GET_ACCEPT_V( forall, TypeDecl );2622 2659 ty->params = GET_ACCEPT_V( parameters, Expr ); 2623 2660 ty->hoistType = old->hoistType; … … 2807 2844 ConverterOldToNew c; 2808 2845 ast::TranslationUnit unit; 2846 if (Validate::SizeType) { 2847 // this should be a BasicType. 2848 auto old = strict_dynamic_cast<BasicType *>(Validate::SizeType); 2849 ast::sizeType = new ast::BasicType{ (ast::BasicType::Kind)(unsigned)old->kind }; 2850 } 2851 2809 2852 for(auto d : translationUnit) { 2810 2853 d->accept( c );
Note: See TracChangeset
for help on using the changeset viewer.