Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    rf6e6a55 r9e7236f4  
    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
     
    427427                        // enumerator initializers should not use the enum type to initialize, since
    428428                        // the enum type is still incomplete at this point. Use signed int instead.
     429                        // TODO: BasicType::SignedInt may not longer be true
    429430                        currentObject = CurrentObject( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
    430431                }
     
    14771478                        // enum type is still incomplete at this point. Use `int` instead.
    14781479
    1479                         if (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base) { // const ast::PointerType &
    1480                                 // const ast::Type * enumBase =  (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base.get());
    1481                                 // const ast::PointerType * enumBaseAsPtr = dynamic_cast<const ast::PointerType *>(enumBase);
    1482 
    1483                                 // if ( enumBaseAsPtr ) {
    1484                                 //      const ast::Type * pointerBase = enumBaseAsPtr->base.get();
    1485                                 //      if ( dynamic_cast<const ast::BasicType *>(pointerBase) ) {
    1486                                 //              objectDecl = fixObjectType(objectDecl, context);
    1487                                 //              if (dynamic_cast<const ast::BasicType *>(pointerBase)->kind == ast::BasicType::Char)
    1488                                 //              currentObject = ast::CurrentObject{
    1489                                 //                      objectDecl->location,  new ast::PointerType{
    1490                                 //                              new ast::BasicType{ ast::BasicType::Char }
    1491                                 //                      } };
    1492                                 //      } else {
    1493                                 //              objectDecl = fixObjectType(objectDecl, context);
    1494                                 //              currentObject = ast::CurrentObject{objectDecl->location, new ast::BasicType{ ast::BasicType::SignedInt } };
    1495                                 //      }
    1496                                 // }
     1480                        if (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base) {
    14971481                                objectDecl = fixObjectType( objectDecl, context );
    14981482                                const ast::Type * enumBase =  (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base.get());
     
    17381722                // Resolve all clauses first
    17391723                for ( unsigned i = 0; i < stmt->clauses.size(); ++i ) {
    1740                         const ast::WaitForClause & clause = *stmt->clauses[i];
     1724                        const ast::WaitForStmt::Clause & clause = stmt->clauses[i];
    17411725
    17421726                        ast::TypeEnvironment env;
     
    17441728
    17451729                        // Find all candidates for a function in canonical form
    1746                         funcFinder.find( clause.target_func, ResolvMode::withAdjustment() );
     1730                        funcFinder.find( clause.target.func, ResolvMode::withAdjustment() );
    17471731
    17481732                        if ( funcFinder.candidates.empty() ) {
    17491733                                stringstream ss;
    17501734                                ss << "Use of undeclared indentifier '";
    1751                                 ss << clause.target_func.strict_as< ast::NameExpr >()->name;
     1735                                ss << clause.target.func.strict_as< ast::NameExpr >()->name;
    17521736                                ss << "' in call to waitfor";
    17531737                                SemanticError( stmt->location, ss.str() );
    17541738                        }
    17551739
    1756                         if ( clause.target_args.empty() ) {
     1740                        if ( clause.target.args.empty() ) {
    17571741                                SemanticError( stmt->location,
    17581742                                        "Waitfor clause must have at least one mutex parameter");
     
    17611745                        // Find all alternatives for all arguments in canonical form
    17621746                        std::vector< CandidateFinder > argFinders =
    1763                                 funcFinder.findSubExprs( clause.target_args );
     1747                                funcFinder.findSubExprs( clause.target.args );
    17641748
    17651749                        // List all combinations of arguments
     
    19341918
    19351919                        // 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() );
     1920                        ast::WaitForStmt::Clause clause2;
     1921
     1922                        clause2.target.func = funcCandidates.front()->expr;
     1923
     1924                        clause2.target.args.reserve( clause.target.args.size() );
    19411925                        const ast::StructDecl * decl_monitor = symtab.lookupStruct( "monitor$" );
    19421926                        for ( auto arg : argsCandidates.front() ) {
     
    19551939                                );
    19561940
    1957                                 clause2->target_args.emplace_back( findSingleExpression( init, context ) );
     1941                                clause2.target.args.emplace_back( findSingleExpression( init, context ) );
    19581942                        }
    19591943
    19601944                        // 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 );
     1945                        clause2.cond = findSingleExpression( clause.cond, context );
     1946                        clause2.stmt = clause.stmt->accept( *visitor );
    19631947
    19641948                        // set results into stmt
    19651949                        auto n = mutate( stmt );
    1966                         n->clauses[i] = clause2;
     1950                        n->clauses[i] = std::move( clause2 );
    19671951                        stmt = n;
    19681952                }
    19691953
    1970                 if ( stmt->timeout_stmt ) {
     1954                if ( stmt->timeout.stmt ) {
    19711955                        // resolve the timeout as a size_t, the conditions like IfStmt, and stmts normally
     1956                        ast::WaitForStmt::Timeout timeout2;
     1957
    19721958                        ast::ptr< ast::Type > target =
    19731959                                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 );
     1960                        timeout2.time = findSingleExpression( stmt->timeout.time, target, context );
     1961                        timeout2.cond = findSingleExpression( stmt->timeout.cond, context );
     1962                        timeout2.stmt = stmt->timeout.stmt->accept( *visitor );
    19771963
    19781964                        // set results into stmt
    19791965                        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 );
     1966                        n->timeout = std::move( timeout2 );
    19831967                        stmt = n;
    19841968                }
    19851969
    1986                 if ( stmt->else_stmt ) {
     1970                if ( stmt->orElse.stmt ) {
    19871971                        // 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 );
     1972                        ast::WaitForStmt::OrElse orElse2;
     1973
     1974                        orElse2.cond = findSingleExpression( stmt->orElse.cond, context );
     1975                        orElse2.stmt = stmt->orElse.stmt->accept( *visitor );
    19901976
    19911977                        // set results into stmt
    19921978                        auto n = mutate( stmt );
    1993                         n->else_cond = std::move( else_cond );
    1994                         n->else_stmt = std::move( else_stmt );
     1979                        n->orElse = std::move( orElse2 );
    19951980                        stmt = n;
    19961981                }
Note: See TracChangeset for help on using the changeset viewer.