Changes in src/ResolvExpr/Resolver.cc [f6e6a55:9e7236f4]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
rf6e6a55 r9e7236f4 10 10 // Created On : Sun May 17 12:17:01 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Apr 2010:41:00 202213 // Update Count : 24 812 // Last Modified On : Fri Mar 18 10:41:00 2022 13 // Update Count : 247 14 14 // 15 15 … … 427 427 // enumerator initializers should not use the enum type to initialize, since 428 428 // the enum type is still incomplete at this point. Use signed int instead. 429 // TODO: BasicType::SignedInt may not longer be true 429 430 currentObject = CurrentObject( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 430 431 } … … 1477 1478 // enum type is still incomplete at this point. Use `int` instead. 1478 1479 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) { 1497 1481 objectDecl = fixObjectType( objectDecl, context ); 1498 1482 const ast::Type * enumBase = (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base.get()); … … 1738 1722 // Resolve all clauses first 1739 1723 for ( unsigned i = 0; i < stmt->clauses.size(); ++i ) { 1740 const ast::WaitFor Clause & clause = *stmt->clauses[i];1724 const ast::WaitForStmt::Clause & clause = stmt->clauses[i]; 1741 1725 1742 1726 ast::TypeEnvironment env; … … 1744 1728 1745 1729 // 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() ); 1747 1731 1748 1732 if ( funcFinder.candidates.empty() ) { 1749 1733 stringstream ss; 1750 1734 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; 1752 1736 ss << "' in call to waitfor"; 1753 1737 SemanticError( stmt->location, ss.str() ); 1754 1738 } 1755 1739 1756 if ( clause.target _args.empty() ) {1740 if ( clause.target.args.empty() ) { 1757 1741 SemanticError( stmt->location, 1758 1742 "Waitfor clause must have at least one mutex parameter"); … … 1761 1745 // Find all alternatives for all arguments in canonical form 1762 1746 std::vector< CandidateFinder > argFinders = 1763 funcFinder.findSubExprs( clause.target _args );1747 funcFinder.findSubExprs( clause.target.args ); 1764 1748 1765 1749 // List all combinations of arguments … … 1934 1918 1935 1919 // build new clause 1936 a uto 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() ); 1941 1925 const ast::StructDecl * decl_monitor = symtab.lookupStruct( "monitor$" ); 1942 1926 for ( auto arg : argsCandidates.front() ) { … … 1955 1939 ); 1956 1940 1957 clause2 ->target_args.emplace_back( findSingleExpression( init, context ) );1941 clause2.target.args.emplace_back( findSingleExpression( init, context ) ); 1958 1942 } 1959 1943 1960 1944 // 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 ); 1963 1947 1964 1948 // set results into stmt 1965 1949 auto n = mutate( stmt ); 1966 n->clauses[i] = clause2;1950 n->clauses[i] = std::move( clause2 ); 1967 1951 stmt = n; 1968 1952 } 1969 1953 1970 if ( stmt->timeout _stmt ) {1954 if ( stmt->timeout.stmt ) { 1971 1955 // resolve the timeout as a size_t, the conditions like IfStmt, and stmts normally 1956 ast::WaitForStmt::Timeout timeout2; 1957 1972 1958 ast::ptr< ast::Type > target = 1973 1959 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 ); 1977 1963 1978 1964 // set results into stmt 1979 1965 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 ); 1983 1967 stmt = n; 1984 1968 } 1985 1969 1986 if ( stmt-> else_stmt ) {1970 if ( stmt->orElse.stmt ) { 1987 1971 // 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 ); 1990 1976 1991 1977 // set results into stmt 1992 1978 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 ); 1995 1980 stmt = n; 1996 1981 }
Note:
See TracChangeset
for help on using the changeset viewer.