Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    rf6e6a55 r5bb1ac1  
    1010// Created On       : Sun May 17 12:17:01 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Apr 20 10:41:00 2022
    13 // Update Count     : 248
     12// Last Modified On : Fri Mar 18 10:41:00 2022
     13// Update Count     : 247
    1414//
    1515
     
    17381738                // Resolve all clauses first
    17391739                for ( unsigned i = 0; i < stmt->clauses.size(); ++i ) {
    1740                         const ast::WaitForClause & clause = *stmt->clauses[i];
     1740                        const ast::WaitForStmt::Clause & clause = stmt->clauses[i];
    17411741
    17421742                        ast::TypeEnvironment env;
     
    17441744
    17451745                        // Find all candidates for a function in canonical form
    1746                         funcFinder.find( clause.target_func, ResolvMode::withAdjustment() );
     1746                        funcFinder.find( clause.target.func, ResolvMode::withAdjustment() );
    17471747
    17481748                        if ( funcFinder.candidates.empty() ) {
    17491749                                stringstream ss;
    17501750                                ss << "Use of undeclared indentifier '";
    1751                                 ss << clause.target_func.strict_as< ast::NameExpr >()->name;
     1751                                ss << clause.target.func.strict_as< ast::NameExpr >()->name;
    17521752                                ss << "' in call to waitfor";
    17531753                                SemanticError( stmt->location, ss.str() );
    17541754                        }
    17551755
    1756                         if ( clause.target_args.empty() ) {
     1756                        if ( clause.target.args.empty() ) {
    17571757                                SemanticError( stmt->location,
    17581758                                        "Waitfor clause must have at least one mutex parameter");
     
    17611761                        // Find all alternatives for all arguments in canonical form
    17621762                        std::vector< CandidateFinder > argFinders =
    1763                                 funcFinder.findSubExprs( clause.target_args );
     1763                                funcFinder.findSubExprs( clause.target.args );
    17641764
    17651765                        // List all combinations of arguments
     
    19341934
    19351935                        // build new clause
    1936                         auto clause2 = new ast::WaitForClause( clause.location );
    1937 
    1938                         clause2->target_func = funcCandidates.front()->expr;
    1939 
    1940                         clause2->target_args.reserve( clause.target_args.size() );
     1936                        ast::WaitForStmt::Clause clause2;
     1937
     1938                        clause2.target.func = funcCandidates.front()->expr;
     1939
     1940                        clause2.target.args.reserve( clause.target.args.size() );
    19411941                        const ast::StructDecl * decl_monitor = symtab.lookupStruct( "monitor$" );
    19421942                        for ( auto arg : argsCandidates.front() ) {
     
    19551955                                );
    19561956
    1957                                 clause2->target_args.emplace_back( findSingleExpression( init, context ) );
     1957                                clause2.target.args.emplace_back( findSingleExpression( init, context ) );
    19581958                        }
    19591959
    19601960                        // Resolve the conditions as if it were an IfStmt, statements normally
    1961                         clause2->cond = findSingleExpression( clause.cond, context );
    1962                         clause2->stmt = clause.stmt->accept( *visitor );
     1961                        clause2.cond = findSingleExpression( clause.cond, context );
     1962                        clause2.stmt = clause.stmt->accept( *visitor );
    19631963
    19641964                        // set results into stmt
    19651965                        auto n = mutate( stmt );
    1966                         n->clauses[i] = clause2;
     1966                        n->clauses[i] = std::move( clause2 );
    19671967                        stmt = n;
    19681968                }
    19691969
    1970                 if ( stmt->timeout_stmt ) {
     1970                if ( stmt->timeout.stmt ) {
    19711971                        // resolve the timeout as a size_t, the conditions like IfStmt, and stmts normally
     1972                        ast::WaitForStmt::Timeout timeout2;
     1973
    19721974                        ast::ptr< ast::Type > target =
    19731975                                new ast::BasicType{ ast::BasicType::LongLongUnsignedInt };
    1974                         auto timeout_time = findSingleExpression( stmt->timeout_time, target, context );
    1975                         auto timeout_cond = findSingleExpression( stmt->timeout_cond, context );
    1976                         auto timeout_stmt = stmt->timeout_stmt->accept( *visitor );
     1976                        timeout2.time = findSingleExpression( stmt->timeout.time, target, context );
     1977                        timeout2.cond = findSingleExpression( stmt->timeout.cond, context );
     1978                        timeout2.stmt = stmt->timeout.stmt->accept( *visitor );
    19771979
    19781980                        // set results into stmt
    19791981                        auto n = mutate( stmt );
    1980                         n->timeout_time = std::move( timeout_time );
    1981                         n->timeout_cond = std::move( timeout_cond );
    1982                         n->timeout_stmt = std::move( timeout_stmt );
     1982                        n->timeout = std::move( timeout2 );
    19831983                        stmt = n;
    19841984                }
    19851985
    1986                 if ( stmt->else_stmt ) {
     1986                if ( stmt->orElse.stmt ) {
    19871987                        // resolve the condition like IfStmt, stmts normally
    1988                         auto else_cond = findSingleExpression( stmt->else_cond, context );
    1989                         auto else_stmt = stmt->else_stmt->accept( *visitor );
     1988                        ast::WaitForStmt::OrElse orElse2;
     1989
     1990                        orElse2.cond = findSingleExpression( stmt->orElse.cond, context );
     1991                        orElse2.stmt = stmt->orElse.stmt->accept( *visitor );
    19901992
    19911993                        // set results into stmt
    19921994                        auto n = mutate( stmt );
    1993                         n->else_cond = std::move( else_cond );
    1994                         n->else_stmt = std::move( else_stmt );
     1995                        n->orElse = std::move( orElse2 );
    19951996                        stmt = n;
    19961997                }
Note: See TracChangeset for help on using the changeset viewer.