Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r3e5dd913 r361bf01  
    205205                ftype->parameters = get<DeclarationWithType>().acceptL(node->params);
    206206
    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                 }
     207                ftype->forall = get<TypeDecl>().acceptL( node->type->forall );
    213208
    214209                visitType(node->type, ftype);
     
    607602
    608603                for (decltype(src->begin()) src_i = src->begin(); src_i != src->end(); src_i++) {
    609                         rslt->add( src_i->first.typeString(),
     604                        rslt->add( src_i->first,
    610605                                   get<Type>().accept1(src_i->second) );
     606                }
     607
     608                for (decltype(src->beginVar()) src_i = src->beginVar(); src_i != src->endVar(); src_i++) {
     609                        rslt->addVar( src_i->first,
     610                                      get<Expression>().accept1(src_i->second) );
    611611                }
    612612
     
    12121212                // ty->returnVals = get<DeclarationWithType>().acceptL( node->returns );
    12131213                // ty->parameters = get<DeclarationWithType>().acceptL( node->params );
    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 
     1214                ty->forall = get<TypeDecl>().acceptL( node->forall );
    12351215                return visitType( node, ty );
    12361216        }
     
    13191299                        ty = new TypeInstType{
    13201300                                cv( node ),
    1321                                 node->typeString(),
     1301                                node->name,
    13221302                                get<TypeDecl>().accept1( node->base ),
    13231303                                get<Attribute>().acceptL( node->attributes )
     
    13261306                        ty = new TypeInstType{
    13271307                                cv( node ),
    1328                                 node->typeString(),
     1308                                node->name,
    13291309                                node->kind == ast::TypeDecl::Ftype,
    13301310                                get<Attribute>().acceptL( node->attributes )
     
    14511431        /// at conversion stage, all created nodes are guaranteed to be unique, therefore
    14521432        /// const_casting out of smart pointers is permitted.
    1453         std::unordered_map< const BaseSyntaxNode *, ast::readonly<ast::Node> > cache = {};
     1433        std::unordered_map< const BaseSyntaxNode *, ast::ptr<ast::Node> > cache = {};
    14541434
    14551435        // Local Utilities:
     
    15851565                // can function type have attributes? seems not to be the case.
    15861566                // 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                 }
    15991567
    16001568                auto decl = new ast::FunctionDecl{
     
    16161584                cache.emplace( old, decl );
    16171585
    1618                 decl->assertions = std::move(assertions);
    16191586                decl->withExprs = GET_ACCEPT_V(withExprs, Expr);
    16201587                decl->stmts = GET_ACCEPT_1(statements, CompoundStmt);
     
    20992066        }
    21002067
    2101         // TypeSubstitution shouldn't exist yet in old.
    21022068        ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) {
    2103                
     2069
    21042070                if (!old) return nullptr;
    2105                 if (old->empty()) return nullptr;
    2106                 assert(false);
    2107 
    2108                 /*
     2071
    21092072                ast::TypeSubstitution *rslt = new ast::TypeSubstitution();
    21102073
     
    21142077                }
    21152078
     2079                for (decltype(old->beginVar()) old_i = old->beginVar(); old_i != old->endVar(); old_i++) {
     2080                        rslt->addVar( old_i->first,
     2081                                      getAccept1<ast::Expr>(old_i->second) );
     2082                }
     2083
    21162084                return rslt;
    2117                 */
    21182085        }
    21192086
     
    26432610                        ty->params.emplace_back(v->get_type());
    26442611                }
    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                 }
     2612                ty->forall = GET_ACCEPT_V( forall, TypeDecl );
    26552613                visitType( old, ty );
    26562614        }
Note: See TracChangeset for help on using the changeset viewer.