Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r3e5dd913 r23954b6  
    5555
    5656// these need to be accessed in new FixInit now
    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;
     57ast::Type * sizeType = nullptr;
     58ast::FunctionDecl * dereferenceOperator = nullptr;
     59ast::StructDecl   * dtorStruct = nullptr;
     60ast::FunctionDecl * dtorStructDestroy = nullptr;
    6161
    6262}
     
    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);
     
    238233        const ast::Decl * namedTypePostamble( NamedTypeDecl * decl, const ast::NamedTypeDecl * node ) {
    239234                // base comes from constructor
     235                decl->parameters = get<TypeDecl>().acceptL( node->params );
    240236                decl->assertions = get<DeclarationWithType>().acceptL( node->assertions );
    241237                declPostamble( decl, node );
     
    607603
    608604                for (decltype(src->begin()) src_i = src->begin(); src_i != src->end(); src_i++) {
    609                         rslt->add( src_i->first.typeString(),
     605                        rslt->add( src_i->first,
    610606                                   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) );
    611612                }
    612613
     
    12121213                // ty->returnVals = get<DeclarationWithType>().acceptL( node->returns );
    12131214                // 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 
     1215                ty->forall = get<TypeDecl>().acceptL( node->forall );
    12351216                return visitType( node, ty );
    12361217        }
    12371218
    12381219        const ast::Type * postvisit( const ast::BaseInstType * old, ReferenceToType * ty ) {
     1220                ty->forall = get<TypeDecl>().acceptL( old->forall );
    12391221                ty->parameters = get<Expression>().acceptL( old->params );
    12401222                ty->hoistType = old->hoistType;
     
    13191301                        ty = new TypeInstType{
    13201302                                cv( node ),
    1321                                 node->typeString(),
     1303                                node->name,
    13221304                                get<TypeDecl>().accept1( node->base ),
    13231305                                get<Attribute>().acceptL( node->attributes )
     
    13261308                        ty = new TypeInstType{
    13271309                                cv( node ),
    1328                                 node->typeString(),
     1310                                node->name,
    13291311                                node->kind == ast::TypeDecl::Ftype,
    13301312                                get<Attribute>().acceptL( node->attributes )
     
    14511433        /// at conversion stage, all created nodes are guaranteed to be unique, therefore
    14521434        /// const_casting out of smart pointers is permitted.
    1453         std::unordered_map< const BaseSyntaxNode *, ast::readonly<ast::Node> > cache = {};
     1435        std::unordered_map< const BaseSyntaxNode *, ast::ptr<ast::Node> > cache = {};
    14541436
    14551437        // Local Utilities:
     
    15851567                // can function type have attributes? seems not to be the case.
    15861568                // 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                 }
    15991569
    16001570                auto decl = new ast::FunctionDecl{
     
    16161586                cache.emplace( old, decl );
    16171587
    1618                 decl->assertions = std::move(assertions);
    16191588                decl->withExprs = GET_ACCEPT_V(withExprs, Expr);
    16201589                decl->stmts = GET_ACCEPT_1(statements, CompoundStmt);
     
    17351704                cache.emplace( old, decl );
    17361705                decl->assertions = GET_ACCEPT_V(assertions, DeclWithType);
     1706                decl->params     = GET_ACCEPT_V(parameters, TypeDecl);
    17371707                decl->extension  = old->extension;
    17381708                decl->uniqueId   = old->uniqueId;
     
    17501720                );
    17511721                decl->assertions = GET_ACCEPT_V(assertions, DeclWithType);
     1722                decl->params     = GET_ACCEPT_V(parameters, TypeDecl);
    17521723                decl->extension  = old->extension;
    17531724                decl->uniqueId   = old->uniqueId;
     
    20992070        }
    21002071
    2101         // TypeSubstitution shouldn't exist yet in old.
    21022072        ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) {
    2103                
     2073
    21042074                if (!old) return nullptr;
    2105                 if (old->empty()) return nullptr;
    2106                 assert(false);
    2107 
    2108                 /*
     2075
    21092076                ast::TypeSubstitution *rslt = new ast::TypeSubstitution();
    21102077
     
    21142081                }
    21152082
     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
    21162088                return rslt;
    2117                 */
    21182089        }
    21192090
     
    26432614                        ty->params.emplace_back(v->get_type());
    26442615                }
    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                 }
     2616                ty->forall = GET_ACCEPT_V( forall, TypeDecl );
    26552617                visitType( old, ty );
    26562618        }
    26572619
    26582620        void postvisit( const ReferenceToType * old, ast::BaseInstType * ty ) {
     2621                ty->forall = GET_ACCEPT_V( forall, TypeDecl );
    26592622                ty->params = GET_ACCEPT_V( parameters, Expr );
    26602623                ty->hoistType = old->hoistType;
     
    28442807        ConverterOldToNew c;
    28452808        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 
    28522809        for(auto d : translationUnit) {
    28532810                d->accept( c );
Note: See TracChangeset for help on using the changeset viewer.