Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    r7583c02 r2dda05d  
    986986                };
    987987        } // anonymous namespace
     988
    988989        /// Check if this expression is or includes a deleted expression
    989990        const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr ) {
     
    11511152                        const ast::Expr * untyped, const ast::SymbolTable & symtab
    11521153                ) {
     1154                        resetTyVarRenaming();
    11531155                        ast::TypeEnvironment env;
    11541156                        ast::ptr< ast::Expr > newExpr = resolveInVoidContext( untyped, symtab, env );
     
    13101312        }
    13111313
    1312         const ast::Expr * resolveStmtExpr(
     1314        ast::ptr< ast::Expr > resolveStmtExpr(
    13131315                const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab
    13141316        ) {
    13151317                assert( stmtExpr );
    13161318                ast::Pass< Resolver_new > resolver{ symtab };
    1317                 auto ret = mutate(stmtExpr->accept(resolver));
    1318                 strict_dynamic_cast< ast::StmtExpr * >( ret )->computeResult();
     1319                ast::ptr< ast::Expr > ret = stmtExpr;
     1320                ret = ret->accept( resolver );
     1321                strict_dynamic_cast< ast::StmtExpr * >( ret.get_and_mutate() )->computeResult();
    13191322                return ret;
    13201323        }
     
    13721375                        }
    13731376
    1374                         // handle assertions
     1377                        // handle assertions. (seems deep)
    13751378
    13761379                        symtab.enterScope();
    1377                         mutType->forall.clear();
    1378                         mutType->assertions.clear();
    1379                         for (auto & typeParam : mutDecl->type_params) {
    1380                                 symtab.addType(typeParam);
    1381                                 mutType->forall.emplace_back(new ast::TypeInstType(typeParam->name, typeParam));
    1382                         }
    1383                         for (auto & asst : mutDecl->assertions) {
    1384                                 asst = fixObjectType(asst.strict_as<ast::ObjectDecl>(), symtab);
    1385                                 symtab.addId(asst);
    1386                                 mutType->assertions.emplace_back(new ast::VariableExpr(functionDecl->location, asst));
     1380                        for (auto & typeParam : mutType->forall) {
     1381                                auto mutParam = typeParam.get_and_mutate();
     1382                                symtab.addType(mutParam);
     1383                                for (auto & asst : mutParam->assertions) {
     1384                                        asst = fixObjectType(asst.strict_as<ast::ObjectDecl>(), symtab);
     1385                                        symtab.addId(asst);
     1386                                }
     1387                                typeParam = mutParam;
    13871388                        }
    13881389
     
    14061407                        mutType->returns = std::move(returnTypes);
    14071408
    1408                         auto renamedType = strict_dynamic_cast<const ast::FunctionType *>(renameTyVars(mutType, RenameMode::GEN_EXPR_ID));
    1409 
    14101409                        std::list<ast::ptr<ast::Stmt>> newStmts;
    14111410                        resolveWithExprs (mutDecl->withExprs, newStmts);
     
    14191418                        symtab.leaveScope();
    14201419
    1421                         mutDecl->type = renamedType;
    14221420                        mutDecl->mangleName = Mangle::mangle(mutDecl);
    14231421                        mutDecl->isTypeFixed = true;
     
    15361534        const PtrType * handlePtrType( const PtrType * type, const ast::SymbolTable & symtab ) {
    15371535                if ( type->dimension ) {
    1538                         ast::ptr< ast::Type > sizeType = ast::sizeType;
     1536                        #warning should use new equivalent to Validate::SizeType rather than sizeType here
     1537                        ast::ptr< ast::Type > sizeType = new ast::BasicType{ ast::BasicType::LongUnsignedInt };
    15391538                        ast::mutate_field(
    15401539                                type, &PtrType::dimension,
Note: See TracChangeset for help on using the changeset viewer.