Changes in / [fce4e31:302d84c2]
- Location:
- src
- Files:
-
- 30 edited
-
AST/Convert.cpp (modified) (92 diffs)
-
AST/Expr.hpp (modified) (7 diffs)
-
Common/PassVisitor.h (modified) (5 diffs)
-
Common/PassVisitor.impl.h (modified) (106 diffs)
-
Common/PassVisitor.proto.h (modified) (5 diffs)
-
ResolvExpr/AdjustExprType.cc (modified) (5 diffs)
-
ResolvExpr/CastCost.cc (modified) (10 diffs)
-
ResolvExpr/CommonType.cc (modified) (71 diffs)
-
ResolvExpr/ConversionCost.cc (modified) (25 diffs)
-
ResolvExpr/ConversionCost.h (modified) (2 diffs)
-
ResolvExpr/PtrsAssignable.cc (modified) (4 diffs)
-
ResolvExpr/PtrsCastable.cc (modified) (9 diffs)
-
ResolvExpr/Resolver.cc (modified) (48 diffs)
-
ResolvExpr/Unify.cc (modified) (38 diffs)
-
ResolvExpr/typeops.h (modified) (5 diffs)
-
SymTab/Indexer.cc (modified) (31 diffs)
-
SymTab/Indexer.h (modified) (7 diffs)
-
SymTab/Validate.cc (modified) (67 diffs)
-
SymTab/Validate.h (modified) (2 diffs)
-
SynTree/Attribute.h (modified) (1 diff)
-
SynTree/BaseSyntaxNode.h (modified) (1 diff)
-
SynTree/Constant.h (modified) (2 diffs)
-
SynTree/Declaration.h (modified) (11 diffs)
-
SynTree/Expression.h (modified) (39 diffs)
-
SynTree/Initializer.h (modified) (5 diffs)
-
SynTree/Statement.h (modified) (21 diffs)
-
SynTree/Type.h (modified) (22 diffs)
-
SynTree/Visitor.h (modified) (1 diff)
-
Tuples/Explode.h (modified) (5 diffs)
-
Tuples/TupleAssignment.cc (modified) (27 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
rfce4e31 r302d84c2 1355 1355 ast::Node * node = nullptr; 1356 1356 /// cache of nodes that might be referenced by readonly<> for de-duplication 1357 std::unordered_map< constBaseSyntaxNode *, ast::Node * > cache = {};1357 std::unordered_map< BaseSyntaxNode *, ast::Node * > cache = {}; 1358 1358 1359 1359 // Local Utilities: … … 1422 1422 to<std::vector>::from( make_labels( std::move( labels ) ) ) 1423 1423 1424 static ast::CV::Qualifiers cv( const Type * ty ) { return { ty->tq.val }; }1424 static ast::CV::Qualifiers cv( Type * ty ) { return { ty->get_qualifiers().val }; } 1425 1425 1426 1426 /// returns true and sets `node` if in cache 1427 bool inCache( constBaseSyntaxNode * old ) {1427 bool inCache( BaseSyntaxNode * old ) { 1428 1428 auto it = cache.find( old ); 1429 1429 if ( it == cache.end() ) return false; … … 1434 1434 // Now all the visit functions: 1435 1435 1436 virtual void visit( constObjectDecl * old ) override final {1436 virtual void visit( ObjectDecl * old ) override final { 1437 1437 auto&& type = GET_ACCEPT_1(type, Type); 1438 1438 auto&& init = GET_ACCEPT_1(init, Init); … … 1465 1465 } 1466 1466 1467 virtual void visit( constFunctionDecl * old ) override final {1467 virtual void visit( FunctionDecl * old ) override final { 1468 1468 if ( inCache( old ) ) return; 1469 1469 auto decl = new ast::FunctionDecl{ … … 1498 1498 } 1499 1499 1500 virtual void visit( constStructDecl * old ) override final {1500 virtual void visit( StructDecl * old ) override final { 1501 1501 if ( inCache( old ) ) return; 1502 1502 auto decl = new ast::StructDecl( … … 1523 1523 } 1524 1524 1525 virtual void visit( constUnionDecl * old ) override final {1525 virtual void visit( UnionDecl * old ) override final { 1526 1526 if ( inCache( old ) ) return; 1527 1527 auto decl = new ast::UnionDecl( … … 1543 1543 } 1544 1544 1545 virtual void visit( constEnumDecl * old ) override final {1545 virtual void visit( EnumDecl * old ) override final { 1546 1546 if ( inCache( old ) ) return; 1547 1547 auto decl = new ast::EnumDecl( … … 1563 1563 } 1564 1564 1565 virtual void visit( constTraitDecl * old ) override final {1565 virtual void visit( TraitDecl * old ) override final { 1566 1566 if ( inCache( old ) ) return; 1567 1567 auto decl = new ast::TraitDecl( … … 1583 1583 } 1584 1584 1585 virtual void visit( constTypeDecl * old ) override final {1585 virtual void visit( TypeDecl * old ) override final { 1586 1586 if ( inCache( old ) ) return; 1587 1587 auto decl = new ast::TypeDecl{ … … 1603 1603 } 1604 1604 1605 virtual void visit( constTypedefDecl * old ) override final {1605 virtual void visit( TypedefDecl * old ) override final { 1606 1606 auto decl = new ast::TypedefDecl( 1607 1607 old->location, … … 1620 1620 } 1621 1621 1622 virtual void visit( constAsmDecl * old ) override final {1622 virtual void visit( AsmDecl * old ) override final { 1623 1623 auto decl = new ast::AsmDecl{ 1624 1624 old->location, … … 1632 1632 } 1633 1633 1634 virtual void visit( constStaticAssertDecl * old ) override final {1634 virtual void visit( StaticAssertDecl * old ) override final { 1635 1635 auto decl = new ast::StaticAssertDecl{ 1636 1636 old->location, … … 1645 1645 } 1646 1646 1647 virtual void visit( constCompoundStmt * old ) override final {1647 virtual void visit( CompoundStmt * old ) override final { 1648 1648 if ( inCache( old ) ) return; 1649 1649 auto stmt = new ast::CompoundStmt( … … 1657 1657 } 1658 1658 1659 virtual void visit( constExprStmt * old ) override final {1659 virtual void visit( ExprStmt * old ) override final { 1660 1660 if ( inCache( old ) ) return; 1661 1661 this->node = new ast::ExprStmt( … … 1667 1667 } 1668 1668 1669 virtual void visit( constAsmStmt * old ) override final {1669 virtual void visit( AsmStmt * old ) override final { 1670 1670 if ( inCache( old ) ) return; 1671 1671 this->node = new ast::AsmStmt( … … 1682 1682 } 1683 1683 1684 virtual void visit( constDirectiveStmt * old ) override final {1684 virtual void visit( DirectiveStmt * old ) override final { 1685 1685 if ( inCache( old ) ) return; 1686 1686 this->node = new ast::DirectiveStmt( … … 1692 1692 } 1693 1693 1694 virtual void visit( constIfStmt * old ) override final {1694 virtual void visit( IfStmt * old ) override final { 1695 1695 if ( inCache( old ) ) return; 1696 1696 this->node = new ast::IfStmt( … … 1705 1705 } 1706 1706 1707 virtual void visit( constSwitchStmt * old ) override final {1707 virtual void visit( SwitchStmt * old ) override final { 1708 1708 if ( inCache( old ) ) return; 1709 1709 this->node = new ast::SwitchStmt( … … 1716 1716 } 1717 1717 1718 virtual void visit( constCaseStmt * old ) override final {1718 virtual void visit( CaseStmt * old ) override final { 1719 1719 if ( inCache( old ) ) return; 1720 1720 this->node = new ast::CaseStmt( … … 1727 1727 } 1728 1728 1729 virtual void visit( constWhileStmt * old ) override final {1729 virtual void visit( WhileStmt * old ) override final { 1730 1730 if ( inCache( old ) ) return; 1731 1731 this->node = new ast::WhileStmt( … … 1740 1740 } 1741 1741 1742 virtual void visit( constForStmt * old ) override final {1742 virtual void visit( ForStmt * old ) override final { 1743 1743 if ( inCache( old ) ) return; 1744 1744 this->node = new ast::ForStmt( … … 1753 1753 } 1754 1754 1755 virtual void visit( constBranchStmt * old ) override final {1755 virtual void visit( BranchStmt * old ) override final { 1756 1756 if ( inCache( old ) ) return; 1757 1757 if (old->computedTarget) { … … 1790 1790 } 1791 1791 1792 virtual void visit( constReturnStmt * old ) override final {1792 virtual void visit( ReturnStmt * old ) override final { 1793 1793 if ( inCache( old ) ) return; 1794 1794 this->node = new ast::ReturnStmt( … … 1800 1800 } 1801 1801 1802 virtual void visit( constThrowStmt * old ) override final {1802 virtual void visit( ThrowStmt * old ) override final { 1803 1803 if ( inCache( old ) ) return; 1804 1804 ast::ExceptionKind kind; … … 1824 1824 } 1825 1825 1826 virtual void visit( constTryStmt * old ) override final {1826 virtual void visit( TryStmt * old ) override final { 1827 1827 if ( inCache( old ) ) return; 1828 1828 this->node = new ast::TryStmt( … … 1836 1836 } 1837 1837 1838 virtual void visit( constCatchStmt * old ) override final {1838 virtual void visit( CatchStmt * old ) override final { 1839 1839 if ( inCache( old ) ) return; 1840 1840 ast::ExceptionKind kind; … … 1861 1861 } 1862 1862 1863 virtual void visit( constFinallyStmt * old ) override final {1863 virtual void visit( FinallyStmt * old ) override final { 1864 1864 if ( inCache( old ) ) return; 1865 1865 this->node = new ast::FinallyStmt( … … 1871 1871 } 1872 1872 1873 virtual void visit( constWaitForStmt * old ) override final {1873 virtual void visit( WaitForStmt * old ) override final { 1874 1874 if ( inCache( old ) ) return; 1875 1875 ast::WaitForStmt * stmt = new ast::WaitForStmt( … … 1903 1903 } 1904 1904 1905 virtual void visit( constWithStmt * old ) override final {1905 virtual void visit( WithStmt * old ) override final { 1906 1906 if ( inCache( old ) ) return; 1907 1907 this->node = new ast::WithStmt( … … 1914 1914 } 1915 1915 1916 virtual void visit( constNullStmt * old ) override final {1916 virtual void visit( NullStmt * old ) override final { 1917 1917 if ( inCache( old ) ) return; 1918 1918 this->node = new ast::NullStmt( … … 1923 1923 } 1924 1924 1925 virtual void visit( constDeclStmt * old ) override final {1925 virtual void visit( DeclStmt * old ) override final { 1926 1926 if ( inCache( old ) ) return; 1927 1927 this->node = new ast::DeclStmt( … … 1933 1933 } 1934 1934 1935 virtual void visit( constImplicitCtorDtorStmt * old ) override final {1935 virtual void visit( ImplicitCtorDtorStmt * old ) override final { 1936 1936 if ( inCache( old ) ) return; 1937 1937 auto stmt = new ast::ImplicitCtorDtorStmt( … … 1990 1990 } 1991 1991 1992 ast::Expr * visitBaseExpr_SkipResultType( constExpression * old, ast::Expr * nw) {1992 ast::Expr * visitBaseExpr_SkipResultType(Expression * old, ast::Expr * nw) { 1993 1993 1994 1994 nw->env = convertTypeSubstitution(old->env); … … 2000 2000 } 2001 2001 2002 ast::Expr * visitBaseExpr( constExpression * old, ast::Expr * nw) {2002 ast::Expr * visitBaseExpr(Expression * old, ast::Expr * nw) { 2003 2003 2004 2004 nw->result = GET_ACCEPT_1(result, Type); … … 2006 2006 } 2007 2007 2008 virtual void visit( constApplicationExpr * old ) override final {2008 virtual void visit( ApplicationExpr * old ) override final { 2009 2009 this->node = visitBaseExpr( old, 2010 2010 new ast::ApplicationExpr( … … 2016 2016 } 2017 2017 2018 virtual void visit( constUntypedExpr * old ) override final {2018 virtual void visit( UntypedExpr * old ) override final { 2019 2019 this->node = visitBaseExpr( old, 2020 2020 new ast::UntypedExpr( … … 2026 2026 } 2027 2027 2028 virtual void visit( constNameExpr * old ) override final {2028 virtual void visit( NameExpr * old ) override final { 2029 2029 this->node = visitBaseExpr( old, 2030 2030 new ast::NameExpr( … … 2035 2035 } 2036 2036 2037 virtual void visit( constCastExpr * old ) override final {2037 virtual void visit( CastExpr * old ) override final { 2038 2038 this->node = visitBaseExpr( old, 2039 2039 new ast::CastExpr( … … 2045 2045 } 2046 2046 2047 virtual void visit( constKeywordCastExpr * old) override final {2047 virtual void visit( KeywordCastExpr * old) override final { 2048 2048 ast::KeywordCastExpr::Target castTarget = ast::KeywordCastExpr::NUMBER_OF_TARGETS; 2049 2049 switch (old->target) { … … 2070 2070 } 2071 2071 2072 virtual void visit( constVirtualCastExpr * old ) override final {2072 virtual void visit( VirtualCastExpr * old ) override final { 2073 2073 this->node = visitBaseExpr_SkipResultType( old, 2074 2074 new ast::VirtualCastExpr( … … 2080 2080 } 2081 2081 2082 virtual void visit( constAddressExpr * old ) override final {2082 virtual void visit( AddressExpr * old ) override final { 2083 2083 this->node = visitBaseExpr( old, 2084 2084 new ast::AddressExpr( … … 2089 2089 } 2090 2090 2091 virtual void visit( constLabelAddressExpr * old ) override final {2091 virtual void visit( LabelAddressExpr * old ) override final { 2092 2092 this->node = visitBaseExpr( old, 2093 2093 new ast::LabelAddressExpr( … … 2098 2098 } 2099 2099 2100 virtual void visit( constUntypedMemberExpr * old ) override final {2100 virtual void visit( UntypedMemberExpr * old ) override final { 2101 2101 this->node = visitBaseExpr( old, 2102 2102 new ast::UntypedMemberExpr( … … 2108 2108 } 2109 2109 2110 virtual void visit( constMemberExpr * old ) override final {2110 virtual void visit( MemberExpr * old ) override final { 2111 2111 this->node = visitBaseExpr( old, 2112 2112 new ast::MemberExpr( … … 2118 2118 } 2119 2119 2120 virtual void visit( constVariableExpr * old ) override final {2120 virtual void visit( VariableExpr * old ) override final { 2121 2121 auto expr = new ast::VariableExpr( 2122 2122 old->location … … 2129 2129 } 2130 2130 2131 virtual void visit( constConstantExpr * old ) override final {2131 virtual void visit( ConstantExpr * old ) override final { 2132 2132 ast::ConstantExpr *rslt = new ast::ConstantExpr( 2133 2133 old->location, 2134 2134 GET_ACCEPT_1(result, Type), 2135 old->constant. rep,2135 old->constant.get_value(), 2136 2136 old->constant.ival 2137 2137 ); 2138 rslt->underlyer = getAccept1< ast::Type, Type* >( old->constant. type);2138 rslt->underlyer = getAccept1< ast::Type, Type* >( old->constant.get_type() ); 2139 2139 this->node = visitBaseExpr( old, rslt ); 2140 2140 } 2141 2141 2142 virtual void visit( constSizeofExpr * old ) override final {2142 virtual void visit( SizeofExpr * old ) override final { 2143 2143 assert (old->expr || old->type); 2144 2144 assert (! (old->expr && old->type)); … … 2161 2161 } 2162 2162 2163 virtual void visit( constAlignofExpr * old ) override final {2163 virtual void visit( AlignofExpr * old ) override final { 2164 2164 assert (old->expr || old->type); 2165 2165 assert (! (old->expr && old->type)); … … 2182 2182 } 2183 2183 2184 virtual void visit( constUntypedOffsetofExpr * old ) override final {2184 virtual void visit( UntypedOffsetofExpr * old ) override final { 2185 2185 this->node = visitBaseExpr( old, 2186 2186 new ast::UntypedOffsetofExpr( … … 2192 2192 } 2193 2193 2194 virtual void visit( constOffsetofExpr * old ) override final {2194 virtual void visit( OffsetofExpr * old ) override final { 2195 2195 this->node = visitBaseExpr( old, 2196 2196 new ast::OffsetofExpr( … … 2202 2202 } 2203 2203 2204 virtual void visit( constOffsetPackExpr * old ) override final {2204 virtual void visit( OffsetPackExpr * old ) override final { 2205 2205 this->node = visitBaseExpr( old, 2206 2206 new ast::OffsetPackExpr( … … 2211 2211 } 2212 2212 2213 virtual void visit( constLogicalExpr * old ) override final {2213 virtual void visit( LogicalExpr * old ) override final { 2214 2214 this->node = visitBaseExpr( old, 2215 2215 new ast::LogicalExpr( … … 2224 2224 } 2225 2225 2226 virtual void visit( constConditionalExpr * old ) override final {2226 virtual void visit( ConditionalExpr * old ) override final { 2227 2227 this->node = visitBaseExpr( old, 2228 2228 new ast::ConditionalExpr( … … 2235 2235 } 2236 2236 2237 virtual void visit( constCommaExpr * old ) override final {2237 virtual void visit( CommaExpr * old ) override final { 2238 2238 this->node = visitBaseExpr( old, 2239 2239 new ast::CommaExpr( … … 2245 2245 } 2246 2246 2247 virtual void visit( constTypeExpr * old ) override final {2247 virtual void visit( TypeExpr * old ) override final { 2248 2248 this->node = visitBaseExpr( old, 2249 2249 new ast::TypeExpr( … … 2254 2254 } 2255 2255 2256 virtual void visit( constAsmExpr * old ) override final {2256 virtual void visit( AsmExpr * old ) override final { 2257 2257 this->node = visitBaseExpr( old, 2258 2258 new ast::AsmExpr( … … 2265 2265 } 2266 2266 2267 virtual void visit( constImplicitCopyCtorExpr * old ) override final {2267 virtual void visit( ImplicitCopyCtorExpr * old ) override final { 2268 2268 auto rslt = new ast::ImplicitCopyCtorExpr( 2269 2269 old->location, … … 2274 2274 } 2275 2275 2276 virtual void visit( constConstructorExpr * old ) override final {2276 virtual void visit( ConstructorExpr * old ) override final { 2277 2277 this->node = visitBaseExpr( old, 2278 2278 new ast::ConstructorExpr( … … 2283 2283 } 2284 2284 2285 virtual void visit( constCompoundLiteralExpr * old ) override final {2285 virtual void visit( CompoundLiteralExpr * old ) override final { 2286 2286 this->node = visitBaseExpr_SkipResultType( old, 2287 2287 new ast::CompoundLiteralExpr( … … 2293 2293 } 2294 2294 2295 virtual void visit( constRangeExpr * old ) override final {2295 virtual void visit( RangeExpr * old ) override final { 2296 2296 this->node = visitBaseExpr( old, 2297 2297 new ast::RangeExpr( … … 2303 2303 } 2304 2304 2305 virtual void visit( constUntypedTupleExpr * old ) override final {2305 virtual void visit( UntypedTupleExpr * old ) override final { 2306 2306 this->node = visitBaseExpr( old, 2307 2307 new ast::UntypedTupleExpr( … … 2312 2312 } 2313 2313 2314 virtual void visit( constTupleExpr * old ) override final {2314 virtual void visit( TupleExpr * old ) override final { 2315 2315 this->node = visitBaseExpr( old, 2316 2316 new ast::TupleExpr( … … 2321 2321 } 2322 2322 2323 virtual void visit( constTupleIndexExpr * old ) override final {2323 virtual void visit( TupleIndexExpr * old ) override final { 2324 2324 this->node = visitBaseExpr( old, 2325 2325 new ast::TupleIndexExpr( … … 2331 2331 } 2332 2332 2333 virtual void visit( constTupleAssignExpr * old ) override final {2333 virtual void visit( TupleAssignExpr * old ) override final { 2334 2334 this->node = visitBaseExpr_SkipResultType( old, 2335 2335 new ast::TupleAssignExpr( … … 2341 2341 } 2342 2342 2343 virtual void visit( constStmtExpr * old ) override final {2343 virtual void visit( StmtExpr * old ) override final { 2344 2344 auto rslt = new ast::StmtExpr( 2345 2345 old->location, … … 2352 2352 } 2353 2353 2354 virtual void visit( constUniqueExpr * old ) override final {2354 virtual void visit( UniqueExpr * old ) override final { 2355 2355 auto rslt = new ast::UniqueExpr( 2356 2356 old->location, … … 2364 2364 } 2365 2365 2366 virtual void visit( constUntypedInitExpr * old ) override final {2366 virtual void visit( UntypedInitExpr * old ) override final { 2367 2367 std::deque<ast::InitAlternative> initAlts; 2368 2368 for (auto ia : old->initAlts) { … … 2381 2381 } 2382 2382 2383 virtual void visit( constInitExpr * old ) override final {2383 virtual void visit( InitExpr * old ) override final { 2384 2384 this->node = visitBaseExpr( old, 2385 2385 new ast::InitExpr( … … 2391 2391 } 2392 2392 2393 virtual void visit( constDeletedExpr * old ) override final {2393 virtual void visit( DeletedExpr * old ) override final { 2394 2394 this->node = visitBaseExpr( old, 2395 2395 new ast::DeletedExpr( … … 2403 2403 } 2404 2404 2405 virtual void visit( constDefaultArgExpr * old ) override final {2405 virtual void visit( DefaultArgExpr * old ) override final { 2406 2406 this->node = visitBaseExpr( old, 2407 2407 new ast::DefaultArgExpr( … … 2412 2412 } 2413 2413 2414 virtual void visit( constGenericExpr * old ) override final {2414 virtual void visit( GenericExpr * old ) override final { 2415 2415 std::vector<ast::GenericExpr::Association> associations; 2416 2416 for (auto association : old->associations) { … … 2429 2429 } 2430 2430 2431 void visitType( constType * old, ast::Type * type ) {2431 void visitType( Type * old, ast::Type * type ) { 2432 2432 // Some types do this in their constructor so add a check. 2433 2433 if ( !old->attributes.empty() && type->attributes.empty() ) { … … 2437 2437 } 2438 2438 2439 virtual void visit( constVoidType * old ) override final {2439 virtual void visit( VoidType * old ) override final { 2440 2440 visitType( old, new ast::VoidType{ cv( old ) } ); 2441 2441 } 2442 2442 2443 virtual void visit( constBasicType * old ) override final {2443 virtual void visit( BasicType * old ) override final { 2444 2444 auto type = new ast::BasicType{ (ast::BasicType::Kind)(unsigned)old->kind, cv( old ) }; 2445 2445 // I believe this should always be a BasicType. … … 2450 2450 } 2451 2451 2452 virtual void visit( constPointerType * old ) override final {2452 virtual void visit( PointerType * old ) override final { 2453 2453 visitType( old, new ast::PointerType{ 2454 2454 GET_ACCEPT_1( base, Type ), … … 2460 2460 } 2461 2461 2462 virtual void visit( constArrayType * old ) override final {2462 virtual void visit( ArrayType * old ) override final { 2463 2463 visitType( old, new ast::ArrayType{ 2464 2464 GET_ACCEPT_1( base, Type ), … … 2470 2470 } 2471 2471 2472 virtual void visit( constReferenceType * old ) override final {2472 virtual void visit( ReferenceType * old ) override final { 2473 2473 visitType( old, new ast::ReferenceType{ 2474 2474 GET_ACCEPT_1( base, Type ), … … 2477 2477 } 2478 2478 2479 virtual void visit( constQualifiedType * old ) override final {2479 virtual void visit( QualifiedType * old ) override final { 2480 2480 visitType( old, new ast::QualifiedType{ 2481 2481 GET_ACCEPT_1( parent, Type ), … … 2485 2485 } 2486 2486 2487 virtual void visit( constFunctionType * old ) override final {2487 virtual void visit( FunctionType * old ) override final { 2488 2488 auto ty = new ast::FunctionType { 2489 2489 (ast::ArgumentFlag)old->isVarArgs, … … 2496 2496 } 2497 2497 2498 void postvisit( constReferenceToType * old, ast::ReferenceToType * ty ) {2498 void postvisit( ReferenceToType * old, ast::ReferenceToType * ty ) { 2499 2499 ty->forall = GET_ACCEPT_V( forall, TypeDecl ); 2500 2500 ty->params = GET_ACCEPT_V( parameters, Expr ); … … 2503 2503 } 2504 2504 2505 virtual void visit( constStructInstType * old ) override final {2505 virtual void visit( StructInstType * old ) override final { 2506 2506 ast::StructInstType * ty; 2507 2507 if ( old->baseStruct ) { … … 2521 2521 } 2522 2522 2523 virtual void visit( constUnionInstType * old ) override final {2523 virtual void visit( UnionInstType * old ) override final { 2524 2524 ast::UnionInstType * ty; 2525 2525 if ( old->baseUnion ) { … … 2539 2539 } 2540 2540 2541 virtual void visit( constEnumInstType * old ) override final {2541 virtual void visit( EnumInstType * old ) override final { 2542 2542 ast::EnumInstType * ty; 2543 2543 if ( old->baseEnum ) { … … 2557 2557 } 2558 2558 2559 virtual void visit( constTraitInstType * old ) override final {2559 virtual void visit( TraitInstType * old ) override final { 2560 2560 ast::TraitInstType * ty; 2561 2561 if ( old->baseTrait ) { … … 2575 2575 } 2576 2576 2577 virtual void visit( constTypeInstType * old ) override final {2577 virtual void visit( TypeInstType * old ) override final { 2578 2578 ast::TypeInstType * ty; 2579 2579 if ( old->baseType ) { … … 2595 2595 } 2596 2596 2597 virtual void visit( constTupleType * old ) override final {2597 virtual void visit( TupleType * old ) override final { 2598 2598 visitType( old, new ast::TupleType{ 2599 2599 GET_ACCEPT_V( types, Type ), … … 2603 2603 } 2604 2604 2605 virtual void visit( constTypeofType * old ) override final {2605 virtual void visit( TypeofType * old ) override final { 2606 2606 visitType( old, new ast::TypeofType{ 2607 2607 GET_ACCEPT_1( expr, Expr ), … … 2611 2611 } 2612 2612 2613 virtual void visit( constAttrType * ) override final {2613 virtual void visit( AttrType * ) override final { 2614 2614 assertf( false, "AttrType deprecated in new AST." ); 2615 2615 } 2616 2616 2617 virtual void visit( constVarArgsType * old ) override final {2617 virtual void visit( VarArgsType * old ) override final { 2618 2618 visitType( old, new ast::VarArgsType{ cv( old ) } ); 2619 2619 } 2620 2620 2621 virtual void visit( constZeroType * old ) override final {2621 virtual void visit( ZeroType * old ) override final { 2622 2622 visitType( old, new ast::ZeroType{ cv( old ) } ); 2623 2623 } 2624 2624 2625 virtual void visit( constOneType * old ) override final {2625 virtual void visit( OneType * old ) override final { 2626 2626 visitType( old, new ast::OneType{ cv( old ) } ); 2627 2627 } 2628 2628 2629 virtual void visit( constGlobalScopeType * old ) override final {2629 virtual void visit( GlobalScopeType * old ) override final { 2630 2630 visitType( old, new ast::GlobalScopeType{} ); 2631 2631 } 2632 2632 2633 virtual void visit( constDesignation * old ) override final {2633 virtual void visit( Designation * old ) override final { 2634 2634 this->node = new ast::Designation( 2635 2635 old->location, … … 2638 2638 } 2639 2639 2640 virtual void visit( constSingleInit * old ) override final {2640 virtual void visit( SingleInit * old ) override final { 2641 2641 this->node = new ast::SingleInit( 2642 2642 old->location, … … 2646 2646 } 2647 2647 2648 virtual void visit( constListInit * old ) override final {2648 virtual void visit( ListInit * old ) override final { 2649 2649 this->node = new ast::ListInit( 2650 2650 old->location, … … 2655 2655 } 2656 2656 2657 virtual void visit( constConstructorInit * old ) override final {2657 virtual void visit( ConstructorInit * old ) override final { 2658 2658 this->node = new ast::ConstructorInit( 2659 2659 old->location, … … 2664 2664 } 2665 2665 2666 virtual void visit( constConstant * ) override final {2666 virtual void visit( Constant * ) override final { 2667 2667 // Handled in visit( ConstantEpxr * ). 2668 2668 // In the new tree, Constant fields are inlined into containing ConstantExpression. … … 2670 2670 } 2671 2671 2672 virtual void visit( constAttribute * old ) override final {2672 virtual void visit( Attribute * old ) override final { 2673 2673 this->node = new ast::Attribute( 2674 2674 old->name, … … 2677 2677 } 2678 2678 2679 virtual void visit( constAttrExpr * ) override final {2679 virtual void visit( AttrExpr * ) override final { 2680 2680 assertf( false, "AttrExpr deprecated in new AST." ); 2681 2681 } -
src/AST/Expr.hpp
rfce4e31 r302d84c2 47 47 48 48 ParamEntry() : decl( 0 ), declptr( nullptr ), actualType( nullptr ), formalType( nullptr ), expr( nullptr ) {} 49 ParamEntry( 50 UniqueId id, const Decl * declptr, const Type * actual, const Type * formal, 49 ParamEntry( 50 UniqueId id, const Decl * declptr, const Type * actual, const Type * formal, 51 51 const Expr * e ) 52 52 : decl( id ), declptr( declptr ), actualType( actual ), formalType( formal ), expr( e ) {} … … 112 112 case Empty: new(&data.resnSlots) ResnSlots{}; mode = Slots; // fallthrough 113 113 case Slots: return data.resnSlots; 114 case Params: assert f(false, "Cannot return to resnSlots from Params"); abort();114 case Params: assert(!"Cannot return to resnSlots from Params"); 115 115 } 116 return *((ResnSlots*)nullptr); 116 117 } 117 118 … … 120 121 return data.resnSlots; 121 122 } 122 assert f(false,"Mode was not already resnSlots");123 abort();123 assert(!"Mode was not already resnSlots"); 124 return *((ResnSlots*)nullptr); 124 125 } 125 126 … … 130 131 case Params: return data.inferParams; 131 132 } 132 assertf(false, "unreachable"); 133 assert(!"unreachable"); 134 return *((InferredParams*)nullptr); 133 135 } 134 136 … … 137 139 return data.inferParams; 138 140 } 139 assert f(false,"Mode was not already Params");140 abort();141 assert(!"Mode was not already Params"); 142 return *((InferredParams*)nullptr); 141 143 } 142 144 143 145 void set_inferParams( InferredParams && ps ) { 144 146 switch(mode) { 145 case Slots: 147 case Slots: 146 148 data.resnSlots.~ResnSlots(); 147 149 // fallthrough 148 case Empty: 150 case Empty: 149 151 new(&data.inferParams) InferredParams{ std::move( ps ) }; 150 152 mode = Params; … … 170 172 data.inferParams[p.first] = std::move(p.second); 171 173 } 172 } else assert f(false,"invalid mode");174 } else assert(!"invalid mode"); 173 175 } 174 176 }; … … 382 384 383 385 ConstantExpr( 384 const CodeLocation & loc, const Type * ty, const std::string & r, 386 const CodeLocation & loc, const Type * ty, const std::string & r, 385 387 std::optional<unsigned long long> i ) 386 388 : Expr( loc, ty ), rep( r ), ival( i ) {} -
src/Common/PassVisitor.h
rfce4e31 r302d84c2 60 60 61 61 virtual void visit( ObjectDecl * objectDecl ) override final; 62 virtual void visit( const ObjectDecl * objectDecl ) override final;63 62 virtual void visit( FunctionDecl * functionDecl ) override final; 64 virtual void visit( const FunctionDecl * functionDecl ) override final;65 63 virtual void visit( StructDecl * aggregateDecl ) override final; 66 virtual void visit( const StructDecl * aggregateDecl ) override final;67 64 virtual void visit( UnionDecl * aggregateDecl ) override final; 68 virtual void visit( const UnionDecl * aggregateDecl ) override final;69 65 virtual void visit( EnumDecl * aggregateDecl ) override final; 70 virtual void visit( const EnumDecl * aggregateDecl ) override final;71 66 virtual void visit( TraitDecl * aggregateDecl ) override final; 72 virtual void visit( const TraitDecl * aggregateDecl ) override final;73 67 virtual void visit( TypeDecl * typeDecl ) override final; 74 virtual void visit( const TypeDecl * typeDecl ) override final;75 68 virtual void visit( TypedefDecl * typeDecl ) override final; 76 virtual void visit( const TypedefDecl * typeDecl ) override final;77 69 virtual void visit( AsmDecl * asmDecl ) override final; 78 virtual void visit( const AsmDecl * asmDecl ) override final;79 70 virtual void visit( StaticAssertDecl * assertDecl ) override final; 80 virtual void visit( const StaticAssertDecl * assertDecl ) override final;81 71 82 72 virtual void visit( CompoundStmt * compoundStmt ) override final; 83 virtual void visit( const CompoundStmt * compoundStmt ) override final;84 73 virtual void visit( ExprStmt * exprStmt ) override final; 85 virtual void visit( const ExprStmt * exprStmt ) override final;86 74 virtual void visit( AsmStmt * asmStmt ) override final; 87 virtual void visit( const AsmStmt * asmStmt ) override final;88 75 virtual void visit( DirectiveStmt * dirStmt ) override final; 89 virtual void visit( const DirectiveStmt * dirStmt ) override final;90 76 virtual void visit( IfStmt * ifStmt ) override final; 91 virtual void visit( const IfStmt * ifStmt ) override final;92 77 virtual void visit( WhileStmt * whileStmt ) override final; 93 virtual void visit( const WhileStmt * whileStmt ) override final;94 78 virtual void visit( ForStmt * forStmt ) override final; 95 virtual void visit( const ForStmt * forStmt ) override final;96 79 virtual void visit( SwitchStmt * switchStmt ) override final; 97 virtual void visit( const SwitchStmt * switchStmt ) override final;98 80 virtual void visit( CaseStmt * caseStmt ) override final; 99 virtual void visit( const CaseStmt * caseStmt ) override final;100 81 virtual void visit( BranchStmt * branchStmt ) override final; 101 virtual void visit( const BranchStmt * branchStmt ) override final;102 82 virtual void visit( ReturnStmt * returnStmt ) override final; 103 virtual void visit( const ReturnStmt * returnStmt ) override final;104 83 virtual void visit( ThrowStmt * throwStmt ) override final; 105 virtual void visit( const ThrowStmt * throwStmt ) override final;106 84 virtual void visit( TryStmt * tryStmt ) override final; 107 virtual void visit( const TryStmt * tryStmt ) override final;108 85 virtual void visit( CatchStmt * catchStmt ) override final; 109 virtual void visit( const CatchStmt * catchStmt ) override final;110 86 virtual void visit( FinallyStmt * finallyStmt ) override final; 111 virtual void visit( const FinallyStmt * finallyStmt ) override final;112 87 virtual void visit( WaitForStmt * waitforStmt ) override final; 113 virtual void visit( const WaitForStmt * waitforStmt ) override final;114 88 virtual void visit( WithStmt * withStmt ) override final; 115 virtual void visit( const WithStmt * withStmt ) override final;116 89 virtual void visit( NullStmt * nullStmt ) override final; 117 virtual void visit( const NullStmt * nullStmt ) override final;118 90 virtual void visit( DeclStmt * declStmt ) override final; 119 virtual void visit( const DeclStmt * declStmt ) override final;120 91 virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final; 121 virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) override final;122 92 123 93 virtual void visit( ApplicationExpr * applicationExpr ) override final; 124 virtual void visit( const ApplicationExpr * applicationExpr ) override final;125 94 virtual void visit( UntypedExpr * untypedExpr ) override final; 126 virtual void visit( const UntypedExpr * untypedExpr ) override final;127 95 virtual void visit( NameExpr * nameExpr ) override final; 128 virtual void visit( const NameExpr * nameExpr ) override final;129 96 virtual void visit( CastExpr * castExpr ) override final; 130 virtual void visit( const CastExpr * castExpr ) override final;131 97 virtual void visit( KeywordCastExpr * castExpr ) override final; 132 virtual void visit( const KeywordCastExpr * castExpr ) override final;133 98 virtual void visit( VirtualCastExpr * castExpr ) override final; 134 virtual void visit( const VirtualCastExpr * castExpr ) override final;135 99 virtual void visit( AddressExpr * addressExpr ) override final; 136 virtual void visit( const AddressExpr * addressExpr ) override final;137 100 virtual void visit( LabelAddressExpr * labAddressExpr ) override final; 138 virtual void visit( const LabelAddressExpr * labAddressExpr ) override final;139 101 virtual void visit( UntypedMemberExpr * memberExpr ) override final; 140 virtual void visit( const UntypedMemberExpr * memberExpr ) override final;141 102 virtual void visit( MemberExpr * memberExpr ) override final; 142 virtual void visit( const MemberExpr * memberExpr ) override final;143 103 virtual void visit( VariableExpr * variableExpr ) override final; 144 virtual void visit( const VariableExpr * variableExpr ) override final;145 104 virtual void visit( ConstantExpr * constantExpr ) override final; 146 virtual void visit( const ConstantExpr * constantExpr ) override final;147 105 virtual void visit( SizeofExpr * sizeofExpr ) override final; 148 virtual void visit( const SizeofExpr * sizeofExpr ) override final;149 106 virtual void visit( AlignofExpr * alignofExpr ) override final; 150 virtual void visit( const AlignofExpr * alignofExpr ) override final;151 107 virtual void visit( UntypedOffsetofExpr * offsetofExpr ) override final; 152 virtual void visit( const UntypedOffsetofExpr * offsetofExpr ) override final;153 108 virtual void visit( OffsetofExpr * offsetofExpr ) override final; 154 virtual void visit( const OffsetofExpr * offsetofExpr ) override final;155 109 virtual void visit( OffsetPackExpr * offsetPackExpr ) override final; 156 virtual void visit( const OffsetPackExpr * offsetPackExpr ) override final;157 110 virtual void visit( AttrExpr * attrExpr ) override final; 158 virtual void visit( const AttrExpr * attrExpr ) override final;159 111 virtual void visit( LogicalExpr * logicalExpr ) override final; 160 virtual void visit( const LogicalExpr * logicalExpr ) override final;161 112 virtual void visit( ConditionalExpr * conditionalExpr ) override final; 162 virtual void visit( const ConditionalExpr * conditionalExpr ) override final;163 113 virtual void visit( CommaExpr * commaExpr ) override final; 164 virtual void visit( const CommaExpr * commaExpr ) override final;165 114 virtual void visit( TypeExpr * typeExpr ) override final; 166 virtual void visit( const TypeExpr * typeExpr ) override final;167 115 virtual void visit( AsmExpr * asmExpr ) override final; 168 virtual void visit( const AsmExpr * asmExpr ) override final;169 116 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override final; 170 virtual void visit( const ImplicitCopyCtorExpr * impCpCtorExpr ) override final;171 117 virtual void visit( ConstructorExpr * ctorExpr ) override final; 172 virtual void visit( const ConstructorExpr * ctorExpr ) override final;173 118 virtual void visit( CompoundLiteralExpr * compLitExpr ) override final; 174 virtual void visit( const CompoundLiteralExpr * compLitExpr ) override final;175 119 virtual void visit( RangeExpr * rangeExpr ) override final; 176 virtual void visit( const RangeExpr * rangeExpr ) override final;177 120 virtual void visit( UntypedTupleExpr * tupleExpr ) override final; 178 virtual void visit( const UntypedTupleExpr * tupleExpr ) override final;179 121 virtual void visit( TupleExpr * tupleExpr ) override final; 180 virtual void visit( const TupleExpr * tupleExpr ) override final;181 122 virtual void visit( TupleIndexExpr * tupleExpr ) override final; 182 virtual void visit( const TupleIndexExpr * tupleExpr ) override final;183 123 virtual void visit( TupleAssignExpr * assignExpr ) override final; 184 virtual void visit( const TupleAssignExpr * assignExpr ) override final;185 124 virtual void visit( StmtExpr * stmtExpr ) override final; 186 virtual void visit( const StmtExpr * stmtExpr ) override final;187 125 virtual void visit( UniqueExpr * uniqueExpr ) override final; 188 virtual void visit( const UniqueExpr * uniqueExpr ) override final;189 126 virtual void visit( UntypedInitExpr * initExpr ) override final; 190 virtual void visit( const UntypedInitExpr * initExpr ) override final;191 127 virtual void visit( InitExpr * initExpr ) override final; 192 virtual void visit( const InitExpr * initExpr ) override final;193 128 virtual void visit( DeletedExpr * delExpr ) override final; 194 virtual void visit( const DeletedExpr * delExpr ) override final;195 129 virtual void visit( DefaultArgExpr * argExpr ) override final; 196 virtual void visit( const DefaultArgExpr * argExpr ) override final;197 130 virtual void visit( GenericExpr * genExpr ) override final; 198 virtual void visit( const GenericExpr * genExpr ) override final;199 131 200 132 virtual void visit( VoidType * basicType ) override final; 201 virtual void visit( const VoidType * basicType ) override final;202 133 virtual void visit( BasicType * basicType ) override final; 203 virtual void visit( const BasicType * basicType ) override final;204 134 virtual void visit( PointerType * pointerType ) override final; 205 virtual void visit( const PointerType * pointerType ) override final;206 135 virtual void visit( ArrayType * arrayType ) override final; 207 virtual void visit( const ArrayType * arrayType ) override final;208 136 virtual void visit( ReferenceType * referenceType ) override final; 209 virtual void visit( const ReferenceType * referenceType ) override final;210 137 virtual void visit( QualifiedType * qualType ) override final; 211 virtual void visit( const QualifiedType * qualType ) override final;212 138 virtual void visit( FunctionType * functionType ) override final; 213 virtual void visit( const FunctionType * functionType ) override final;214 139 virtual void visit( StructInstType * aggregateUseType ) override final; 215 virtual void visit( const StructInstType * aggregateUseType ) override final;216 140 virtual void visit( UnionInstType * aggregateUseType ) override final; 217 virtual void visit( const UnionInstType * aggregateUseType ) override final;218 141 virtual void visit( EnumInstType * aggregateUseType ) override final; 219 virtual void visit( const EnumInstType * aggregateUseType ) override final;220 142 virtual void visit( TraitInstType * aggregateUseType ) override final; 221 virtual void visit( const TraitInstType * aggregateUseType ) override final;222 143 virtual void visit( TypeInstType * aggregateUseType ) override final; 223 virtual void visit( const TypeInstType * aggregateUseType ) override final;224 144 virtual void visit( TupleType * tupleType ) override final; 225 virtual void visit( const TupleType * tupleType ) override final;226 145 virtual void visit( TypeofType * typeofType ) override final; 227 virtual void visit( const TypeofType * typeofType ) override final;228 146 virtual void visit( AttrType * attrType ) override final; 229 virtual void visit( const AttrType * attrType ) override final;230 147 virtual void visit( VarArgsType * varArgsType ) override final; 231 virtual void visit( const VarArgsType * varArgsType ) override final;232 148 virtual void visit( ZeroType * zeroType ) override final; 233 virtual void visit( const ZeroType * zeroType ) override final;234 149 virtual void visit( OneType * oneType ) override final; 235 virtual void visit( const OneType * oneType ) override final;236 150 virtual void visit( GlobalScopeType * globalType ) override final; 237 virtual void visit( const GlobalScopeType * globalType ) override final;238 151 239 152 virtual void visit( Designation * designation ) override final; 240 virtual void visit( const Designation * designation ) override final;241 153 virtual void visit( SingleInit * singleInit ) override final; 242 virtual void visit( const SingleInit * singleInit ) override final;243 154 virtual void visit( ListInit * listInit ) override final; 244 virtual void visit( const ListInit * listInit ) override final;245 155 virtual void visit( ConstructorInit * ctorInit ) override final; 246 virtual void visit( const ConstructorInit * ctorInit ) override final;247 156 248 157 virtual void visit( Constant * constant ) override final; 249 virtual void visit( const Constant * constant ) override final;250 158 251 159 virtual void visit( Attribute * attribute ) override final; 252 virtual void visit( const Attribute * attribute ) override final;253 160 254 161 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override final; … … 358 265 359 266 template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 360 template<typename pass_t> friend void acceptAll( const std::list< const Declaration * > &decls, PassVisitor< pass_t >& visitor );361 267 template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 362 268 template< typename TreeType, typename pass_t > friend void maybeAccept_impl( TreeType * tree, PassVisitor< pass_t > & visitor ); 363 template< typename TreeType, typename pass_t > friend void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_t > & visitor );364 269 template< typename TreeType, typename pass_t > friend void maybeMutate_impl( TreeType *& tree, PassVisitor< pass_t > & mutator ); 365 270 template< typename Container, typename pass_t > friend void maybeAccept_impl( Container & container, PassVisitor< pass_t > & visitor ); 366 template< typename Container, typename pass_t > friend void maybeAccept_impl( const Container & container, PassVisitor< pass_t > & visitor );367 271 template< typename Container, typename pass_t > friend void maybeMutate_impl( Container & container, PassVisitor< pass_t > & mutator ); 368 272 369 273 template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); } 370 template<typename node_type> void call_previsit ( const node_type * node ) { previsit_impl ( pass, node, 0 ); }371 274 template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); } 372 template<typename node_type> void call_postvisit( const node_type * node ) { postvisit_impl( pass, node, 0 ); }373 275 374 276 template<typename node_type> void call_premutate ( node_type * node ) { premutate_impl( pass, node, 0 ); } … … 384 286 void visitStatementList ( std::list< Statement* > &statements ); 385 287 void mutateStatementList( std::list< Statement* > &statements ); 386 void visitStatementList ( const std::list< Statement * > & statements );387 288 388 289 template< typename func_t > … … 390 291 Statement * visitStatement ( Statement * stmt ); 391 292 Statement * mutateStatement( Statement * stmt ); 392 void visitStatement ( const Statement * stmt );393 293 394 294 template< typename func_t > … … 396 296 Expression * visitExpression ( Expression * expr ); 397 297 Expression * mutateExpression( Expression * expr ); 398 void visitExpression ( const Expression * expr );399 298 400 299 -
src/Common/PassVisitor.impl.h
rfce4e31 r302d84c2 80 80 81 81 template< typename pass_type > 82 inline void acceptAll( const std::list< const Declaration * > & decls, PassVisitor< pass_type >& visitor ) {83 SemanticErrorException errors;84 85 pass_visitor_stats.depth++;86 pass_visitor_stats.max->push(pass_visitor_stats.depth);87 pass_visitor_stats.avg->push(pass_visitor_stats.depth);88 for ( const Declaration * decl : decls ) {89 try {90 // run visitor on declaration91 maybeAccept_impl( decl, visitor );92 }93 catch( SemanticErrorException &e ) {94 errors.append( e );95 }96 }97 pass_visitor_stats.depth--;98 if ( ! errors.isEmpty() ) {99 throw errors;100 }101 }102 103 template< typename pass_type >104 82 inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 105 83 DeclList_t* beforeDecls = mutator.get_beforeDecls(); … … 139 117 } 140 118 141 template< typename TreeType, typename pass_type >142 inline void maybeAccept_impl( const TreeType * tree, PassVisitor< pass_type > & visitor ) {143 if ( ! visitor.get_visit_children() ) return;144 if ( tree ) {145 tree->accept( visitor );146 }147 }148 149 119 template< typename Container, typename pass_type > 150 120 inline void maybeAccept_impl( Container & container, PassVisitor< pass_type > & visitor ) { … … 159 129 if ( *i ) { 160 130 (*i)->accept( visitor ); 161 }162 } catch( SemanticErrorException &e ) {163 errors.append( e );164 }165 }166 pass_visitor_stats.depth--;167 if ( ! errors.isEmpty() ) {168 throw errors;169 }170 }171 172 template< typename Container, typename pass_type >173 inline void maybeAccept_impl( const Container & container, PassVisitor< pass_type > & visitor ) {174 if ( ! visitor.get_visit_children() ) return;175 SemanticErrorException errors;176 177 pass_visitor_stats.depth++;178 pass_visitor_stats.max->push(pass_visitor_stats.depth);179 pass_visitor_stats.avg->push(pass_visitor_stats.depth);180 for ( const auto & i : container ) {181 try {182 if ( i ) {183 i->accept( visitor );184 131 } 185 132 } catch( SemanticErrorException &e ) { … … 280 227 281 228 template< typename pass_type > 282 void PassVisitor< pass_type >::visitStatementList( const std::list< Statement * > & statements ) {283 if ( ! get_visit_children() ) return;284 SemanticErrorException errors;285 286 pass_visitor_stats.depth++;287 pass_visitor_stats.max->push(pass_visitor_stats.depth);288 pass_visitor_stats.avg->push(pass_visitor_stats.depth);289 for ( const Statement * i : statements ) {290 try {291 maybeAccept_impl( i, *this );292 } catch ( SemanticErrorException &e ) {293 errors.append( e );294 }295 }296 pass_visitor_stats.depth--;297 if ( !errors.isEmpty() ) { throw errors; }298 }299 300 template< typename pass_type >301 229 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 302 230 handleStatementList( statements, [this]( Statement *& stmt) { … … 347 275 348 276 template< typename pass_type > 349 void PassVisitor< pass_type >::visitStatement( const Statement * stmt ) {350 if ( ! get_visit_children() ) return;351 352 // don't want statements from outer CompoundStmts to be added to this CompoundStmt353 ValueGuardPtr< typename std::remove_pointer<decltype(get_env_ptr())>::type > oldEnv( get_env_ptr() );354 355 maybeAccept_impl( stmt, *this );356 }357 358 template< typename pass_type >359 277 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 360 278 return handleStatement( stmt, [this]( Statement * stmt ) { … … 388 306 389 307 template< typename pass_type > 390 void PassVisitor< pass_type >::visitExpression( const Expression * expr ) {391 if ( ! get_visit_children() ) return;392 if( !expr ) return;393 394 auto env_ptr = get_env_ptr();395 if ( env_ptr && expr->get_env() ) {396 *env_ptr = expr->get_env();397 }398 399 maybeAccept_impl( expr, *this );400 }401 402 template< typename pass_type >403 308 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 404 309 return handleExpression(expr, [this]( Expression * expr ) { … … 410 315 template< typename TreeType, typename VisitorType > 411 316 inline void indexerScopedAccept( TreeType * tree, VisitorType & visitor ) { 412 if ( ! visitor.get_visit_children() ) return;413 auto guard = makeFuncGuard(414 [&visitor]() { visitor.indexerScopeEnter(); },415 [&visitor]() { visitor.indexerScopeLeave(); }416 );417 maybeAccept_impl( tree, visitor );418 }419 420 template< typename TreeType, typename VisitorType >421 inline void indexerScopedAccept( const TreeType * tree, VisitorType & visitor ) {422 317 if ( ! visitor.get_visit_children() ) return; 423 318 auto guard = makeFuncGuard( … … 477 372 478 373 indexerAddId( node ); 479 480 VISIT_END( node );481 }482 483 template< typename pass_type >484 void PassVisitor< pass_type >::visit( const ObjectDecl * node ) {485 VISIT_START( node );486 487 maybeAccept_impl( node->type , *this );488 maybeAccept_impl( node->init , *this );489 maybeAccept_impl( node->bitfieldWidth, *this );490 maybeAccept_impl( node->attributes , *this );491 374 492 375 VISIT_END( node ); … … 545 428 546 429 template< typename pass_type > 547 void PassVisitor< pass_type >::visit( const FunctionDecl * node ) {548 VISIT_START( node );549 550 maybeAccept_impl( node->withExprs, *this );551 {552 // implicit add __func__ identifier as specified in the C manual 6.4.2.2553 static ObjectDecl func(554 "__func__", noStorageClasses, LinkageSpec::C, nullptr,555 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),556 nullptr557 );558 maybeAccept_impl( node->type, *this );559 // function body needs to have the same scope as parameters - CompoundStmt will not enter560 // a new scope if inFunction is true561 ValueGuard< bool > oldInFunction( inFunction );562 inFunction = true;563 maybeAccept_impl( node->statements, *this );564 maybeAccept_impl( node->attributes, *this );565 }566 567 VISIT_END( node );568 }569 570 template< typename pass_type >571 430 DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) { 572 431 MUTATE_START( node ); … … 625 484 626 485 template< typename pass_type > 627 void PassVisitor< pass_type >::visit( const StructDecl * node ) {628 VISIT_START( node );629 630 maybeAccept_impl( node->parameters, *this );631 maybeAccept_impl( node->members , *this );632 633 VISIT_END( node );634 }635 636 template< typename pass_type >637 486 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 638 487 MUTATE_START( node ); … … 673 522 VISIT_END( node ); 674 523 } 675 template< typename pass_type >676 void PassVisitor< pass_type >::visit( const UnionDecl * node ) {677 VISIT_START( node );678 679 maybeAccept_impl( node->parameters, *this );680 maybeAccept_impl( node->members , *this );681 682 VISIT_END( node );683 }684 524 685 525 template< typename pass_type > … … 717 557 718 558 template< typename pass_type > 719 void PassVisitor< pass_type >::visit( const EnumDecl * node ) {720 VISIT_START( node );721 722 // unlike structs, traits, and unions, enums inject their members into the global scope723 maybeAccept_impl( node->parameters, *this );724 maybeAccept_impl( node->members , *this );725 726 VISIT_END( node );727 }728 729 template< typename pass_type >730 559 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) { 731 560 MUTATE_START( node ); … … 758 587 759 588 template< typename pass_type > 760 void PassVisitor< pass_type >::visit( const TraitDecl * node ) {761 VISIT_START( node );762 763 maybeAccept_impl( node->parameters, *this );764 maybeAccept_impl( node->members , *this );765 766 VISIT_END( node );767 }768 769 template< typename pass_type >770 589 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) { 771 590 MUTATE_START( node ); … … 806 625 } 807 626 808 809 template< typename pass_type >810 void PassVisitor< pass_type >::visit( const TypeDecl * node ) {811 VISIT_START( node );812 813 maybeAccept_impl( node->parameters, *this );814 maybeAccept_impl( node->base , *this );815 maybeAccept_impl( node->assertions, *this );816 817 VISIT_END( node );818 }819 820 627 template< typename pass_type > 821 628 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { … … 860 667 861 668 template< typename pass_type > 862 void PassVisitor< pass_type >::visit( const TypedefDecl * node ) {863 VISIT_START( node );864 865 maybeAccept_impl( node->parameters, *this );866 maybeAccept_impl( node->base , *this );867 maybeAccept_impl( node->assertions, *this );868 869 VISIT_END( node );870 }871 872 template< typename pass_type >873 669 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) { 874 670 MUTATE_START( node ); … … 899 695 900 696 template< typename pass_type > 901 void PassVisitor< pass_type >::visit( const AsmDecl * node ) {902 VISIT_START( node );903 904 maybeAccept_impl( node->stmt, *this );905 906 VISIT_END( node );907 }908 909 template< typename pass_type >910 697 AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) { 911 698 MUTATE_START( node ); … … 923 710 924 711 node->condition = visitExpression( node->condition ); 925 maybeAccept_impl( node->message, *this );926 927 VISIT_END( node );928 }929 930 template< typename pass_type >931 void PassVisitor< pass_type >::visit( const StaticAssertDecl * node ) {932 VISIT_START( node );933 934 visitExpression( node->condition );935 712 maybeAccept_impl( node->message, *this ); 936 713 … … 965 742 966 743 template< typename pass_type > 967 void PassVisitor< pass_type >::visit( const CompoundStmt * node ) {968 VISIT_START( node );969 {970 // do not enter a new scope if inFunction is true - needs to check old state before the assignment971 ValueGuard< bool > oldInFunction( inFunction );972 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } );973 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } );974 inFunction = false;975 visitStatementList( node->kids );976 }977 VISIT_END( node );978 }979 980 template< typename pass_type >981 744 CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) { 982 745 MUTATE_START( node ); … … 1004 767 1005 768 template< typename pass_type > 1006 void PassVisitor< pass_type >::visit( const ExprStmt * node ) {1007 VISIT_START( node );1008 1009 visitExpression( node->expr );1010 1011 VISIT_END( node );1012 }1013 1014 template< typename pass_type >1015 769 Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) { 1016 770 MUTATE_START( node ); … … 1036 790 1037 791 template< typename pass_type > 1038 void PassVisitor< pass_type >::visit( const AsmStmt * node ) {1039 VISIT_START( node )1040 1041 maybeAccept_impl( node->instruction, *this );1042 maybeAccept_impl( node->output, *this );1043 maybeAccept_impl( node->input, *this );1044 maybeAccept_impl( node->clobber, *this );1045 1046 VISIT_END( node );1047 }1048 1049 template< typename pass_type >1050 792 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 1051 793 MUTATE_START( node ); … … 1069 811 1070 812 template< typename pass_type > 1071 void PassVisitor< pass_type >::visit( const DirectiveStmt * node ) {1072 VISIT_START( node )1073 1074 VISIT_END( node );1075 }1076 1077 template< typename pass_type >1078 813 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) { 1079 814 MUTATE_START( node ); … … 1090 825 // if statements introduce a level of scope (for the initialization) 1091 826 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1092 maybeAccept_impl( node-> initialization, *this );827 maybeAccept_impl( node->get_initialization(), *this ); 1093 828 visitExpression ( node->condition ); 1094 829 node->thenPart = visitStatement( node->thenPart ); … … 1099 834 1100 835 template< typename pass_type > 1101 void PassVisitor< pass_type >::visit( const IfStmt * node ) {1102 VISIT_START( node );1103 1104 maybeAccept_impl( node->initialization, *this );1105 visitExpression ( node->condition );1106 visitStatement( node->thenPart );1107 visitStatement( node->elsePart );1108 1109 VISIT_END( node );1110 }1111 1112 template< typename pass_type >1113 836 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 1114 837 MUTATE_START( node ); … … 1116 839 // if statements introduce a level of scope (for the initialization) 1117 840 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1118 maybeMutate_impl( node-> initialization, *this );841 maybeMutate_impl( node->get_initialization(), *this ); 1119 842 node->condition = mutateExpression( node->condition ); 1120 843 node->thenPart = mutateStatement ( node->thenPart ); … … 1137 860 node->body = visitStatement( node->body ); 1138 861 } 1139 1140 VISIT_END( node );1141 }1142 1143 template< typename pass_type >1144 void PassVisitor< pass_type >::visit( const WhileStmt * node ) {1145 VISIT_START( node );1146 1147 maybeAccept_impl( node->initialization, *this );1148 visitExpression ( node->condition );1149 visitStatement( node->body );1150 862 1151 863 VISIT_END( node ); … … 1185 897 1186 898 template< typename pass_type > 1187 void PassVisitor< pass_type >::visit( const ForStmt * node ) {1188 VISIT_START( node );1189 1190 maybeAccept_impl( node->initialization, *this );1191 visitExpression( node->condition );1192 visitExpression( node->increment );1193 visitStatement( node->body );1194 1195 VISIT_END( node );1196 }1197 1198 template< typename pass_type >1199 899 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 1200 900 MUTATE_START( node ); … … 1223 923 1224 924 template< typename pass_type > 1225 void PassVisitor< pass_type >::visit( const SwitchStmt * node ) {1226 VISIT_START( node );1227 1228 visitExpression ( node->condition );1229 visitStatementList( node->statements );1230 1231 VISIT_END( node );1232 }1233 1234 template< typename pass_type >1235 925 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 1236 926 MUTATE_START( node ); … … 1255 945 1256 946 template< typename pass_type > 1257 void PassVisitor< pass_type >::visit( const CaseStmt * node ) {1258 VISIT_START( node );1259 1260 visitExpression ( node->condition );1261 visitStatementList( node->stmts );1262 1263 VISIT_END( node );1264 }1265 1266 template< typename pass_type >1267 947 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 1268 948 MUTATE_START( node ); … … 1283 963 1284 964 template< typename pass_type > 1285 void PassVisitor< pass_type >::visit( const BranchStmt * node ) {1286 VISIT_START( node );1287 VISIT_END( node );1288 }1289 1290 template< typename pass_type >1291 965 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 1292 966 MUTATE_START( node ); … … 1306 980 1307 981 template< typename pass_type > 1308 void PassVisitor< pass_type >::visit( const ReturnStmt * node ) {1309 VISIT_START( node );1310 1311 visitExpression( node->expr );1312 1313 VISIT_END( node );1314 }1315 1316 template< typename pass_type >1317 982 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 1318 983 MUTATE_START( node ); … … 1325 990 //-------------------------------------------------------------------------- 1326 991 // ThrowStmt 992 1327 993 template< typename pass_type > 1328 994 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { … … 1336 1002 1337 1003 template< typename pass_type > 1338 void PassVisitor< pass_type >::visit( const ThrowStmt * node ) {1339 VISIT_START( node );1340 1341 maybeAccept_impl( node->expr, *this );1342 maybeAccept_impl( node->target, *this );1343 1344 VISIT_END( node );1345 }1346 1347 template< typename pass_type >1348 1004 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 1349 1005 MUTATE_START( node ); … … 1359 1015 template< typename pass_type > 1360 1016 void PassVisitor< pass_type >::visit( TryStmt * node ) { 1361 VISIT_START( node );1362 1363 maybeAccept_impl( node->block , *this );1364 maybeAccept_impl( node->handlers , *this );1365 maybeAccept_impl( node->finallyBlock, *this );1366 1367 VISIT_END( node );1368 }1369 1370 template< typename pass_type >1371 void PassVisitor< pass_type >::visit( const TryStmt * node ) {1372 1017 VISIT_START( node ); 1373 1018 … … 1406 1051 1407 1052 template< typename pass_type > 1408 void PassVisitor< pass_type >::visit( const CatchStmt * node ) {1409 VISIT_START( node );1410 1411 maybeAccept_impl( node->decl, *this );1412 visitExpression( node->cond );1413 visitStatement ( node->body );1414 1415 VISIT_END( node );1416 }1417 1418 template< typename pass_type >1419 1053 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 1420 1054 MUTATE_START( node ); … … 1441 1075 1442 1076 template< typename pass_type > 1443 void PassVisitor< pass_type >::visit( const FinallyStmt * node ) {1444 VISIT_START( node );1445 1446 maybeAccept_impl( node->block, *this );1447 1448 VISIT_END( node );1449 }1450 1451 template< typename pass_type >1452 1077 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 1453 1078 MUTATE_START( node ); … … 1482 1107 1483 1108 template< typename pass_type > 1484 void PassVisitor< pass_type >::visit( const WaitForStmt * node ) {1485 VISIT_START( node );1486 1487 for( auto & clause : node->clauses ) {1488 maybeAccept_impl( clause.target.function, *this );1489 maybeAccept_impl( clause.target.arguments, *this );1490 1491 maybeAccept_impl( clause.statement, *this );1492 maybeAccept_impl( clause.condition, *this );1493 }1494 1495 maybeAccept_impl( node->timeout.time, *this );1496 maybeAccept_impl( node->timeout.statement, *this );1497 maybeAccept_impl( node->timeout.condition, *this );1498 maybeAccept_impl( node->orelse.statement, *this );1499 maybeAccept_impl( node->orelse.condition, *this );1500 1501 VISIT_END( node );1502 }1503 1504 template< typename pass_type >1505 1109 Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) { 1506 1110 MUTATE_START( node ); … … 1526 1130 1527 1131 //-------------------------------------------------------------------------- 1528 // WithStmt1132 // NullStmt 1529 1133 template< typename pass_type > 1530 1134 void PassVisitor< pass_type >::visit( WithStmt * node ) { … … 1541 1145 1542 1146 template< typename pass_type > 1543 void PassVisitor< pass_type >::visit( const WithStmt * node ) {1544 VISIT_START( node );1545 1546 maybeAccept_impl( node->exprs, *this );1547 maybeAccept_impl( node->stmt, *this );1548 1549 VISIT_END( node );1550 }1551 1552 template< typename pass_type >1553 1147 Statement * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1554 1148 MUTATE_START( node ); … … 1572 1166 1573 1167 template< typename pass_type > 1574 void PassVisitor< pass_type >::visit( const NullStmt * node ) {1575 VISIT_START( node );1576 VISIT_END( node );1577 }1578 1579 template< typename pass_type >1580 1168 NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) { 1581 1169 MUTATE_START( node ); … … 1595 1183 1596 1184 template< typename pass_type > 1597 void PassVisitor< pass_type >::visit( const DeclStmt * node ) {1598 VISIT_START( node );1599 1600 maybeAccept_impl( node->decl, *this );1601 1602 VISIT_END( node );1603 }1604 1605 template< typename pass_type >1606 1185 Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) { 1607 1186 MUTATE_START( node ); … … 1616 1195 template< typename pass_type > 1617 1196 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) { 1618 VISIT_START( node );1619 1620 maybeAccept_impl( node->callStmt, *this );1621 1622 VISIT_END( node );1623 }1624 1625 template< typename pass_type >1626 void PassVisitor< pass_type >::visit( const ImplicitCtorDtorStmt * node ) {1627 1197 VISIT_START( node ); 1628 1198 … … 1650 1220 maybeAccept_impl ( node->function, *this ); 1651 1221 maybeAccept_impl ( node->args , *this ); 1652 1653 VISIT_END( node );1654 }1655 1656 template< typename pass_type >1657 void PassVisitor< pass_type >::visit( const ApplicationExpr * node ) {1658 VISIT_START( node );1659 1660 maybeAccept_impl( node->result , *this );1661 maybeAccept_impl( node->function, *this );1662 maybeAccept_impl( node->args , *this );1663 1222 1664 1223 VISIT_END( node ); … … 1694 1253 1695 1254 template< typename pass_type > 1696 void PassVisitor< pass_type >::visit( const UntypedExpr * node ) {1697 VISIT_START( node );1698 1699 maybeAccept_impl( node->result, *this );1700 1701 for ( auto expr : node->args ) {1702 visitExpression( expr );1703 }1704 1705 VISIT_END( node );1706 }1707 1708 template< typename pass_type >1709 1255 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 1710 1256 MUTATE_START( node ); … … 1732 1278 1733 1279 template< typename pass_type > 1734 void PassVisitor< pass_type >::visit( const NameExpr * node ) {1735 VISIT_START( node );1736 1737 maybeAccept_impl( node->result, *this );1738 1739 VISIT_END( node );1740 }1741 1742 template< typename pass_type >1743 1280 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1744 1281 MUTATE_START( node ); … … 1763 1300 1764 1301 template< typename pass_type > 1765 void PassVisitor< pass_type >::visit( const CastExpr * node ) {1766 VISIT_START( node );1767 1768 maybeAccept_impl( node->result, *this );1769 maybeAccept_impl( node->arg , *this );1770 1771 VISIT_END( node );1772 }1773 1774 template< typename pass_type >1775 1302 Expression * PassVisitor< pass_type >::mutate( CastExpr * node ) { 1776 1303 MUTATE_START( node ); … … 1796 1323 1797 1324 template< typename pass_type > 1798 void PassVisitor< pass_type >::visit( const KeywordCastExpr * node ) {1799 VISIT_START( node );1800 1801 maybeAccept_impl( node->result, *this );1802 maybeAccept_impl( node->arg , *this );1803 1804 VISIT_END( node );1805 }1806 1807 template< typename pass_type >1808 1325 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) { 1809 1326 MUTATE_START( node ); … … 1829 1346 1830 1347 template< typename pass_type > 1831 void PassVisitor< pass_type >::visit( const VirtualCastExpr * node ) {1832 VISIT_START( node );1833 1834 maybeAccept_impl( node->result, *this );1835 maybeAccept_impl( node->arg, *this );1836 1837 VISIT_END( node );1838 }1839 1840 template< typename pass_type >1841 1348 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) { 1842 1349 MUTATE_START( node ); … … 1862 1369 1863 1370 template< typename pass_type > 1864 void PassVisitor< pass_type >::visit( const AddressExpr * node ) {1865 VISIT_START( node );1866 1867 maybeAccept_impl( node->result, *this );1868 maybeAccept_impl( node->arg , *this );1869 1870 VISIT_END( node );1871 }1872 1873 template< typename pass_type >1874 1371 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) { 1875 1372 MUTATE_START( node ); … … 1889 1386 1890 1387 indexerScopedAccept( node->result, *this ); 1891 1892 VISIT_END( node );1893 }1894 1895 template< typename pass_type >1896 void PassVisitor< pass_type >::visit( const LabelAddressExpr * node ) {1897 VISIT_START( node );1898 1899 maybeAccept_impl( node->result, *this );1900 1388 1901 1389 VISIT_END( node ); … … 1921 1409 maybeAccept_impl ( node->aggregate, *this ); 1922 1410 maybeAccept_impl ( node->member , *this ); 1923 1924 VISIT_END( node );1925 }1926 1927 template< typename pass_type >1928 void PassVisitor< pass_type >::visit( const UntypedMemberExpr * node ) {1929 VISIT_START( node );1930 1931 maybeAccept_impl( node->result , *this );1932 maybeAccept_impl( node->aggregate, *this );1933 maybeAccept_impl( node->member , *this );1934 1411 1935 1412 VISIT_END( node ); … … 1961 1438 1962 1439 template< typename pass_type > 1963 void PassVisitor< pass_type >::visit( const MemberExpr * node ) {1964 VISIT_START( node );1965 1966 maybeAccept_impl( node->result , *this );1967 maybeAccept_impl( node->aggregate, *this );1968 1969 VISIT_END( node );1970 }1971 1972 template< typename pass_type >1973 1440 Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) { 1974 1441 MUTATE_START( node ); … … 1993 1460 1994 1461 template< typename pass_type > 1995 void PassVisitor< pass_type >::visit( const VariableExpr * node ) {1996 VISIT_START( node );1997 1998 maybeAccept_impl( node->result, *this );1999 2000 VISIT_END( node );2001 }2002 2003 template< typename pass_type >2004 1462 Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) { 2005 1463 MUTATE_START( node ); … … 2019 1477 indexerScopedAccept( node->result , *this ); 2020 1478 maybeAccept_impl ( &node->constant, *this ); 2021 2022 VISIT_END( node );2023 }2024 2025 template< typename pass_type >2026 void PassVisitor< pass_type >::visit( const ConstantExpr * node ) {2027 VISIT_START( node );2028 2029 maybeAccept_impl( node->result , *this );2030 maybeAccept_impl( &node->constant, *this );2031 1479 2032 1480 VISIT_END( node ); … … 2063 1511 2064 1512 template< typename pass_type > 2065 void PassVisitor< pass_type >::visit( const SizeofExpr * node ) {2066 VISIT_START( node );2067 2068 maybeAccept_impl( node->result, *this );2069 if ( node->get_isType() ) {2070 maybeAccept_impl( node->type, *this );2071 } else {2072 maybeAccept_impl( node->expr, *this );2073 }2074 2075 VISIT_END( node );2076 }2077 2078 template< typename pass_type >2079 1513 Expression * PassVisitor< pass_type >::mutate( SizeofExpr * node ) { 2080 1514 MUTATE_START( node ); … … 2108 1542 2109 1543 template< typename pass_type > 2110 void PassVisitor< pass_type >::visit( const AlignofExpr * node ) {2111 VISIT_START( node );2112 2113 maybeAccept_impl( node->result, *this );2114 if ( node->get_isType() ) {2115 maybeAccept_impl( node->type, *this );2116 } else {2117 maybeAccept_impl( node->expr, *this );2118 }2119 2120 VISIT_END( node );2121 }2122 2123 template< typename pass_type >2124 1544 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 2125 1545 MUTATE_START( node ); … … 2149 1569 2150 1570 template< typename pass_type > 2151 void PassVisitor< pass_type >::visit( const UntypedOffsetofExpr * node ) {2152 VISIT_START( node );2153 2154 maybeAccept_impl( node->result, *this );2155 maybeAccept_impl( node->type , *this );2156 2157 VISIT_END( node );2158 }2159 2160 template< typename pass_type >2161 1571 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) { 2162 1572 MUTATE_START( node ); … … 2182 1592 2183 1593 template< typename pass_type > 2184 void PassVisitor< pass_type >::visit( const OffsetofExpr * node ) {2185 VISIT_START( node );2186 2187 maybeAccept_impl( node->result, *this );2188 maybeAccept_impl( node->type , *this );2189 2190 VISIT_END( node );2191 }2192 2193 template< typename pass_type >2194 1594 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) { 2195 1595 MUTATE_START( node ); … … 2210 1610 indexerScopedAccept( node->result, *this ); 2211 1611 maybeAccept_impl ( node->type , *this ); 2212 2213 VISIT_END( node );2214 }2215 2216 template< typename pass_type >2217 void PassVisitor< pass_type >::visit( const OffsetPackExpr * node ) {2218 VISIT_START( node );2219 2220 maybeAccept_impl( node->result, *this );2221 maybeAccept_impl( node->type , *this );2222 1612 2223 1613 VISIT_END( node ); … … 2252 1642 2253 1643 template< typename pass_type > 2254 void PassVisitor< pass_type >::visit( const AttrExpr * node ) {2255 VISIT_START( node );2256 2257 maybeAccept_impl( node->result, *this );2258 if ( node->get_isType() ) {2259 maybeAccept_impl( node->type, *this );2260 } else {2261 maybeAccept_impl( node->expr, *this );2262 }2263 2264 VISIT_END( node );2265 }2266 2267 template< typename pass_type >2268 1644 Expression * PassVisitor< pass_type >::mutate( AttrExpr * node ) { 2269 1645 MUTATE_START( node ); … … 2294 1670 2295 1671 template< typename pass_type > 2296 void PassVisitor< pass_type >::visit( const LogicalExpr * node ) {2297 VISIT_START( node );2298 2299 maybeAccept_impl( node->result, *this );2300 maybeAccept_impl( node->arg1 , *this );2301 maybeAccept_impl( node->arg2 , *this );2302 2303 VISIT_END( node );2304 }2305 2306 template< typename pass_type >2307 1672 Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) { 2308 1673 MUTATE_START( node ); … … 2331 1696 2332 1697 template< typename pass_type > 2333 void PassVisitor< pass_type >::visit( const ConditionalExpr * node ) {2334 VISIT_START( node );2335 2336 maybeAccept_impl( node->result, *this );2337 maybeAccept_impl( node->arg1 , *this );2338 maybeAccept_impl( node->arg2 , *this );2339 maybeAccept_impl( node->arg3 , *this );2340 2341 VISIT_END( node );2342 }2343 2344 template< typename pass_type >2345 1698 Expression * PassVisitor< pass_type >::mutate( ConditionalExpr * node ) { 2346 1699 MUTATE_START( node ); … … 2369 1722 2370 1723 template< typename pass_type > 2371 void PassVisitor< pass_type >::visit( const CommaExpr * node ) {2372 VISIT_START( node );2373 2374 maybeAccept_impl( node->result, *this );2375 maybeAccept_impl( node->arg1 , *this );2376 maybeAccept_impl( node->arg2 , *this );2377 2378 VISIT_END( node );2379 }2380 2381 template< typename pass_type >2382 1724 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) { 2383 1725 MUTATE_START( node ); … … 2399 1741 indexerScopedAccept( node->result, *this ); 2400 1742 maybeAccept_impl ( node->type, *this ); 2401 2402 VISIT_END( node );2403 }2404 2405 template< typename pass_type >2406 void PassVisitor< pass_type >::visit( const TypeExpr * node ) {2407 VISIT_START( node );2408 2409 maybeAccept_impl( node->result, *this );2410 maybeAccept_impl( node->type, *this );2411 1743 2412 1744 VISIT_END( node ); … … 2434 1766 maybeAccept_impl ( node->constraint, *this ); 2435 1767 maybeAccept_impl ( node->operand , *this ); 2436 2437 VISIT_END( node );2438 }2439 2440 template< typename pass_type >2441 void PassVisitor< pass_type >::visit( const AsmExpr * node ) {2442 VISIT_START( node );2443 2444 maybeAccept_impl( node->result , *this );2445 maybeAccept_impl( node->inout , *this );2446 maybeAccept_impl( node->constraint, *this );2447 maybeAccept_impl( node->operand , *this );2448 1768 2449 1769 VISIT_END( node ); … … 2476 1796 2477 1797 template< typename pass_type > 2478 void PassVisitor< pass_type >::visit( const ImplicitCopyCtorExpr * node ) {2479 VISIT_START( node );2480 2481 maybeAccept_impl( node->result , *this );2482 maybeAccept_impl( node->callExpr , *this );2483 2484 VISIT_END( node );2485 }2486 2487 template< typename pass_type >2488 1798 Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) { 2489 1799 MUTATE_START( node ); … … 2509 1819 2510 1820 template< typename pass_type > 2511 void PassVisitor< pass_type >::visit( const ConstructorExpr * node ) {2512 VISIT_START( node );2513 2514 maybeAccept_impl( node->result , *this );2515 maybeAccept_impl( node->callExpr, *this );2516 2517 VISIT_END( node );2518 }2519 2520 template< typename pass_type >2521 1821 Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) { 2522 1822 MUTATE_START( node ); … … 2542 1842 2543 1843 template< typename pass_type > 2544 void PassVisitor< pass_type >::visit( const CompoundLiteralExpr * node ) {2545 VISIT_START( node );2546 2547 maybeAccept_impl( node->result , *this );2548 maybeAccept_impl( node->initializer, *this );2549 2550 VISIT_END( node );2551 }2552 2553 template< typename pass_type >2554 1844 Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) { 2555 1845 MUTATE_START( node ); … … 2576 1866 2577 1867 template< typename pass_type > 2578 void PassVisitor< pass_type >::visit( const RangeExpr * node ) {2579 VISIT_START( node );2580 2581 maybeAccept_impl( node->result, *this );2582 maybeAccept_impl( node->low , *this );2583 maybeAccept_impl( node->high , *this );2584 2585 VISIT_END( node );2586 }2587 2588 template< typename pass_type >2589 1868 Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) { 2590 1869 MUTATE_START( node ); … … 2611 1890 2612 1891 template< typename pass_type > 2613 void PassVisitor< pass_type >::visit( const UntypedTupleExpr * node ) {2614 VISIT_START( node );2615 2616 maybeAccept_impl( node->result, *this );2617 maybeAccept_impl( node->exprs , *this );2618 2619 VISIT_END( node );2620 }2621 2622 template< typename pass_type >2623 1892 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) { 2624 1893 MUTATE_START( node ); … … 2644 1913 2645 1914 template< typename pass_type > 2646 void PassVisitor< pass_type >::visit( const TupleExpr * node ) {2647 VISIT_START( node );2648 2649 maybeAccept_impl( node->result, *this );2650 maybeAccept_impl( node->exprs , *this );2651 2652 VISIT_END( node );2653 }2654 2655 template< typename pass_type >2656 1915 Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) { 2657 1916 MUTATE_START( node ); … … 2677 1936 2678 1937 template< typename pass_type > 2679 void PassVisitor< pass_type >::visit( const TupleIndexExpr * node ) {2680 VISIT_START( node );2681 2682 maybeAccept_impl( node->result, *this );2683 maybeAccept_impl( node->tuple , *this );2684 2685 VISIT_END( node );2686 }2687 2688 template< typename pass_type >2689 1938 Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) { 2690 1939 MUTATE_START( node ); … … 2705 1954 indexerScopedAccept( node->result , *this ); 2706 1955 maybeAccept_impl ( node->stmtExpr, *this ); 2707 2708 VISIT_END( node );2709 }2710 2711 template< typename pass_type >2712 void PassVisitor< pass_type >::visit( const TupleAssignExpr * node ) {2713 VISIT_START( node );2714 2715 maybeAccept_impl( node->result , *this );2716 maybeAccept_impl( node->stmtExpr, *this );2717 1956 2718 1957 VISIT_END( node ); … … 2750 1989 2751 1990 template< typename pass_type > 2752 void PassVisitor< pass_type >::visit( const StmtExpr * node ) {2753 VISIT_START( node );2754 2755 maybeAccept_impl( node->result , *this );2756 maybeAccept_impl( node->statements , *this );2757 maybeAccept_impl( node->returnDecls, *this );2758 maybeAccept_impl( node->dtors , *this );2759 2760 VISIT_END( node );2761 }2762 2763 template< typename pass_type >2764 1991 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 2765 1992 MUTATE_START( node ); … … 2791 2018 2792 2019 template< typename pass_type > 2793 void PassVisitor< pass_type >::visit( const UniqueExpr * node ) {2794 VISIT_START( node );2795 2796 maybeAccept_impl( node->result, *this );2797 maybeAccept_impl( node->expr , *this );2798 2799 VISIT_END( node );2800 }2801 2802 template< typename pass_type >2803 2020 Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) { 2804 2021 MUTATE_START( node ); … … 2825 2042 2826 2043 template< typename pass_type > 2827 void PassVisitor< pass_type >::visit( const UntypedInitExpr * node ) {2828 VISIT_START( node );2829 2830 maybeAccept_impl( node->result, *this );2831 maybeAccept_impl( node->expr , *this );2832 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver.2833 2834 VISIT_END( node );2835 }2836 2837 template< typename pass_type >2838 2044 Expression * PassVisitor< pass_type >::mutate( UntypedInitExpr * node ) { 2839 2045 MUTATE_START( node ); … … 2861 2067 2862 2068 template< typename pass_type > 2863 void PassVisitor< pass_type >::visit( const InitExpr * node ) {2864 VISIT_START( node );2865 2866 maybeAccept_impl( node->result, *this );2867 maybeAccept_impl( node->expr , *this );2868 maybeAccept_impl( node->designation, *this );2869 2870 VISIT_END( node );2871 }2872 2873 template< typename pass_type >2874 2069 Expression * PassVisitor< pass_type >::mutate( InitExpr * node ) { 2875 2070 MUTATE_START( node ); … … 2897 2092 2898 2093 template< typename pass_type > 2899 void PassVisitor< pass_type >::visit( const DeletedExpr * node ) {2900 VISIT_START( node );2901 2902 maybeAccept_impl( node->result, *this );2903 maybeAccept_impl( node->expr, *this );2904 // don't visit deleteStmt, because it is a pointer to somewhere else in the tree.2905 2906 VISIT_END( node );2907 }2908 2909 template< typename pass_type >2910 2094 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2911 2095 MUTATE_START( node ); … … 2925 2109 2926 2110 indexerScopedAccept( node->result, *this ); 2927 maybeAccept_impl( node->expr, *this );2928 2929 VISIT_END( node );2930 }2931 2932 template< typename pass_type >2933 void PassVisitor< pass_type >::visit( const DefaultArgExpr * node ) {2934 VISIT_START( node );2935 2936 maybeAccept_impl( node->result, *this );2937 2111 maybeAccept_impl( node->expr, *this ); 2938 2112 … … 2968 2142 2969 2143 template< typename pass_type > 2970 void PassVisitor< pass_type >::visit( const GenericExpr * node ) {2971 VISIT_START( node );2972 2973 maybeAccept_impl( node->result, *this );2974 maybeAccept_impl( node->control, *this );2975 for ( const GenericExpr::Association & assoc : node->associations ) {2976 maybeAccept_impl( assoc.type, *this );2977 maybeAccept_impl( assoc.expr, *this );2978 }2979 2980 VISIT_END( node );2981 }2982 2983 template< typename pass_type >2984 2144 Expression * PassVisitor< pass_type >::mutate( GenericExpr * node ) { 2985 2145 MUTATE_START( node ); … … 3008 2168 3009 2169 template< typename pass_type > 3010 void PassVisitor< pass_type >::visit( const VoidType * node ) {3011 VISIT_START( node );3012 3013 maybeAccept_impl( node->forall, *this );3014 3015 VISIT_END( node );3016 }3017 3018 template< typename pass_type >3019 2170 Type * PassVisitor< pass_type >::mutate( VoidType * node ) { 3020 2171 MUTATE_START( node ); … … 3029 2180 template< typename pass_type > 3030 2181 void PassVisitor< pass_type >::visit( BasicType * node ) { 3031 VISIT_START( node );3032 3033 maybeAccept_impl( node->forall, *this );3034 3035 VISIT_END( node );3036 }3037 3038 template< typename pass_type >3039 void PassVisitor< pass_type >::visit( const BasicType * node ) {3040 2182 VISIT_START( node ); 3041 2183 … … 3068 2210 3069 2211 template< typename pass_type > 3070 void PassVisitor< pass_type >::visit( const PointerType * node ) {3071 VISIT_START( node );3072 3073 maybeAccept_impl( node->forall, *this );3074 // xxx - should PointerType visit/mutate dimension?3075 maybeAccept_impl( node->base, *this );3076 3077 VISIT_END( node );3078 }3079 3080 template< typename pass_type >3081 2212 Type * PassVisitor< pass_type >::mutate( PointerType * node ) { 3082 2213 MUTATE_START( node ); … … 3103 2234 3104 2235 template< typename pass_type > 3105 void PassVisitor< pass_type >::visit( const ArrayType * node ) {3106 VISIT_START( node );3107 3108 maybeAccept_impl( node->forall, *this );3109 maybeAccept_impl( node->dimension, *this );3110 maybeAccept_impl( node->base, *this );3111 3112 VISIT_END( node );3113 }3114 3115 template< typename pass_type >3116 2236 Type * PassVisitor< pass_type >::mutate( ArrayType * node ) { 3117 2237 MUTATE_START( node ); … … 3137 2257 3138 2258 template< typename pass_type > 3139 void PassVisitor< pass_type >::visit( const ReferenceType * node ) {3140 VISIT_START( node );3141 3142 maybeAccept_impl( node->forall, *this );3143 maybeAccept_impl( node->base, *this );3144 3145 VISIT_END( node );3146 }3147 3148 template< typename pass_type >3149 2259 Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) { 3150 2260 MUTATE_START( node ); … … 3170 2280 3171 2281 template< typename pass_type > 3172 void PassVisitor< pass_type >::visit( const QualifiedType * node ) {3173 VISIT_START( node );3174 3175 maybeAccept_impl( node->forall, *this );3176 maybeAccept_impl( node->parent, *this );3177 maybeAccept_impl( node->child, *this );3178 3179 VISIT_END( node );3180 }3181 3182 template< typename pass_type >3183 2282 Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) { 3184 2283 MUTATE_START( node ); … … 3195 2294 template< typename pass_type > 3196 2295 void PassVisitor< pass_type >::visit( FunctionType * node ) { 3197 VISIT_START( node );3198 3199 maybeAccept_impl( node->forall, *this );3200 maybeAccept_impl( node->returnVals, *this );3201 maybeAccept_impl( node->parameters, *this );3202 3203 VISIT_END( node );3204 }3205 3206 template< typename pass_type >3207 void PassVisitor< pass_type >::visit( const FunctionType * node ) {3208 2296 VISIT_START( node ); 3209 2297 … … 3244 2332 3245 2333 template< typename pass_type > 3246 void PassVisitor< pass_type >::visit( const StructInstType * node ) {3247 VISIT_START( node );3248 3249 maybeAccept_impl( node->forall , *this );3250 maybeAccept_impl( node->parameters, *this );3251 3252 VISIT_END( node );3253 }3254 3255 template< typename pass_type >3256 2334 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) { 3257 2335 MUTATE_START( node ); … … 3286 2364 3287 2365 template< typename pass_type > 3288 void PassVisitor< pass_type >::visit( const UnionInstType * node ) {3289 VISIT_START( node );3290 3291 maybeAccept_impl( node->forall , *this );3292 maybeAccept_impl( node->parameters, *this );3293 3294 VISIT_END( node );3295 }3296 3297 template< typename pass_type >3298 2366 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) { 3299 2367 MUTATE_START( node ); … … 3323 2391 3324 2392 template< typename pass_type > 3325 void PassVisitor< pass_type >::visit( const EnumInstType * node ) {3326 VISIT_START( node );3327 3328 maybeAccept_impl( node->forall, *this );3329 maybeAccept_impl( node->parameters, *this );3330 3331 VISIT_END( node );3332 }3333 3334 template< typename pass_type >3335 2393 Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) { 3336 2394 MUTATE_START( node ); … … 3355 2413 3356 2414 template< typename pass_type > 3357 void PassVisitor< pass_type >::visit( const TraitInstType * node ) {3358 VISIT_START( node );3359 3360 maybeAccept_impl( node->forall , *this );3361 maybeAccept_impl( node->parameters, *this );3362 3363 VISIT_END( node );3364 }3365 3366 template< typename pass_type >3367 2415 Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) { 3368 2416 MUTATE_START( node ); … … 3378 2426 template< typename pass_type > 3379 2427 void PassVisitor< pass_type >::visit( TypeInstType * node ) { 3380 VISIT_START( node );3381 3382 maybeAccept_impl( node->forall , *this );3383 maybeAccept_impl( node->parameters, *this );3384 3385 VISIT_END( node );3386 }3387 3388 template< typename pass_type >3389 void PassVisitor< pass_type >::visit( const TypeInstType * node ) {3390 2428 VISIT_START( node ); 3391 2429 … … 3420 2458 3421 2459 template< typename pass_type > 3422 void PassVisitor< pass_type >::visit( const TupleType * node ) {3423 VISIT_START( node );3424 3425 maybeAccept_impl( node->forall, *this );3426 maybeAccept_impl( node->types, *this );3427 maybeAccept_impl( node->members, *this );3428 3429 VISIT_END( node );3430 }3431 3432 template< typename pass_type >3433 2460 Type * PassVisitor< pass_type >::mutate( TupleType * node ) { 3434 2461 MUTATE_START( node ); … … 3445 2472 template< typename pass_type > 3446 2473 void PassVisitor< pass_type >::visit( TypeofType * node ) { 3447 VISIT_START( node );3448 3449 assert( node->expr );3450 maybeAccept_impl( node->expr, *this );3451 3452 VISIT_END( node );3453 }3454 3455 template< typename pass_type >3456 void PassVisitor< pass_type >::visit( const TypeofType * node ) {3457 2474 VISIT_START( node ); 3458 2475 … … 3491 2508 3492 2509 template< typename pass_type > 3493 void PassVisitor< pass_type >::visit( const AttrType * node ) {3494 VISIT_START( node );3495 3496 if ( node->isType ) {3497 assert( node->type );3498 maybeAccept_impl( node->type, *this );3499 } else {3500 assert( node->expr );3501 maybeAccept_impl( node->expr, *this );3502 } // if3503 3504 VISIT_END( node );3505 }3506 3507 template< typename pass_type >3508 2510 Type * PassVisitor< pass_type >::mutate( AttrType * node ) { 3509 2511 MUTATE_START( node ); … … 3532 2534 3533 2535 template< typename pass_type > 3534 void PassVisitor< pass_type >::visit( const VarArgsType * node ) { 2536 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) { 2537 MUTATE_START( node ); 2538 2539 maybeMutate_impl( node->forall, *this ); 2540 2541 MUTATE_END( Type, node ); 2542 } 2543 2544 //-------------------------------------------------------------------------- 2545 // ZeroType 2546 template< typename pass_type > 2547 void PassVisitor< pass_type >::visit( ZeroType * node ) { 3535 2548 VISIT_START( node ); 3536 2549 … … 3541 2554 3542 2555 template< typename pass_type > 3543 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) {2556 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) { 3544 2557 MUTATE_START( node ); 3545 2558 … … 3550 2563 3551 2564 //-------------------------------------------------------------------------- 3552 // ZeroType3553 template< typename pass_type > 3554 void PassVisitor< pass_type >::visit( ZeroType * node ) {2565 // OneType 2566 template< typename pass_type > 2567 void PassVisitor< pass_type >::visit( OneType * node ) { 3555 2568 VISIT_START( node ); 3556 2569 … … 3561 2574 3562 2575 template< typename pass_type > 3563 void PassVisitor< pass_type >::visit( const ZeroType * node ) { 2576 Type * PassVisitor< pass_type >::mutate( OneType * node ) { 2577 MUTATE_START( node ); 2578 2579 maybeMutate_impl( node->forall, *this ); 2580 2581 MUTATE_END( Type, node ); 2582 } 2583 2584 //-------------------------------------------------------------------------- 2585 // GlobalScopeType 2586 template< typename pass_type > 2587 void PassVisitor< pass_type >::visit( GlobalScopeType * node ) { 3564 2588 VISIT_START( node ); 3565 2589 … … 3570 2594 3571 2595 template< typename pass_type > 3572 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) {2596 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) { 3573 2597 MUTATE_START( node ); 3574 2598 … … 3579 2603 3580 2604 //-------------------------------------------------------------------------- 3581 // OneType3582 template< typename pass_type >3583 void PassVisitor< pass_type >::visit( OneType * node ) {3584 VISIT_START( node );3585 3586 maybeAccept_impl( node->forall, *this );3587 3588 VISIT_END( node );3589 }3590 3591 template< typename pass_type >3592 void PassVisitor< pass_type >::visit( const OneType * node ) {3593 VISIT_START( node );3594 3595 maybeAccept_impl( node->forall, *this );3596 3597 VISIT_END( node );3598 }3599 3600 template< typename pass_type >3601 Type * PassVisitor< pass_type >::mutate( OneType * node ) {3602 MUTATE_START( node );3603 3604 maybeMutate_impl( node->forall, *this );3605 3606 MUTATE_END( Type, node );3607 }3608 3609 //--------------------------------------------------------------------------3610 // GlobalScopeType3611 template< typename pass_type >3612 void PassVisitor< pass_type >::visit( GlobalScopeType * node ) {3613 VISIT_START( node );3614 3615 maybeAccept_impl( node->forall, *this );3616 3617 VISIT_END( node );3618 }3619 3620 template< typename pass_type >3621 void PassVisitor< pass_type >::visit( const GlobalScopeType * node ) {3622 VISIT_START( node );3623 3624 maybeAccept_impl( node->forall, *this );3625 3626 VISIT_END( node );3627 }3628 3629 template< typename pass_type >3630 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) {3631 MUTATE_START( node );3632 3633 maybeMutate_impl( node->forall, *this );3634 3635 MUTATE_END( Type, node );3636 }3637 3638 //--------------------------------------------------------------------------3639 2605 // Designation 3640 2606 template< typename pass_type > … … 3648 2614 3649 2615 template< typename pass_type > 3650 void PassVisitor< pass_type >::visit( const Designation * node ) {3651 VISIT_START( node );3652 3653 maybeAccept_impl( node->designators, *this );3654 3655 VISIT_END( node );3656 }3657 3658 template< typename pass_type >3659 2616 Designation * PassVisitor< pass_type >::mutate( Designation * node ) { 3660 2617 MUTATE_START( node ); … … 3677 2634 3678 2635 template< typename pass_type > 3679 void PassVisitor< pass_type >::visit( const SingleInit * node ) {3680 VISIT_START( node );3681 3682 visitExpression( node->value );3683 3684 VISIT_END( node );3685 }3686 3687 template< typename pass_type >3688 2636 Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) { 3689 2637 MUTATE_START( node ); … … 3698 2646 template< typename pass_type > 3699 2647 void PassVisitor< pass_type >::visit( ListInit * node ) { 3700 VISIT_START( node );3701 3702 maybeAccept_impl( node->designations, *this );3703 maybeAccept_impl( node->initializers, *this );3704 3705 VISIT_END( node );3706 }3707 3708 template< typename pass_type >3709 void PassVisitor< pass_type >::visit( const ListInit * node ) {3710 2648 VISIT_START( node ); 3711 2649 … … 3740 2678 3741 2679 template< typename pass_type > 3742 void PassVisitor< pass_type >::visit( const ConstructorInit * node ) {3743 VISIT_START( node );3744 3745 maybeAccept_impl( node->ctor, *this );3746 maybeAccept_impl( node->dtor, *this );3747 maybeAccept_impl( node->init, *this );3748 3749 VISIT_END( node );3750 }3751 3752 template< typename pass_type >3753 2680 Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) { 3754 2681 MUTATE_START( node ); … … 3771 2698 3772 2699 template< typename pass_type > 3773 void PassVisitor< pass_type >::visit( const Constant * node ) {3774 VISIT_START( node );3775 3776 VISIT_END( node );3777 }3778 3779 template< typename pass_type >3780 2700 Constant * PassVisitor< pass_type >::mutate( Constant * node ) { 3781 2701 MUTATE_START( node ); … … 3788 2708 template< typename pass_type > 3789 2709 void PassVisitor< pass_type >::visit( Attribute * node ) { 3790 VISIT_START( node );3791 3792 maybeAccept_impl( node->parameters, *this );3793 3794 VISIT_END( node );3795 }3796 3797 template< typename pass_type >3798 void PassVisitor< pass_type >::visit( const Attribute * node ) {3799 2710 VISIT_START( node ); 3800 2711 -
src/Common/PassVisitor.proto.h
rfce4e31 r302d84c2 118 118 static inline void postvisit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) node_type * node, __attribute__((unused)) long unused ) {} 119 119 120 template<typename pass_type, typename node_type>121 static inline auto previsit_impl( pass_type& pass, const node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.previsit( node ), void() ) {122 pass.previsit( node );123 }124 125 template<typename pass_type, typename node_type>126 static inline void previsit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) const node_type * node, __attribute__((unused)) long unused ) {}127 128 129 template<typename pass_type, typename node_type>130 static inline auto postvisit_impl( pass_type& pass, const node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.postvisit( node ), void() ) {131 pass.postvisit( node );132 }133 134 template<typename pass_type, typename node_type>135 static inline void postvisit_impl( __attribute__((unused)) pass_type& pass, __attribute__((unused)) const node_type * node, __attribute__((unused)) long unused ) {}136 137 120 //--------------------------------------------------------- 138 121 // Mutate … … 217 200 pass.indexer.func( arg ); \ 218 201 } \ 219 template<typename pass_type> \ 220 static inline void indexer_impl_##func ( pass_type &, long, type ) { } 202 \ 203 template<typename pass_type> \ 204 static inline void indexer_impl_##func ( pass_type &, long, type ) { } \ 221 205 222 206 #define INDEXER_FUNC2( func, type1, type2 ) \ … … 225 209 pass.indexer.func( arg1, arg2 ); \ 226 210 } \ 211 \ 227 212 template<typename pass_type> \ 228 213 static inline void indexer_impl_##func ( pass_type &, long, type1, type2 ) { } … … 248 233 249 234 template<typename pass_type> 250 static inline auto indexer_impl_addStructFwd( pass_type &, long, constStructDecl * ) {}235 static inline auto indexer_impl_addStructFwd( pass_type &, long, StructDecl * ) {} 251 236 252 237 template<typename pass_type> … … 258 243 259 244 template<typename pass_type> 260 static inline auto indexer_impl_addUnionFwd( pass_type &, long, constUnionDecl * ) {}245 static inline auto indexer_impl_addUnionFwd( pass_type &, long, UnionDecl * ) {} 261 246 262 247 template<typename pass_type> -
src/ResolvExpr/AdjustExprType.cc
rfce4e31 r302d84c2 47 47 void premutate( OneType * ) { visit_children = false; } 48 48 49 Type * postmutate( ArrayType * arrayType );50 Type * postmutate( FunctionType * functionType );51 Type * postmutate( TypeInstType * aggregateUseType );49 Type * postmutate( ArrayType *arrayType ); 50 Type * postmutate( FunctionType *functionType ); 51 Type * postmutate( TypeInstType *aggregateUseType ); 52 52 53 53 private: … … 61 61 62 62 Type * AdjustExprType_old::postmutate( ArrayType * arrayType ) { 63 PointerType * pointerType = new PointerType{ arrayType->get_qualifiers(), arrayType->base };63 PointerType *pointerType = new PointerType{ arrayType->get_qualifiers(), arrayType->base }; 64 64 arrayType->base = nullptr; 65 65 delete arrayType; … … 72 72 73 73 Type * AdjustExprType_old::postmutate( TypeInstType * typeInst ) { 74 if ( const EqvClass * eqvClass = env.lookup( typeInst->get_name() ) ) {74 if ( const EqvClass* eqvClass = env.lookup( typeInst->get_name() ) ) { 75 75 if ( eqvClass->data.kind == TypeDecl::Ftype ) { 76 76 return new PointerType{ Type::Qualifiers(), typeInst }; 77 77 } 78 } else if ( const NamedTypeDecl *ntDecl = indexer.lookupType( typeInst->get_name() ) ) {79 if ( const TypeDecl * tyDecl = dynamic_cast< const TypeDecl* >( ntDecl ) ) {78 } else if ( NamedTypeDecl *ntDecl = indexer.lookupType( typeInst->get_name() ) ) { 79 if ( TypeDecl *tyDecl = dynamic_cast< TypeDecl* >( ntDecl ) ) { 80 80 if ( tyDecl->get_kind() == TypeDecl::Ftype ) { 81 81 return new PointerType{ Type::Qualifiers(), typeInst }; … … 89 89 void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 90 90 PassVisitor<AdjustExprType_old> adjuster( env, indexer ); 91 Type * newType = type->acceptMutator( adjuster );91 Type *newType = type->acceptMutator( adjuster ); 92 92 type = newType; 93 93 } … … 148 148 } // anonymous namespace 149 149 150 const ast::Type * adjustExprType( 151 const ast::Type * type, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 150 const ast::Type * adjustExprType( 151 const ast::Type * type, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 152 152 ) { 153 153 ast::Pass<AdjustExprType_new> adjuster{ env, symtab }; -
src/ResolvExpr/CastCost.cc
rfce4e31 r302d84c2 37 37 struct CastCost_old : public ConversionCost { 38 38 public: 39 CastCost_old( const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc );39 CastCost_old( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 40 40 41 41 using ConversionCost::previsit; 42 42 using ConversionCost::postvisit; 43 void postvisit( constBasicType * basicType );44 void postvisit( constPointerType * pointerType );43 void postvisit( BasicType * basicType ); 44 void postvisit( PointerType * pointerType ); 45 45 }; 46 46 47 Cost castCost( const Type * src, const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {48 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType* >( dest ) ) {49 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name) ) {47 Cost castCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 49 if ( const EqvClass* eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 50 50 if ( eqvClass->type ) { 51 51 return castCost( src, eqvClass->type, indexer, env ); … … 53 53 return Cost::infinity; 54 54 } 55 } else if ( const NamedTypeDecl * namedType = indexer.lookupType( destAsTypeInst->name) ) {55 } else if ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->get_name() ) ) { 56 56 // all typedefs should be gone by this point 57 const TypeDecl * type = strict_dynamic_cast< const TypeDecl* >( namedType );57 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( namedType ); 58 58 if ( type->base ) { 59 59 return castCost( src, type->base, indexer, env ) + Cost::safe; … … 74 74 PRINT( std::cerr << "compatible!" << std::endl; ) 75 75 return Cost::zero; 76 } else if ( dynamic_cast< const VoidType* >( dest ) ) {76 } else if ( dynamic_cast< VoidType* >( dest ) ) { 77 77 return Cost::safe; 78 } else if ( const ReferenceType * refType = dynamic_cast< constReferenceType * > ( dest ) ) {78 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 79 79 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 80 return convertToReferenceCost( src, refType, indexer, env, []( const Type * t1, constType * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {80 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 81 81 return ptrsCastable( t1, t2, env, indexer ); 82 82 }); 83 83 } else { 84 PassVisitor<CastCost_old> converter( 85 dest, indexer, env, 86 (Cost (*)( const Type *, constType *, const SymTab::Indexer &, const TypeEnvironment & ))84 PassVisitor<CastCost_old> converter( 85 dest, indexer, env, 86 (Cost (*)( Type *, Type *, const SymTab::Indexer &, const TypeEnvironment & )) 87 87 castCost ); 88 88 src->accept( converter ); … … 96 96 } 97 97 98 CastCost_old::CastCost_old( const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )98 CastCost_old::CastCost_old( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 99 99 : ConversionCost( dest, indexer, env, costFunc ) { 100 100 } 101 101 102 void CastCost_old::postvisit( const BasicType *basicType ) {103 const PointerType * destAsPointer = dynamic_cast< const PointerType* >( dest );102 void CastCost_old::postvisit( BasicType *basicType ) { 103 PointerType *destAsPointer = dynamic_cast< PointerType* >( dest ); 104 104 if ( destAsPointer && basicType->isInteger() ) { 105 // necessary for, e.g. unsigned long => void *105 // necessary for, e.g. unsigned long => void* 106 106 cost = Cost::unsafe; 107 107 } else { … … 110 110 } 111 111 112 void CastCost_old::postvisit( const PointerType *pointerType ) {113 if ( const PointerType * destAsPtr = dynamic_cast< const PointerType* >( dest ) ) {114 if ( pointerType-> tq <= destAsPtr->tq&& typesCompatibleIgnoreQualifiers( pointerType->base, destAsPtr->base, indexer, env ) ) {112 void CastCost_old::postvisit( PointerType *pointerType ) { 113 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 114 if ( pointerType->get_qualifiers() <= destAsPtr->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->base, destAsPtr->base, indexer, env ) ) { 115 115 cost = Cost::safe; 116 116 } else { … … 125 125 } // if 126 126 } // if 127 } else if ( const BasicType * destAsBasic = dynamic_cast< const BasicType* >( dest ) ) {127 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 128 128 if ( destAsBasic->isInteger() ) { 129 // necessary for, e.g. void * => unsigned long129 // necessary for, e.g. void* => unsigned long 130 130 cost = Cost::unsafe; 131 131 } // if … … 138 138 using ConversionCost_new::postvisit; 139 139 140 CastCost_new( 141 const ast::Type * dst, const ast::SymbolTable & symtab, 140 CastCost_new( 141 const ast::Type * dst, const ast::SymbolTable & symtab, 142 142 const ast::TypeEnvironment & env, CostCalculation costFunc ) 143 143 : ConversionCost_new( dst, symtab, env, costFunc ) {} … … 182 182 } // anonymous namespace 183 183 184 Cost castCost( 185 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 186 const ast::TypeEnvironment & env 184 Cost castCost( 185 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 186 const ast::TypeEnvironment & env 187 187 ) { 188 188 if ( auto typeInst = dynamic_cast< const ast::TypeInstType * >( dst ) ) { … … 220 220 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 221 221 #warning cast on ptrsCastable artifact of having two functions, remove when port done 222 return convertToReferenceCost( 223 src, refType, symtab, env, 224 ( int (*)( 225 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 222 return convertToReferenceCost( 223 src, refType, symtab, env, 224 ( int (*)( 225 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 226 226 const ast::TypeEnvironment & ) 227 227 ) ptrsCastable ); … … 229 229 #warning cast on castCost artifact of having two functions, remove when port done 230 230 ast::Pass< CastCost_new > converter{ 231 dst, symtab, env, 232 ( Cost (*)( 233 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 231 dst, symtab, env, 232 ( Cost (*)( 233 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 234 234 const ast::TypeEnvironment & ) 235 235 ) castCost }; -
src/ResolvExpr/CommonType.cc
rfce4e31 r302d84c2 38 38 namespace ResolvExpr { 39 39 struct CommonType_old : public WithShortCircuiting { 40 CommonType_old( Type * type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars );41 Type * get_result() const { return result; }40 CommonType_old( Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ); 41 Type *get_result() const { return result; } 42 42 43 43 void previsit( BaseSyntaxNode * ) { visit_children = false; } … … 60 60 61 61 private: 62 template< typename Pointer > void getCommonWithVoidPointer( Pointer * voidPointer, Pointer* otherPointer );63 template< typename RefType > void handleRefType( RefType * inst, Type *other );64 65 Type * result;66 Type * type2; // inherited62 template< typename Pointer > void getCommonWithVoidPointer( Pointer* voidPointer, Pointer* otherPointer ); 63 template< typename RefType > void handleRefType( RefType *inst, Type *other ); 64 65 Type *result; 66 Type *type2; // inherited 67 67 bool widenFirst, widenSecond; 68 68 const SymTab::Indexer &indexer; … … 80 80 std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl; 81 81 ) 82 if ( (widenFirst || t2-> tq <= t1->tq) && (widenSecond || t1->tq <= t2->tq) ) {82 if ( (widenFirst || t2->get_qualifiers() <= t1->get_qualifiers()) && (widenSecond || t1->get_qualifiers() <= t2->get_qualifiers()) ) { 83 83 PRINT( 84 84 std::cerr << "widen okay" << std::endl; 85 85 ) 86 common-> tq |= t1->tq;87 common-> tq |= t2->tq;86 common->get_qualifiers() |= t1->get_qualifiers(); 87 common->get_qualifiers() |= t2->get_qualifiers(); 88 88 return common; 89 89 } … … 95 95 } 96 96 97 Type * commonType( Type * type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ) {97 Type *commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ) { 98 98 PassVisitor<CommonType_old> visitor( type2, widenFirst, widenSecond, indexer, env, openVars ); 99 99 … … 127 127 std::cerr << "formal is reference; result should be reference" << std::endl; 128 128 ) 129 result = new ReferenceType( ref1-> tq, result );129 result = new ReferenceType( ref1->get_qualifiers(), result ); 130 130 } 131 131 PRINT( … … 138 138 139 139 type1->accept( visitor ); 140 Type * result = visitor.pass.get_result();140 Type *result = visitor.pass.get_result(); 141 141 if ( ! result ) { 142 142 // this appears to be handling for opaque type declarations 143 143 if ( widenSecond ) { 144 if ( const TypeInstType * inst = dynamic_cast< const TypeInstType* >( type2 ) ) {145 if ( const NamedTypeDecl *nt = indexer.lookupType( inst->get_name() ) ) {146 const TypeDecl * type = strict_dynamic_cast< const TypeDecl* >( nt );144 if ( TypeInstType *inst = dynamic_cast< TypeInstType* >( type2 ) ) { 145 if ( NamedTypeDecl *nt = indexer.lookupType( inst->get_name() ) ) { 146 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( nt ); 147 147 if ( type->get_base() ) { 148 Type::Qualifiers tq1 = type1-> tq, tq2 = type2->tq;148 Type::Qualifiers tq1 = type1->get_qualifiers(), tq2 = type2->get_qualifiers(); 149 149 AssertionSet have, need; 150 150 OpenVarSet newOpen( openVars ); 151 type1-> tq= Type::Qualifiers();152 type->get_base()-> tq= tq1;151 type1->get_qualifiers() = Type::Qualifiers(); 152 type->get_base()->get_qualifiers() = tq1; 153 153 if ( unifyExact( type1, type->get_base(), env, have, need, newOpen, indexer ) ) { 154 154 result = type1->clone(); 155 result-> tq= tq1 | tq2;155 result->get_qualifiers() = tq1 | tq2; 156 156 } // if 157 type1-> tq= tq1;158 type->get_base()-> tq= Type::Qualifiers();157 type1->get_qualifiers() = tq1; 158 type->get_base()->get_qualifiers() = Type::Qualifiers(); 159 159 } // if 160 160 } // if … … 190 190 */ 191 191 { 192 /* B */ BT Bool, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,192 /* B*/ BT Bool, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 193 193 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 194 194 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 198 198 }, 199 199 { 200 /* C */ BT Char, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,200 /* C*/ BT Char, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 201 201 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 202 202 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 206 206 }, 207 207 { 208 /* SC */ BT SignedChar, BT SignedChar, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,208 /* SC*/ BT SignedChar, BT SignedChar, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 209 209 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 210 210 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 214 214 }, 215 215 { 216 /* UC */ BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,216 /* UC*/ BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 217 217 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 218 218 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 222 222 }, 223 223 { 224 /* SI */ BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortUnsignedInt,224 /* SI*/ BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortUnsignedInt, 225 225 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 226 226 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 230 230 }, 231 231 { 232 /* SUI */ BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt,232 /* SUI*/ BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, 233 233 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 234 234 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 238 238 }, 239 239 { 240 /* I */ BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt,240 /* I*/ BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, 241 241 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 242 242 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 246 246 }, 247 247 { 248 /* UI */ BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt,248 /* UI*/ BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, 249 249 BT UnsignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 250 250 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 254 254 }, 255 255 { 256 /* LI */ BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt,256 /* LI*/ BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, 257 257 BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 258 258 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 262 262 }, 263 263 { 264 /* LUI */ BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt,264 /* LUI*/ BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, 265 265 BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 266 266 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 270 270 }, 271 271 { 272 /* LLI */ BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt,272 /* LLI*/ BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, 273 273 BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 274 274 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 278 278 }, 279 279 { 280 /* LLUI */ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,280 /* LLUI*/ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, 281 281 BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, 282 282 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 286 286 }, 287 287 { 288 /* IB */ BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128,288 /* IB*/ BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, 289 289 BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, 290 290 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 294 294 }, 295 295 { 296 /* UIB */ BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128,296 /* UIB*/ BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, 297 297 BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, 298 298 BT UnsignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 302 302 }, 303 303 { 304 /* _FH */ BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16,304 /* _FH*/ BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, 305 305 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, 306 306 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 310 310 }, 311 311 { 312 /* _FH */ BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex,312 /* _FH*/ BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, 313 313 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, 314 314 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat32Complex, BT uFloat32Complex, … … 318 318 }, 319 319 { 320 /* _F */ BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32,320 /* _F*/ BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, 321 321 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, 322 322 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32Complex, BT uFloat32, BT uFloat32Complex, … … 326 326 }, 327 327 { 328 /* _FC */ BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex,328 /* _FC*/ BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, 329 329 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, 330 330 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, … … 334 334 }, 335 335 { 336 /* F */ BT Float, BT Float, BT Float, BT Float, BT Float, BT Float,336 /* F*/ BT Float, BT Float, BT Float, BT Float, BT Float, BT Float, 337 337 BT Float, BT Float, BT Float, BT Float, BT Float, BT Float, 338 338 BT Float, BT Float, BT Float, BT FloatComplex, BT Float, BT FloatComplex, … … 342 342 }, 343 343 { 344 /* FC */ BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex,344 /* FC*/ BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, 345 345 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, 346 346 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, … … 350 350 }, 351 351 { 352 /* _FX */ BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x,352 /* _FX*/ BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, 353 353 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, 354 354 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32xComplex, BT uFloat32x, BT uFloat32xComplex, … … 358 358 }, 359 359 { 360 /* _FXC */ BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex,360 /* _FXC*/ BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, 361 361 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, 362 362 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, … … 366 366 }, 367 367 { 368 /* FD */ BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64,368 /* FD*/ BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, 369 369 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, 370 370 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64Complex, BT uFloat64, BT uFloat64Complex, … … 374 374 }, 375 375 { 376 /* _FDC */ BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,376 /* _FDC*/ BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, 377 377 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, 378 378 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, … … 382 382 }, 383 383 { 384 /* D */ BT Double, BT Double, BT Double, BT Double, BT Double, BT Double,384 /* D*/ BT Double, BT Double, BT Double, BT Double, BT Double, BT Double, 385 385 BT Double, BT Double, BT Double, BT Double, BT Double, BT Double, 386 386 BT Double, BT Double, BT Double, BT DoubleComplex, BT Double, BT DoubleComplex, … … 390 390 }, 391 391 { 392 /* DC */ BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,392 /* DC*/ BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, 393 393 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, 394 394 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, … … 398 398 }, 399 399 { 400 /* F80X */ BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x,400 /* F80X*/ BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, 401 401 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, 402 402 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex, … … 406 406 }, 407 407 { 408 /* _FDXC */ BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,408 /* _FDXC*/ BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, 409 409 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, 410 410 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, … … 422 422 }, 423 423 { 424 /* _FB */ BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128,424 /* _FB*/ BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, 425 425 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, 426 426 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex, … … 430 430 }, 431 431 { 432 /* _FLDC */ BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,432 /* _FLDC*/ BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, 433 433 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, 434 434 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, … … 438 438 }, 439 439 { 440 /* FB */ BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128,440 /* FB*/ BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, 441 441 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, 442 442 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex, … … 446 446 }, 447 447 { 448 /* LD */ BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble,448 /* LD*/ BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, 449 449 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, 450 450 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex, … … 454 454 }, 455 455 { 456 /* LDC */ BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,456 /* LDC*/ BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, 457 457 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, 458 458 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, … … 462 462 }, 463 463 { 464 /* _FBX */ BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x,464 /* _FBX*/ BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, 465 465 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, 466 466 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex, … … 470 470 }, 471 471 { 472 /* _FLDXC*/ BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,472 /*_FLDXC*/ BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, 473 473 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, 474 474 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, … … 481 481 // GENERATED END 482 482 static_assert( 483 sizeof(commonTypes)/sizeof(commonTypes[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES *BasicType::NUMBER_OF_BASIC_TYPES,483 sizeof(commonTypes)/sizeof(commonTypes[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES, 484 484 "Each basic type kind should have a corresponding row in the combined type matrix" 485 485 ); 486 486 487 CommonType_old::CommonType_old( Type * type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars )487 CommonType_old::CommonType_old( Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ) 488 488 : result( 0 ), type2( type2 ), widenFirst( widenFirst ), widenSecond( widenSecond ), indexer( indexer ), env( env ), openVars( openVars ) { 489 489 } … … 491 491 void CommonType_old::postvisit( VoidType * ) {} 492 492 493 void CommonType_old::postvisit( BasicType * basicType ) {494 if ( BasicType * otherBasic = dynamic_cast< BasicType* >( type2 ) ) {493 void CommonType_old::postvisit( BasicType *basicType ) { 494 if ( BasicType *otherBasic = dynamic_cast< BasicType* >( type2 ) ) { 495 495 BasicType::Kind newType = commonTypes[ basicType->get_kind() ][ otherBasic->get_kind() ]; 496 if ( ( ( newType == basicType->get_kind() && basicType-> tq >= otherBasic->tq ) || widenFirst ) && ( ( newType == otherBasic->get_kind() && basicType->tq <= otherBasic->tq) || widenSecond ) ) {497 result = new BasicType( basicType-> tq | otherBasic->tq, newType );496 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= otherBasic->get_qualifiers() ) || widenFirst ) && ( ( newType == otherBasic->get_kind() && basicType->get_qualifiers() <= otherBasic->get_qualifiers() ) || widenSecond ) ) { 497 result = new BasicType( basicType->get_qualifiers() | otherBasic->get_qualifiers(), newType ); 498 498 } // if 499 } else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType * >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {499 } else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) { 500 500 // use signed int in lieu of the enum/zero/one type 501 501 BasicType::Kind newType = commonTypes[ basicType->get_kind() ][ BasicType::SignedInt ]; 502 if ( ( ( newType == basicType->get_kind() && basicType-> tq >= type2->tq ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->tq <= type2->tq) || widenSecond ) ) {503 result = new BasicType( basicType-> tq | type2->tq, newType );502 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) { 503 result = new BasicType( basicType->get_qualifiers() | type2->get_qualifiers(), newType ); 504 504 } // if 505 505 } // if … … 507 507 508 508 template< typename Pointer > 509 void CommonType_old::getCommonWithVoidPointer( Pointer * voidPointer, Pointer* otherPointer ) {510 if ( TypeInstType * var = dynamic_cast< TypeInstType* >( otherPointer->get_base() ) ) {509 void CommonType_old::getCommonWithVoidPointer( Pointer* voidPointer, Pointer* otherPointer ) { 510 if ( TypeInstType* var = dynamic_cast< TypeInstType* >( otherPointer->get_base() ) ) { 511 511 OpenVarSet::const_iterator entry = openVars.find( var->get_name() ); 512 512 if ( entry != openVars.end() ) { … … 517 517 } 518 518 result = voidPointer->clone(); 519 result-> tq |= otherPointer->tq;520 } 521 522 void CommonType_old::postvisit( PointerType * pointerType ) {523 if ( PointerType * otherPointer = dynamic_cast< PointerType* >( type2 ) ) {519 result->get_qualifiers() |= otherPointer->get_qualifiers(); 520 } 521 522 void CommonType_old::postvisit( PointerType *pointerType ) { 523 if ( PointerType *otherPointer = dynamic_cast< PointerType* >( type2 ) ) { 524 524 // std::cerr << "commonType: two pointers: " << pointerType << " / " << otherPointer << std::endl; 525 if ( widenFirst && dynamic_cast< VoidType * >( otherPointer->get_base() ) && ! isFtype(pointerType->get_base()) ) {525 if ( widenFirst && dynamic_cast< VoidType* >( otherPointer->get_base() ) && ! isFtype(pointerType->get_base()) ) { 526 526 getCommonWithVoidPointer( otherPointer, pointerType ); 527 } else if ( widenSecond && dynamic_cast< VoidType * >( pointerType->get_base() ) && ! isFtype(otherPointer->get_base()) ) {527 } else if ( widenSecond && dynamic_cast< VoidType* >( pointerType->get_base() ) && ! isFtype(otherPointer->get_base()) ) { 528 528 getCommonWithVoidPointer( pointerType, otherPointer ); 529 } else if ( ( pointerType->get_base()-> tq >= otherPointer->get_base()->tq|| widenFirst )530 && ( pointerType->get_base()-> tq <= otherPointer->get_base()->tq|| widenSecond ) ) {529 } else if ( ( pointerType->get_base()->get_qualifiers() >= otherPointer->get_base()->get_qualifiers() || widenFirst ) 530 && ( pointerType->get_base()->get_qualifiers() <= otherPointer->get_base()->get_qualifiers() || widenSecond ) ) { 531 531 // std::cerr << "middle case" << std::endl; 532 Type::Qualifiers tq1 = pointerType->get_base()-> tq, tq2 = otherPointer->get_base()->tq;533 pointerType->get_base()-> tq= Type::Qualifiers();534 otherPointer->get_base()-> tq= Type::Qualifiers();532 Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers(), tq2 = otherPointer->get_base()->get_qualifiers(); 533 pointerType->get_base()->get_qualifiers() = Type::Qualifiers(); 534 otherPointer->get_base()->get_qualifiers() = Type::Qualifiers(); 535 535 AssertionSet have, need; 536 536 OpenVarSet newOpen( openVars ); … … 542 542 result = otherPointer->clone(); 543 543 } // if 544 strict_dynamic_cast<PointerType *>(result)->base->tq= tq1 | tq2;544 strict_dynamic_cast<PointerType*>(result)->base->get_qualifiers() = tq1 | tq2; 545 545 } else { 546 546 /// std::cerr << "place for ptr-to-type" << std::endl; 547 547 } // if 548 pointerType->get_base()-> tq= tq1;549 otherPointer->get_base()-> tq= tq2;548 pointerType->get_base()->get_qualifiers() = tq1; 549 otherPointer->get_base()->get_qualifiers() = tq2; 550 550 } // if 551 } else if ( widenSecond && dynamic_cast< ZeroType * >( type2 ) ) {551 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 552 552 result = pointerType->clone(); 553 result-> tq |= type2->tq;553 result->get_qualifiers() |= type2->get_qualifiers(); 554 554 } // if 555 555 } … … 557 557 void CommonType_old::postvisit( ArrayType * ) {} 558 558 559 void CommonType_old::postvisit( ReferenceType * refType ) {560 if ( ReferenceType * otherRef = dynamic_cast< ReferenceType* >( type2 ) ) {559 void CommonType_old::postvisit( ReferenceType *refType ) { 560 if ( ReferenceType *otherRef = dynamic_cast< ReferenceType* >( type2 ) ) { 561 561 // std::cerr << "commonType: both references: " << refType << " / " << otherRef << std::endl; 562 // std::cerr << ( refType->get_base()-> tq >= otherRef->get_base()->tq || widenFirst ) << (refType->get_base()->tq <= otherRef->get_base()->tq|| widenSecond) << std::endl;563 if ( widenFirst && dynamic_cast< VoidType * >( otherRef->get_base() ) && ! isFtype(refType->get_base()) ) {562 // std::cerr << ( refType->get_base()->get_qualifiers() >= otherRef->get_base()->get_qualifiers() || widenFirst ) << (refType->get_base()->get_qualifiers() <= otherRef->get_base()->get_qualifiers() || widenSecond) << std::endl; 563 if ( widenFirst && dynamic_cast< VoidType* >( otherRef->get_base() ) && ! isFtype(refType->get_base()) ) { 564 564 getCommonWithVoidPointer( otherRef, refType ); 565 } else if ( widenSecond && dynamic_cast< VoidType * >( refType->get_base() ) && ! isFtype(otherRef->get_base()) ) {565 } else if ( widenSecond && dynamic_cast< VoidType* >( refType->get_base() ) && ! isFtype(otherRef->get_base()) ) { 566 566 getCommonWithVoidPointer( refType, otherRef ); 567 } else if ( ( refType->get_base()-> tq >= otherRef->get_base()->tq|| widenFirst )568 && ( refType->get_base()-> tq <= otherRef->get_base()->tq|| widenSecond ) ) {567 } else if ( ( refType->get_base()->get_qualifiers() >= otherRef->get_base()->get_qualifiers() || widenFirst ) 568 && ( refType->get_base()->get_qualifiers() <= otherRef->get_base()->get_qualifiers() || widenSecond ) ) { 569 569 // std::cerr << "middle case" << std::endl; 570 Type::Qualifiers tq1 = refType->get_base()-> tq, tq2 = otherRef->get_base()->tq;571 refType->get_base()-> tq= Type::Qualifiers();572 otherRef->get_base()-> tq= Type::Qualifiers();570 Type::Qualifiers tq1 = refType->get_base()->get_qualifiers(), tq2 = otherRef->get_base()->get_qualifiers(); 571 refType->get_base()->get_qualifiers() = Type::Qualifiers(); 572 otherRef->get_base()->get_qualifiers() = Type::Qualifiers(); 573 573 AssertionSet have, need; 574 574 OpenVarSet newOpen( openVars ); … … 579 579 result = otherRef->clone(); 580 580 } // if 581 strict_dynamic_cast<ReferenceType *>(result)->base->tq= tq1 | tq2;581 strict_dynamic_cast<ReferenceType*>(result)->base->get_qualifiers() = tq1 | tq2; 582 582 } else { 583 583 /// std::cerr << "place for ptr-to-type" << std::endl; 584 584 } // if 585 refType->get_base()-> tq= tq1;586 otherRef->get_base()-> tq= tq2;585 refType->get_base()->get_qualifiers() = tq1; 586 otherRef->get_base()->get_qualifiers() = tq2; 587 587 } // if 588 } else if ( widenSecond && dynamic_cast< ZeroType * >( type2 ) ) {588 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 589 589 result = refType->clone(); 590 result-> tq |= type2->tq;590 result->get_qualifiers() |= type2->get_qualifiers(); 591 591 } // if 592 592 } … … 596 596 void CommonType_old::postvisit( UnionInstType * ) {} 597 597 598 void CommonType_old::postvisit( EnumInstType * enumInstType ) {599 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< ZeroType * >( type2 ) || dynamic_cast< OneType* >( type2 ) ) {598 void CommonType_old::postvisit( EnumInstType *enumInstType ) { 599 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) { 600 600 // reuse BasicType, EnumInstType code by swapping type2 with enumInstType 601 601 result = commonType( type2, enumInstType, widenSecond, widenFirst, indexer, env, openVars ); … … 606 606 } 607 607 608 void CommonType_old::postvisit( TypeInstType * inst ) {608 void CommonType_old::postvisit( TypeInstType *inst ) { 609 609 if ( widenFirst ) { 610 const NamedTypeDecl *nt = indexer.lookupType( inst->get_name() );610 NamedTypeDecl *nt = indexer.lookupType( inst->get_name() ); 611 611 if ( nt ) { 612 const TypeDecl * type = strict_dynamic_cast< const TypeDecl* >( nt );612 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( nt ); 613 613 if ( type->get_base() ) { 614 Type::Qualifiers tq1 = inst-> tq, tq2 = type2->tq;614 Type::Qualifiers tq1 = inst->get_qualifiers(), tq2 = type2->get_qualifiers(); 615 615 AssertionSet have, need; 616 616 OpenVarSet newOpen( openVars ); 617 type2-> tq= Type::Qualifiers();618 type->get_base()-> tq= tq1;617 type2->get_qualifiers() = Type::Qualifiers(); 618 type->get_base()->get_qualifiers() = tq1; 619 619 if ( unifyExact( type->get_base(), type2, env, have, need, newOpen, indexer ) ) { 620 620 result = type2->clone(); 621 result-> tq= tq1 | tq2;621 result->get_qualifiers() = tq1 | tq2; 622 622 } // if 623 type2-> tq= tq2;624 type->get_base()-> tq= Type::Qualifiers();623 type2->get_qualifiers() = tq2; 624 type->get_base()->get_qualifiers() = Type::Qualifiers(); 625 625 } // if 626 626 } // if … … 631 631 void CommonType_old::postvisit( VarArgsType * ) {} 632 632 633 void CommonType_old::postvisit( ZeroType * zeroType ) {633 void CommonType_old::postvisit( ZeroType *zeroType ) { 634 634 if ( widenFirst ) { 635 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< PointerType * >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) {636 if ( widenSecond || zeroType-> tq <= type2->tq) {635 if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< PointerType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) { 636 if ( widenSecond || zeroType->get_qualifiers() <= type2->get_qualifiers() ) { 637 637 result = type2->clone(); 638 result-> tq |= zeroType->tq;639 } 640 } else if ( widenSecond && dynamic_cast< OneType * >( type2 ) ) {641 result = new BasicType( zeroType-> tq, BasicType::SignedInt );642 result-> tq |= type2->tq;643 } 644 } 645 } 646 647 void CommonType_old::postvisit( OneType * oneType ) {638 result->get_qualifiers() |= zeroType->get_qualifiers(); 639 } 640 } else if ( widenSecond && dynamic_cast< OneType* >( type2 ) ) { 641 result = new BasicType( zeroType->get_qualifiers(), BasicType::SignedInt ); 642 result->get_qualifiers() |= type2->get_qualifiers(); 643 } 644 } 645 } 646 647 void CommonType_old::postvisit( OneType *oneType ) { 648 648 if ( widenFirst ) { 649 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) {650 if ( widenSecond || oneType-> tq <= type2->tq) {649 if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) { 650 if ( widenSecond || oneType->get_qualifiers() <= type2->get_qualifiers() ) { 651 651 result = type2->clone(); 652 result-> tq |= oneType->tq;653 } 654 } else if ( widenSecond && dynamic_cast< ZeroType * >( type2 ) ) {655 result = new BasicType( oneType-> tq, BasicType::SignedInt );656 result-> tq |= type2->tq;652 result->get_qualifiers() |= oneType->get_qualifiers(); 653 } 654 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 655 result = new BasicType( oneType->get_qualifiers(), BasicType::SignedInt ); 656 result->get_qualifiers() |= type2->get_qualifiers(); 657 657 } 658 658 } … … 668 668 ast::ptr< ast::Type > result; 669 669 670 CommonType_new( 671 const ast::Type * t2, WidenMode w, const ast::SymbolTable & st, 670 CommonType_new( 671 const ast::Type * t2, WidenMode w, const ast::SymbolTable & st, 672 672 ast::TypeEnvironment & env, const ast::OpenVarSet & o ) 673 673 : type2( t2 ), widen( w ), symtab( st ), tenv( env ), open( o ), result() {} … … 681 681 #warning remove casts when `commonTypes` moved to new AST 682 682 ast::BasicType::Kind kind = (ast::BasicType::Kind)(int)commonTypes[ (BasicType::Kind)(int)basic->kind ][ (BasicType::Kind)(int)basic2->kind ]; 683 if ( 684 ( ( kind == basic->kind && basic->qualifiers >= basic2->qualifiers ) 685 || widen.first ) 686 && ( ( kind == basic2->kind && basic->qualifiers <= basic2->qualifiers ) 687 || widen.second ) 683 if ( 684 ( ( kind == basic->kind && basic->qualifiers >= basic2->qualifiers ) 685 || widen.first ) 686 && ( ( kind == basic2->kind && basic->qualifiers <= basic2->qualifiers ) 687 || widen.second ) 688 688 ) { 689 689 result = new ast::BasicType{ kind, basic->qualifiers | basic2->qualifiers }; 690 690 } 691 } else if ( 692 dynamic_cast< const ast::EnumInstType * >( type2 ) 691 } else if ( 692 dynamic_cast< const ast::EnumInstType * >( type2 ) 693 693 || dynamic_cast< const ast::ZeroType * >( type2 ) 694 694 || dynamic_cast< const ast::OneType * >( type2 ) … … 696 696 #warning remove casts when `commonTypes` moved to new AST 697 697 ast::BasicType::Kind kind = (ast::BasicType::Kind)(int)commonTypes[ (BasicType::Kind)(int)basic->kind ][ (BasicType::Kind)(int)ast::BasicType::SignedInt ]; 698 if ( 699 ( ( kind == basic->kind && basic->qualifiers >= type2->qualifiers ) 700 || widen.first ) 701 && ( ( kind != basic->kind && basic->qualifiers <= type2->qualifiers ) 702 || widen.second ) 698 if ( 699 ( ( kind == basic->kind && basic->qualifiers >= type2->qualifiers ) 700 || widen.first ) 701 && ( ( kind != basic->kind && basic->qualifiers <= type2->qualifiers ) 702 || widen.second ) 703 703 ) { 704 704 result = new ast::BasicType{ kind, basic->qualifiers | type2->qualifiers }; … … 715 715 if ( entry != open.end() ) { 716 716 ast::AssertionSet need, have; 717 if ( ! tenv.bindVar( 718 var, voidPtr->base, entry->second, need, have, open, widen, symtab ) 717 if ( ! tenv.bindVar( 718 var, voidPtr->base, entry->second, need, have, open, widen, symtab ) 719 719 ) return; 720 720 } … … 727 727 void postvisit( const ast::PointerType * pointer ) { 728 728 if ( auto pointer2 = dynamic_cast< const ast::PointerType * >( type2 ) ) { 729 if ( 730 widen.first 731 && pointer2->base.as< ast::VoidType >() 732 && ! ast::isFtype( pointer->base ) 729 if ( 730 widen.first 731 && pointer2->base.as< ast::VoidType >() 732 && ! ast::isFtype( pointer->base ) 733 733 ) { 734 734 getCommonWithVoidPointer( pointer2, pointer ); 735 } else if ( 736 widen.second 737 && pointer->base.as< ast::VoidType >() 738 && ! ast::isFtype( pointer2->base ) 735 } else if ( 736 widen.second 737 && pointer->base.as< ast::VoidType >() 738 && ! ast::isFtype( pointer2->base ) 739 739 ) { 740 740 getCommonWithVoidPointer( pointer, pointer2 ); … … 746 746 ast::CV::Qualifiers q2 = pointer2->base->qualifiers; 747 747 748 // force t{1,2} to be cloned if their qualifiers must be stripped, so that 748 // force t{1,2} to be cloned if their qualifiers must be stripped, so that 749 749 // pointer{,2}->base are unchanged 750 750 ast::ptr< ast::Type > t1{ pointer->base }, t2{ pointer2->base }; 751 751 reset_qualifiers( t1 ); 752 752 reset_qualifiers( t2 ); 753 753 754 754 ast::AssertionSet have, need; 755 755 ast::OpenVarSet newOpen{ open }; … … 758 758 if ( q1.val != q2.val ) { 759 759 // reset result->base->qualifiers to be union of two base qualifiers 760 strict_dynamic_cast< ast::PointerType * >( 761 result.get_and_mutate() 760 strict_dynamic_cast< ast::PointerType * >( 761 result.get_and_mutate() 762 762 )->base.get_and_mutate()->qualifiers = q1 | q2; 763 763 } … … 775 775 if ( auto ref2 = dynamic_cast< const ast::ReferenceType * >( type2 ) ) { 776 776 if ( 777 widen.first && ref2->base.as< ast::VoidType >() && ! ast::isFtype( ref->base ) 777 widen.first && ref2->base.as< ast::VoidType >() && ! ast::isFtype( ref->base ) 778 778 ) { 779 779 getCommonWithVoidPointer( ref2, ref ); 780 } else if ( 781 widen.second && ref->base.as< ast::VoidType>() && ! ast::isFtype( ref2->base ) 780 } else if ( 781 widen.second && ref->base.as< ast::VoidType>() && ! ast::isFtype( ref2->base ) 782 782 ) { 783 783 getCommonWithVoidPointer( ref, ref2 ); … … 788 788 ast::CV::Qualifiers q1 = ref->base->qualifiers, q2 = ref2->base->qualifiers; 789 789 790 // force t{1,2} to be cloned if their qualifiers must be stripped, so that 790 // force t{1,2} to be cloned if their qualifiers must be stripped, so that 791 791 // ref{,2}->base are unchanged 792 792 ast::ptr< ast::Type > t1{ ref->base }, t2{ ref2->base }; … … 800 800 if ( q1.val != q2.val ) { 801 801 // reset result->base->qualifiers to be union of two base qualifiers 802 strict_dynamic_cast< ast::ReferenceType * >( 803 result.get_and_mutate() 802 strict_dynamic_cast< ast::ReferenceType * >( 803 result.get_and_mutate() 804 804 )->base.get_and_mutate()->qualifiers = q1 | q2; 805 805 } … … 819 819 820 820 void postvisit( const ast::EnumInstType * enumInst ) { 821 if ( 822 dynamic_cast< const ast::BasicType * >( type2 ) 821 if ( 822 dynamic_cast< const ast::BasicType * >( type2 ) 823 823 || dynamic_cast< const ast::ZeroType * >( type2 ) 824 824 || dynamic_cast< const ast::OneType * >( type2 ) … … 834 834 if ( ! widen.first ) return; 835 835 if ( const ast::NamedTypeDecl * nt = symtab.lookupType( inst->name ) ) { 836 if ( const ast::Type * base = 837 strict_dynamic_cast< const ast::TypeDecl * >( nt )->base 836 if ( const ast::Type * base = 837 strict_dynamic_cast< const ast::TypeDecl * >( nt )->base 838 838 ) { 839 839 ast::CV::Qualifiers q1 = inst->qualifiers, q2 = type2->qualifiers; … … 860 860 void postvisit( const ast::ZeroType * zero ) { 861 861 if ( ! widen.first ) return; 862 if ( 862 if ( 863 863 dynamic_cast< const ast::BasicType * >( type2 ) 864 864 || dynamic_cast< const ast::PointerType * >( type2 ) … … 870 870 } 871 871 } else if ( widen.second && dynamic_cast< const ast::OneType * >( type2 ) ) { 872 result = new ast::BasicType{ 872 result = new ast::BasicType{ 873 873 ast::BasicType::SignedInt, zero->qualifiers | type2->qualifiers }; 874 874 } … … 877 877 void postvisit( const ast::OneType * one ) { 878 878 if ( ! widen.first ) return; 879 if ( 879 if ( 880 880 dynamic_cast< const ast::BasicType * >( type2 ) 881 881 || dynamic_cast< const ast::EnumInstType * >( type2 ) … … 886 886 } 887 887 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) { 888 result = new ast::BasicType{ 888 result = new ast::BasicType{ 889 889 ast::BasicType::SignedInt, one->qualifiers | type2->qualifiers }; 890 890 } … … 894 894 895 895 namespace { 896 ast::ptr< ast::Type > handleReference( 897 const ast::ptr< ast::Type > & t1, const ast::ptr< ast::Type > & t2, WidenMode widen, 898 const ast::SymbolTable & symtab, ast::TypeEnvironment & env, 899 const ast::OpenVarSet & open 896 ast::ptr< ast::Type > handleReference( 897 const ast::ptr< ast::Type > & t1, const ast::ptr< ast::Type > & t2, WidenMode widen, 898 const ast::SymbolTable & symtab, ast::TypeEnvironment & env, 899 const ast::OpenVarSet & open 900 900 ) { 901 901 ast::ptr<ast::Type> common; … … 926 926 927 927 ast::ptr< ast::Type > commonType( 928 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2, 929 WidenMode widen, const ast::SymbolTable & symtab, ast::TypeEnvironment & env, 930 const ast::OpenVarSet & open 928 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2, 929 WidenMode widen, const ast::SymbolTable & symtab, ast::TypeEnvironment & env, 930 const ast::OpenVarSet & open 931 931 ) { 932 932 unsigned depth1 = type1->referenceDepth(); … … 940 940 const ast::ReferenceType * ref1 = type1.as< ast::ReferenceType >(); 941 941 const ast::ReferenceType * ref2 = type1.as< ast::ReferenceType >(); 942 942 943 943 if ( depth1 > depth2 ) { 944 944 assert( ref1 ); … … 978 978 ast::OpenVarSet newOpen{ open }; 979 979 980 // force t{1,2} to be cloned if its qualifiers must be stripped, so that 981 // type1 and type->base are left unchanged; calling convention forces 980 // force t{1,2} to be cloned if its qualifiers must be stripped, so that 981 // type1 and type->base are left unchanged; calling convention forces 982 982 // {type1,type->base}->strong_ref >= 1 983 983 ast::ptr<ast::Type> t1{ type1 }, t2{ type->base }; 984 984 reset_qualifiers( t1 ); 985 985 reset_qualifiers( t2, q1 ); 986 986 987 987 if ( unifyExact( t1, t2, env, have, need, newOpen, noWiden(), symtab ) ) { 988 988 result = t1; -
src/ResolvExpr/ConversionCost.cc
rfce4e31 r302d84c2 46 46 #endif 47 47 48 Cost conversionCost( const Type * src, const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {49 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType* >( dest ) ) {48 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 49 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 50 50 PRINT( std::cerr << "type inst " << destAsTypeInst->name; ) 51 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) {51 if ( const EqvClass* eqvClass = env.lookup( destAsTypeInst->name ) ) { 52 52 if ( eqvClass->type ) { 53 53 return conversionCost( src, eqvClass->type, indexer, env ); … … 55 55 return Cost::infinity; 56 56 } 57 } else if ( const NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->name ) ) {57 } else if ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->name ) ) { 58 58 PRINT( std::cerr << " found" << std::endl; ) 59 const TypeDecl * type = dynamic_cast< const TypeDecl* >( namedType );59 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType ); 60 60 // all typedefs should be gone by this point 61 61 assert( type ); … … 77 77 PRINT( std::cerr << "compatible!" << std::endl; ) 78 78 return Cost::zero; 79 } else if ( dynamic_cast< const VoidType* >( dest ) ) {79 } else if ( dynamic_cast< VoidType* >( dest ) ) { 80 80 return Cost::safe; 81 } else if ( const ReferenceType * refType = dynamic_cast< constReferenceType * > ( dest ) ) {81 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 82 82 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 83 return convertToReferenceCost( src, refType, indexer, env, []( const Type * const t1, constType * t2, const SymTab::Indexer &, const TypeEnvironment & env ){83 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){ 84 84 return ptrsAssignable( t1, t2, env ); 85 85 }); 86 86 } else { 87 PassVisitor<ConversionCost> converter( 88 dest, indexer, env, 89 (Cost (*)( const Type *, const Type*, const SymTab::Indexer&, const TypeEnvironment&))87 PassVisitor<ConversionCost> converter( 88 dest, indexer, env, 89 (Cost (*)(Type*, Type*, const SymTab::Indexer&, const TypeEnvironment&)) 90 90 conversionCost ); 91 91 src->accept( converter ); … … 98 98 } 99 99 100 Cost convertToReferenceCost( const Type * src, constType * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {100 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 101 101 PRINT( std::cerr << "convert to reference cost... diff " << diff << " " << src << " / " << dest << std::endl; ) 102 102 if ( diff > 0 ) { 103 103 // TODO: document this 104 Cost cost = convertToReferenceCost( strict_dynamic_cast< constReferenceType * >( src )->base, dest, diff-1, indexer, env, func );104 Cost cost = convertToReferenceCost( strict_dynamic_cast< ReferenceType * >( src )->base, dest, diff-1, indexer, env, func ); 105 105 cost.incReference(); 106 106 return cost; 107 107 } else if ( diff < -1 ) { 108 108 // TODO: document this 109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< constReferenceType * >( dest )->base, diff+1, indexer, env, func );109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< ReferenceType * >( dest )->base, diff+1, indexer, env, func ); 110 110 cost.incReference(); 111 111 return cost; 112 112 } else if ( diff == 0 ) { 113 const ReferenceType * srcAsRef = dynamic_cast< constReferenceType * >( src );114 const ReferenceType * destAsRef = dynamic_cast< constReferenceType * >( dest );113 ReferenceType * srcAsRef = dynamic_cast< ReferenceType * >( src ); 114 ReferenceType * destAsRef = dynamic_cast< ReferenceType * >( dest ); 115 115 if ( srcAsRef && destAsRef ) { // pointer-like conversions between references 116 116 PRINT( std::cerr << "converting between references" << std::endl; ) 117 Type::Qualifiers tq1 = srcAsRef->base-> tq;118 Type::Qualifiers tq2 = destAsRef->base-> tq;117 Type::Qualifiers tq1 = srcAsRef->base->get_qualifiers(); 118 Type::Qualifiers tq2 = destAsRef->base->get_qualifiers(); 119 119 if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( srcAsRef->base, destAsRef->base, indexer, env ) ) { 120 120 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; ) … … 137 137 } else { 138 138 PRINT( std::cerr << "reference to rvalue conversion" << std::endl; ) 139 PassVisitor<ConversionCost> converter( 140 dest, indexer, env, 141 (Cost (*)( const Type *, const Type*, const SymTab::Indexer&, const TypeEnvironment&))139 PassVisitor<ConversionCost> converter( 140 dest, indexer, env, 141 (Cost (*)(Type*, Type*, const SymTab::Indexer&, const TypeEnvironment&)) 142 142 conversionCost ); 143 143 src->accept( converter ); … … 145 145 } // if 146 146 } else { 147 const ReferenceType * destAsRef = dynamic_cast< constReferenceType * >( dest );147 ReferenceType * destAsRef = dynamic_cast< ReferenceType * >( dest ); 148 148 assert( diff == -1 && destAsRef ); 149 149 PRINT( std::cerr << "dest is: " << dest << " / src is: " << src << std::endl; ) … … 156 156 ) 157 157 // lvalue-to-reference conversion: cv lvalue T => cv T & 158 if ( src-> tq == destAsRef->base->tq) {158 if ( src->get_qualifiers() == destAsRef->base->get_qualifiers() ) { 159 159 return Cost::reference; // cost needs to be non-zero to add cast 160 } if ( src-> tq < destAsRef->base->tq) {160 } if ( src->get_qualifiers() < destAsRef->base->get_qualifiers() ) { 161 161 return Cost::safe; // cost needs to be higher than previous cast to differentiate adding qualifiers vs. keeping same 162 162 } else { … … 178 178 } 179 179 180 Cost convertToReferenceCost( const Type * src, constReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {180 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 181 181 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 182 182 Cost cost = convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env, func ); … … 185 185 } 186 186 187 ConversionCost::ConversionCost( const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )187 ConversionCost::ConversionCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 188 188 : dest( dest ), indexer( indexer ), cost( Cost::infinity ), env( env ), costFunc( costFunc ) { 189 189 } … … 193 193 /* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves) 194 194 _Bool 195 char signed char unsigned char 196 signed short int unsigned short int 197 signed int unsigned int 198 signed long int unsigned long int 199 signed long long int unsigned long long int 200 __int128 unsigned __int128 201 _Float16 _Float16 _Complex 202 _Float32 _Float32 _Complex 203 float float _Complex 204 _Float32x _Float32x _Complex 205 _Float64 _Float64 _Complex 206 double double _Complex 207 _Float64x _Float64x _Complex 195 char signed char unsigned char 196 signed short int unsigned short int 197 signed int unsigned int 198 signed long int unsigned long int 199 signed long long int unsigned long long int 200 __int128 unsigned __int128 201 _Float16 _Float16 _Complex 202 _Float32 _Float32 _Complex 203 float float _Complex 204 _Float32x _Float32x _Complex 205 _Float64 _Float64 _Complex 206 double double _Complex 207 _Float64x _Float64x _Complex 208 208 __float80 209 _Float128 _Float128 _Complex 209 _Float128 _Float128 _Complex 210 210 __float128 211 long double long double _Complex 212 _Float128x _Float128x _Complex 211 long double long double _Complex 212 _Float128x _Float128x _Complex 213 213 */ 214 214 // GENERATED END … … 218 218 static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node 219 219 /* B C SC UC SI SUI I UI LI LUI LLI LLUI IB UIB _FH _FH _F _FC F FC _FX _FXC FD _FDC D DC F80X_FDXC F80 _FB_FLDC FB LD LDC _FBX_FLDXC */ 220 /* B */ { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 18, 17, },221 /* C */ { -1, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },222 /* SC */ { -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },223 /* UC */ { -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },224 /* SI */ { -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, },225 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, },226 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, },227 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, },228 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, },229 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, },230 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, },231 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, },232 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, },233 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, },234 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 11, 10, },235 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1, -1, 7, -1, -1, 8, -1, 9, },236 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 8, 10, 9, },237 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, -1, 6, -1, -1, 7, -1, 8, },238 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 7, 9, 8, },239 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, -1, 5, -1, -1, 6, -1, 7, },240 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 6, 8, 7, },241 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, 5, -1, 6, },242 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 5, 7, 6, },243 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, -1, 3, -1, -1, 4, -1, 5, },244 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 4, 6, 5, },245 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, 2, -1, -1, 3, -1, 4, },246 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 3, 5, 4, },247 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, 2, -1, 3, },220 /* B*/ { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 18, 17, }, 221 /* C*/ { -1, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 222 /* SC*/ { -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 223 /* UC*/ { -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 224 /* SI*/ { -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, }, 225 /* SUI*/ { -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, }, 226 /* I*/ { -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, }, 227 /* UI*/ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, }, 228 /* LI*/ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, }, 229 /* LUI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, }, 230 /* LLI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, }, 231 /* LLUI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, }, 232 /* IB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, }, 233 /* UIB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, }, 234 /* _FH*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 11, 10, }, 235 /* _FH*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1, -1, 7, -1, -1, 8, -1, 9, }, 236 /* _F*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 8, 10, 9, }, 237 /* _FC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, -1, 6, -1, -1, 7, -1, 8, }, 238 /* F*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 7, 9, 8, }, 239 /* FC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, -1, 5, -1, -1, 6, -1, 7, }, 240 /* _FX*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 6, 8, 7, }, 241 /* _FXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, 5, -1, 6, }, 242 /* FD*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 5, 7, 6, }, 243 /* _FDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, -1, 3, -1, -1, 4, -1, 5, }, 244 /* D*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 4, 6, 5, }, 245 /* DC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, 2, -1, -1, 3, -1, 4, }, 246 /* F80X*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 3, 5, 4, }, 247 /* _FDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, 2, -1, 3, }, 248 248 /* F80*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, 3, 4, 4, }, 249 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, },250 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, },251 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, },252 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, },253 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, },254 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, },255 /* _FLDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, },249 /* _FB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, }, 250 /* _FLDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, }, 251 /* FB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, }, 252 /* LD*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, }, 253 /* LDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, }, 254 /* _FBX*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, }, 255 /*_FLDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, }, 256 256 }; // costMatrix 257 257 static const int maxIntCost = 15; 258 258 // GENERATED END 259 259 static_assert( 260 sizeof(costMatrix)/sizeof(costMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES *BasicType::NUMBER_OF_BASIC_TYPES,260 sizeof(costMatrix)/sizeof(costMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES, 261 261 "Missing row in the cost matrix" 262 262 ); … … 266 266 static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion 267 267 /* B C SC UC SI SUI I UI LI LUI LLI LLUI IB UIB _FH _FH _F _FC F FC _FX _FXC FD _FDC D DC F80X_FDXC F80 _FB_FLDC FB LD LDC _FBX_FLDXC */ 268 /* B */ { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },269 /* C */ { -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },270 /* SC */ { -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },271 /* UC */ { -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },272 /* SI */ { -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },273 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },274 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },275 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },276 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },277 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },278 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },279 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },280 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },281 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },282 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },283 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },284 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },285 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },286 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },287 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },288 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },289 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },290 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },291 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },292 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },293 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },294 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },295 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },268 /* B*/ { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 269 /* C*/ { -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 270 /* SC*/ { -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 271 /* UC*/ { -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 272 /* SI*/ { -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 273 /* SUI*/ { -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 274 /* I*/ { -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 275 /* UI*/ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 276 /* LI*/ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 277 /* LUI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 278 /* LLI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 279 /* LLUI*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 280 /* IB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 281 /* UIB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 282 /* _FH*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 283 /* _FH*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 284 /* _F*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 285 /* _FC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 286 /* F*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 287 /* FC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 288 /* _FX*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 289 /* _FXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 290 /* FD*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 291 /* _FDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 292 /* D*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 293 /* DC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 294 /* F80X*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 295 /* _FDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 296 296 /* F80*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 297 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, },298 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, 0, },299 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, },300 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, },301 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, },302 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, },303 /* _FLDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, },297 /* _FB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, }, 298 /* _FLDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, 0, }, 299 /* FB*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, }, 300 /* LD*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, }, 301 /* LDC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, }, 302 /* _FBX*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, }, 303 /*_FLDXC*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, }, 304 304 }; // signMatrix 305 305 // GENERATED END 306 306 static_assert( 307 sizeof(signMatrix)/sizeof(signMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES *BasicType::NUMBER_OF_BASIC_TYPES,307 sizeof(signMatrix)/sizeof(signMatrix[0][0]) == BasicType::NUMBER_OF_BASIC_TYPES*BasicType::NUMBER_OF_BASIC_TYPES, 308 308 "Missing row in the sign matrix" 309 309 ); 310 310 311 void ConversionCost::postvisit( constVoidType * ) {311 void ConversionCost::postvisit( VoidType * ) { 312 312 cost = Cost::infinity; 313 313 } 314 314 315 void ConversionCost::postvisit( const BasicType *basicType) {316 if ( const BasicType * destAsBasic = dynamic_cast< const BasicType* >( dest ) ) {317 int tableResult = costMatrix[ basicType-> kind ][ destAsBasic->kind];315 void ConversionCost::postvisit(BasicType *basicType) { 316 if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 317 int tableResult = costMatrix[ basicType->get_kind() ][ destAsBasic->get_kind() ]; 318 318 if ( tableResult == -1 ) { 319 319 cost = Cost::unsafe; … … 321 321 cost = Cost::zero; 322 322 cost.incSafe( tableResult ); 323 cost.incSign( signMatrix[ basicType-> kind ][ destAsBasic->kind] );324 } // if 325 } else if ( dynamic_cast< const EnumInstType *>( dest ) ) {323 cost.incSign( signMatrix[ basicType->get_kind() ][ destAsBasic->get_kind() ] ); 324 } // if 325 } else if ( dynamic_cast< EnumInstType *>( dest ) ) { 326 326 // xxx - not positive this is correct, but appears to allow casting int => enum 327 327 cost = Cost::unsafe; … … 330 330 } 331 331 332 void ConversionCost::postvisit( constPointerType * pointerType ) {333 if ( const PointerType * destAsPtr = dynamic_cast< const PointerType* >( dest ) ) {332 void ConversionCost::postvisit( PointerType * pointerType ) { 333 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 334 334 PRINT( std::cerr << pointerType << " ===> " << destAsPtr << std::endl; ) 335 Type::Qualifiers tq1 = pointerType->base-> tq;336 Type::Qualifiers tq2 = destAsPtr->base-> tq;335 Type::Qualifiers tq1 = pointerType->base->get_qualifiers(); 336 Type::Qualifiers tq2 = destAsPtr->base->get_qualifiers(); 337 337 if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( pointerType->base, destAsPtr->base, indexer, env ) ) { 338 338 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; ) … … 363 363 } 364 364 365 void ConversionCost::postvisit( constArrayType * ) {}366 367 void ConversionCost::postvisit( constReferenceType * refType ) {365 void ConversionCost::postvisit( ArrayType * ) {} 366 367 void ConversionCost::postvisit( ReferenceType * refType ) { 368 368 // Note: dest can never be a reference, since it would have been caught in an earlier check 369 assert( ! dynamic_cast< constReferenceType * >( dest ) );369 assert( ! dynamic_cast< ReferenceType * >( dest ) ); 370 370 // convert reference to rvalue: cv T1 & => T2 371 371 // recursively compute conversion cost from T1 to T2. 372 372 // cv can be safely dropped because of 'implicit dereference' behavior. 373 373 cost = costFunc( refType->base, dest, indexer, env ); 374 if ( refType->base-> tq == dest->tq) {374 if ( refType->base->get_qualifiers() == dest->get_qualifiers() ) { 375 375 cost.incReference(); // prefer exact qualifiers 376 } else if ( refType->base-> tq < dest->tq) {376 } else if ( refType->base->get_qualifiers() < dest->get_qualifiers() ) { 377 377 cost.incSafe(); // then gaining qualifiers 378 378 } else { … … 382 382 } 383 383 384 void ConversionCost::postvisit( constFunctionType * ) {}385 386 void ConversionCost::postvisit( constStructInstType * inst ) {387 if ( const StructInstType * destAsInst = dynamic_cast< const StructInstType* >( dest ) ) {384 void ConversionCost::postvisit( FunctionType * ) {} 385 386 void ConversionCost::postvisit( StructInstType * inst ) { 387 if ( StructInstType *destAsInst = dynamic_cast< StructInstType* >( dest ) ) { 388 388 if ( inst->name == destAsInst->name ) { 389 389 cost = Cost::zero; … … 392 392 } 393 393 394 void ConversionCost::postvisit( constUnionInstType * inst ) {395 if ( const UnionInstType * destAsInst = dynamic_cast< const UnionInstType* >( dest ) ) {394 void ConversionCost::postvisit( UnionInstType * inst ) { 395 if ( UnionInstType *destAsInst = dynamic_cast< UnionInstType* >( dest ) ) { 396 396 if ( inst->name == destAsInst->name ) { 397 397 cost = Cost::zero; … … 400 400 } 401 401 402 void ConversionCost::postvisit( constEnumInstType * ) {402 void ConversionCost::postvisit( EnumInstType * ) { 403 403 static Type::Qualifiers q; 404 404 static BasicType integer( q, BasicType::SignedInt ); … … 409 409 } 410 410 411 void ConversionCost::postvisit( constTraitInstType * ) {}412 413 void ConversionCost::postvisit( const TypeInstType *inst ) {414 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) {411 void ConversionCost::postvisit( TraitInstType * ) {} 412 413 void ConversionCost::postvisit( TypeInstType *inst ) { 414 if ( const EqvClass *eqvClass = env.lookup( inst->name ) ) { 415 415 cost = costFunc( eqvClass->type, dest, indexer, env ); 416 } else if ( const TypeInstType * destAsInst = dynamic_cast< const TypeInstType* >( dest ) ) {416 } else if ( TypeInstType *destAsInst = dynamic_cast< TypeInstType* >( dest ) ) { 417 417 if ( inst->name == destAsInst->name ) { 418 418 cost = Cost::zero; 419 419 } 420 } else if ( const NamedTypeDecl *namedType = indexer.lookupType( inst->name ) ) {421 const TypeDecl * type = dynamic_cast< const TypeDecl* >( namedType );420 } else if ( NamedTypeDecl *namedType = indexer.lookupType( inst->name ) ) { 421 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType ); 422 422 // all typedefs should be gone by this point 423 423 assert( type ); … … 428 428 } 429 429 430 void ConversionCost::postvisit( constTupleType * tupleType ) {430 void ConversionCost::postvisit( TupleType * tupleType ) { 431 431 Cost c = Cost::zero; 432 if ( const TupleType * destAsTuple = dynamic_cast< constTupleType * >( dest ) ) {432 if ( TupleType * destAsTuple = dynamic_cast< TupleType * >( dest ) ) { 433 433 std::list< Type * >::const_iterator srcIt = tupleType->types.begin(); 434 434 std::list< Type * >::const_iterator destIt = destAsTuple->types.begin(); 435 435 while ( srcIt != tupleType->types.end() && destIt != destAsTuple->types.end() ) { 436 Cost newCost = costFunc( * srcIt++, *destIt++, indexer, env );436 Cost newCost = costFunc( *srcIt++, *destIt++, indexer, env ); 437 437 if ( newCost == Cost::infinity ) { 438 438 return; … … 448 448 } 449 449 450 void ConversionCost::postvisit( constVarArgsType * ) {451 if ( dynamic_cast< const VarArgsType* >( dest ) ) {452 cost = Cost::zero; 453 } 454 } 455 456 void ConversionCost::postvisit( constZeroType * ) {457 if ( dynamic_cast< constZeroType * >( dest ) ) {458 cost = Cost::zero; 459 } else if ( const BasicType * destAsBasic = dynamic_cast< const BasicType* >( dest ) ) {460 // copied from visit(BasicType *) for signed int, but +1 for safe conversions461 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic-> kind];450 void ConversionCost::postvisit( VarArgsType * ) { 451 if ( dynamic_cast< VarArgsType* >( dest ) ) { 452 cost = Cost::zero; 453 } 454 } 455 456 void ConversionCost::postvisit( ZeroType * ) { 457 if ( dynamic_cast< ZeroType * >( dest ) ) { 458 cost = Cost::zero; 459 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 460 // copied from visit(BasicType*) for signed int, but +1 for safe conversions 461 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ]; 462 462 if ( tableResult == -1 ) { 463 463 cost = Cost::unsafe; … … 465 465 cost = Cost::zero; 466 466 cost.incSafe( tableResult + 1 ); 467 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic-> kind] );468 } // if 469 } else if ( dynamic_cast< const PointerType* >( dest ) ) {467 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ] ); 468 } // if 469 } else if ( dynamic_cast< PointerType* >( dest ) ) { 470 470 cost = Cost::zero; 471 471 cost.incSafe( maxIntCost + 2 ); // +1 for zero_t -> int, +1 for disambiguation … … 473 473 } 474 474 475 void ConversionCost::postvisit( constOneType * ) {476 if ( dynamic_cast< constOneType * >( dest ) ) {477 cost = Cost::zero; 478 } else if ( const BasicType * destAsBasic = dynamic_cast< const BasicType* >( dest ) ) {479 // copied from visit(BasicType *) for signed int, but +1 for safe conversions480 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic-> kind];475 void ConversionCost::postvisit( OneType * ) { 476 if ( dynamic_cast< OneType * >( dest ) ) { 477 cost = Cost::zero; 478 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 479 // copied from visit(BasicType*) for signed int, but +1 for safe conversions 480 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ]; 481 481 if ( tableResult == -1 ) { 482 482 cost = Cost::unsafe; … … 484 484 cost = Cost::zero; 485 485 cost.incSafe( tableResult + 1 ); 486 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic-> kind] );486 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ] ); 487 487 } // if 488 488 } // if … … 729 729 auto dstEnd = dstAsTuple->types.end(); 730 730 while ( srcIt != srcEnd && dstIt != dstEnd ) { 731 Cost newCost = costCalc( * srcIt++, *dstIt++, symtab, env );731 Cost newCost = costCalc( *srcIt++, *dstIt++, symtab, env ); 732 732 if ( newCost == Cost::infinity ) { 733 733 return; -
src/ResolvExpr/ConversionCost.h
rfce4e31 r302d84c2 33 33 class TypeEnvironment; 34 34 35 typedef std::function<Cost( const Type *, constType *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction;35 typedef std::function<Cost(Type *, Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 36 36 struct ConversionCost : public WithShortCircuiting { 37 37 public: 38 ConversionCost( const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction );38 ConversionCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 39 39 40 40 Cost get_cost() const { return cost; } 41 41 42 void previsit( constBaseSyntaxNode * ) { visit_children = false; }42 void previsit( BaseSyntaxNode * ) { visit_children = false; } 43 43 44 void postvisit( constVoidType * voidType );45 void postvisit( constBasicType * basicType );46 void postvisit( constPointerType * pointerType );47 void postvisit( constArrayType * arrayType );48 void postvisit( constReferenceType * refType );49 void postvisit( constFunctionType * functionType );50 void postvisit( constStructInstType * aggregateUseType );51 void postvisit( constUnionInstType * aggregateUseType );52 void postvisit( constEnumInstType * aggregateUseType );53 void postvisit( constTraitInstType * aggregateUseType );54 void postvisit( constTypeInstType * aggregateUseType );55 void postvisit( constTupleType * tupleType );56 void postvisit( constVarArgsType * varArgsType );57 void postvisit( constZeroType * zeroType );58 void postvisit( constOneType * oneType );44 void postvisit( VoidType * voidType ); 45 void postvisit( BasicType * basicType ); 46 void postvisit( PointerType * pointerType ); 47 void postvisit( ArrayType * arrayType ); 48 void postvisit( ReferenceType * refType ); 49 void postvisit( FunctionType * functionType ); 50 void postvisit( StructInstType * aggregateUseType ); 51 void postvisit( UnionInstType * aggregateUseType ); 52 void postvisit( EnumInstType * aggregateUseType ); 53 void postvisit( TraitInstType * aggregateUseType ); 54 void postvisit( TypeInstType * aggregateUseType ); 55 void postvisit( TupleType * tupleType ); 56 void postvisit( VarArgsType * varArgsType ); 57 void postvisit( ZeroType * zeroType ); 58 void postvisit( OneType * oneType ); 59 59 protected: 60 const Type *dest;60 Type *dest; 61 61 const SymTab::Indexer &indexer; 62 62 Cost cost; … … 65 65 }; 66 66 67 typedef std::function<int( const Type *, constType *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction;68 Cost convertToReferenceCost( const Type * src, constReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func );67 typedef std::function<int(Type *, Type *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction; 68 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 69 69 70 70 // Some function pointer types, differ in return type. -
src/ResolvExpr/PtrsAssignable.cc
rfce4e31 r302d84c2 27 27 namespace ResolvExpr { 28 28 struct PtrsAssignable : public WithShortCircuiting { 29 PtrsAssignable( const Type *dest, const TypeEnvironment &env );29 PtrsAssignable( Type *dest, const TypeEnvironment &env ); 30 30 31 31 int get_result() const { return result; } 32 32 33 void previsit( constType * ) { visit_children = false; }34 35 void postvisit( constVoidType * voidType );36 void postvisit( constBasicType * basicType );37 void postvisit( constPointerType * pointerType );38 void postvisit( constArrayType * arrayType );39 void postvisit( constFunctionType * functionType );40 void postvisit( constStructInstType * inst );41 void postvisit( constUnionInstType * inst );42 void postvisit( constEnumInstType * inst );43 void postvisit( constTraitInstType * inst );44 void postvisit( constTypeInstType * inst );45 void postvisit( constTupleType * tupleType );46 void postvisit( constVarArgsType * varArgsType );47 void postvisit( constZeroType * zeroType );48 void postvisit( constOneType * oneType );33 void previsit( Type * ) { visit_children = false; } 34 35 void postvisit( VoidType * voidType ); 36 void postvisit( BasicType * basicType ); 37 void postvisit( PointerType * pointerType ); 38 void postvisit( ArrayType * arrayType ); 39 void postvisit( FunctionType * functionType ); 40 void postvisit( StructInstType * inst ); 41 void postvisit( UnionInstType * inst ); 42 void postvisit( EnumInstType * inst ); 43 void postvisit( TraitInstType * inst ); 44 void postvisit( TypeInstType * inst ); 45 void postvisit( TupleType * tupleType ); 46 void postvisit( VarArgsType * varArgsType ); 47 void postvisit( ZeroType * zeroType ); 48 void postvisit( OneType * oneType ); 49 49 private: 50 const Type *dest;50 Type *dest; 51 51 int result; 52 52 const TypeEnvironment &env; 53 53 }; 54 54 55 int ptrsAssignable( const Type *src, const Type *dest, const TypeEnvironment &env ) {55 int ptrsAssignable( Type *src, Type *dest, const TypeEnvironment &env ) { 56 56 // std::cerr << "assignable: " << src << " | " << dest << std::endl; 57 if ( const TypeInstType * destAsTypeInst = dynamic_cast< constTypeInstType* >( dest ) ) {58 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->get_name() ) ) {57 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 58 if ( const EqvClass *eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 59 59 return ptrsAssignable( src, eqvClass->type, env ); 60 60 } // if 61 61 } // if 62 if ( dynamic_cast< constVoidType* >( dest ) ) {62 if ( dynamic_cast< VoidType* >( dest ) ) { 63 63 // void * = T * for any T is unsafe 64 64 // xxx - this should be safe, but that currently breaks the build … … 71 71 } 72 72 73 PtrsAssignable::PtrsAssignable( const Type *dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {}74 75 void PtrsAssignable::postvisit( constVoidType * ) {73 PtrsAssignable::PtrsAssignable( Type *dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {} 74 75 void PtrsAssignable::postvisit( VoidType * ) { 76 76 // T * = void * is disallowed - this is a change from C, where any 77 77 // void * can be assigned or passed to a non-void pointer without a cast. 78 78 } 79 79 80 void PtrsAssignable::postvisit( const BasicType *) {}81 void PtrsAssignable::postvisit( const PointerType *) {}82 void PtrsAssignable::postvisit( const ArrayType *) {}83 void PtrsAssignable::postvisit( const FunctionType *) {}84 85 void PtrsAssignable::postvisit( const StructInstType *) {}86 void PtrsAssignable::postvisit( const UnionInstType *) {}87 88 void PtrsAssignable::postvisit( constEnumInstType * ) {89 if ( dynamic_cast< constBasicType* >( dest ) ) {80 void PtrsAssignable::postvisit( __attribute__((unused)) BasicType *basicType ) {} 81 void PtrsAssignable::postvisit( __attribute__((unused)) PointerType *pointerType ) {} 82 void PtrsAssignable::postvisit( __attribute__((unused)) ArrayType *arrayType ) {} 83 void PtrsAssignable::postvisit( __attribute__((unused)) FunctionType *functionType ) {} 84 85 void PtrsAssignable::postvisit( __attribute__((unused)) StructInstType *inst ) {} 86 void PtrsAssignable::postvisit( __attribute__((unused)) UnionInstType *inst ) {} 87 88 void PtrsAssignable::postvisit( EnumInstType * ) { 89 if ( dynamic_cast< BasicType* >( dest ) ) { 90 90 // int * = E *, etc. is safe. This isn't technically correct, as each 91 91 // enum has one basic type that it is compatible with, an that type can … … 97 97 } 98 98 99 void PtrsAssignable::postvisit( const TraitInstType *) {}100 void PtrsAssignable::postvisit( const TypeInstType *inst ) {101 if ( const EqvClass * eqvClass = env.lookup( inst->name) ) {99 void PtrsAssignable::postvisit( __attribute__((unused)) TraitInstType *inst ) {} 100 void PtrsAssignable::postvisit( TypeInstType *inst ) { 101 if ( const EqvClass *eqvClass = env.lookup( inst->get_name() ) ) { 102 102 if ( eqvClass->type ) { 103 103 // T * = S * for any S depends on the type bound to T … … 107 107 } 108 108 109 void PtrsAssignable::postvisit( const TupleType *) {}110 void PtrsAssignable::postvisit( const VarArgsType *) {}111 void PtrsAssignable::postvisit( const ZeroType *) {}112 void PtrsAssignable::postvisit( const OneType *) {}109 void PtrsAssignable::postvisit( __attribute__((unused)) TupleType *tupleType ) {} 110 void PtrsAssignable::postvisit( __attribute__((unused)) VarArgsType *varArgsType ) {} 111 void PtrsAssignable::postvisit( __attribute__((unused)) ZeroType *zeroType ) {} 112 void PtrsAssignable::postvisit( __attribute__((unused)) OneType *oneType ) {} 113 113 114 114 // TODO: Get rid of the `_new` suffix when the old version is removed. -
src/ResolvExpr/PtrsCastable.cc
rfce4e31 r302d84c2 29 29 struct PtrsCastable_old : public WithShortCircuiting { 30 30 public: 31 PtrsCastable_old( const Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer );31 PtrsCastable_old( Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ); 32 32 33 33 int get_result() const { return result; } 34 34 35 void previsit( constType * ) { visit_children = false; }36 37 void postvisit( constVoidType * voidType );38 void postvisit( constBasicType * basicType );39 void postvisit( constPointerType * pointerType );40 void postvisit( constArrayType * arrayType );41 void postvisit( constFunctionType * functionType );42 void postvisit( constStructInstType * inst );43 void postvisit( constUnionInstType * inst );44 void postvisit( constEnumInstType * inst );45 void postvisit( constTraitInstType * inst );46 void postvisit( constTypeInstType * inst );47 void postvisit( constTupleType * tupleType );48 void postvisit( constVarArgsType * varArgsType );49 void postvisit( constZeroType * zeroType );50 void postvisit( constOneType * oneType );35 void previsit( Type * ) { visit_children = false; } 36 37 void postvisit( VoidType * voidType ); 38 void postvisit( BasicType * basicType ); 39 void postvisit( PointerType * pointerType ); 40 void postvisit( ArrayType * arrayType ); 41 void postvisit( FunctionType * functionType ); 42 void postvisit( StructInstType * inst ); 43 void postvisit( UnionInstType * inst ); 44 void postvisit( EnumInstType * inst ); 45 void postvisit( TraitInstType * inst ); 46 void postvisit( TypeInstType * inst ); 47 void postvisit( TupleType * tupleType ); 48 void postvisit( VarArgsType * varArgsType ); 49 void postvisit( ZeroType * zeroType ); 50 void postvisit( OneType * oneType ); 51 51 private: 52 const Type *dest;52 Type *dest; 53 53 int result; 54 54 const TypeEnvironment &env; … … 57 57 58 58 namespace { 59 int objectCast( const Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {60 if ( dynamic_cast< constFunctionType* >( src ) ) {59 int objectCast( Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 60 if ( dynamic_cast< FunctionType* >( src ) ) { 61 61 return -1; 62 } else if ( const TypeInstType * typeInst = dynamic_cast< constTypeInstType* >( src ) ) {63 if ( const NamedTypeDecl * ntDecl = indexer.lookupType( typeInst->name) ) {64 if ( const TypeDecl * tyDecl = dynamic_cast< constTypeDecl* >( ntDecl ) ) {65 if ( tyDecl-> kind== TypeDecl::Ftype ) {62 } else if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( src ) ) { 63 if ( NamedTypeDecl *ntDecl = indexer.lookupType( typeInst->get_name() ) ) { 64 if ( TypeDecl *tyDecl = dynamic_cast< TypeDecl* >( ntDecl ) ) { 65 if ( tyDecl->get_kind() == TypeDecl::Ftype ) { 66 66 return -1; 67 67 } // if 68 68 } //if 69 } else if ( const EqvClass * eqvClass = env.lookup( typeInst->get_name() ) ) {69 } else if ( const EqvClass *eqvClass = env.lookup( typeInst->get_name() ) ) { 70 70 if ( eqvClass->data.kind == TypeDecl::Ftype ) { 71 71 return -1; … … 75 75 return 1; 76 76 } 77 int functionCast( const Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {77 int functionCast( Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 78 78 return -1 * objectCast( src, env, indexer ); // reverse the sense of objectCast 79 79 } 80 80 } 81 81 82 int ptrsCastable( const Type * src, const Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {83 if ( const TypeInstType * destAsTypeInst = dynamic_cast< constTypeInstType* >( dest ) ) {84 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->get_name() ) ) {82 int ptrsCastable( Type *src, Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 83 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 84 if ( const EqvClass *eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 85 85 // xxx - should this be ptrsCastable? 86 86 return ptrsAssignable( src, eqvClass->type, env ); 87 87 } // if 88 88 } // if 89 if ( dynamic_cast< constVoidType* >( dest ) ) {89 if ( dynamic_cast< VoidType* >( dest ) ) { 90 90 return objectCast( src, env, indexer ); 91 91 } else { … … 96 96 } 97 97 98 PtrsCastable_old::PtrsCastable_old( const Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer )98 PtrsCastable_old::PtrsCastable_old( Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ) 99 99 : dest( dest ), result( 0 ), env( env ), indexer( indexer ) { 100 100 } 101 101 102 void PtrsCastable_old::postvisit( constVoidType * ) {103 result = objectCast( dest, env, indexer ); 104 } 105 106 void PtrsCastable_old::postvisit( constBasicType * ) {107 result = objectCast( dest, env, indexer ); 108 } 109 110 void PtrsCastable_old::postvisit( constPointerType * ) {111 result = objectCast( dest, env, indexer ); 112 } 113 114 void PtrsCastable_old::postvisit( constArrayType * ) {115 result = objectCast( dest, env, indexer ); 116 } 117 118 void PtrsCastable_old::postvisit( constFunctionType * ) {102 void PtrsCastable_old::postvisit( VoidType * ) { 103 result = objectCast( dest, env, indexer ); 104 } 105 106 void PtrsCastable_old::postvisit( BasicType * ) { 107 result = objectCast( dest, env, indexer ); 108 } 109 110 void PtrsCastable_old::postvisit( PointerType * ) { 111 result = objectCast( dest, env, indexer ); 112 } 113 114 void PtrsCastable_old::postvisit( ArrayType * ) { 115 result = objectCast( dest, env, indexer ); 116 } 117 118 void PtrsCastable_old::postvisit( FunctionType * ) { 119 119 // result = -1; 120 120 result = functionCast( dest, env, indexer ); 121 121 } 122 122 123 void PtrsCastable_old::postvisit( constStructInstType * ) {124 result = objectCast( dest, env, indexer ); 125 } 126 127 void PtrsCastable_old::postvisit( constUnionInstType * ) {128 result = objectCast( dest, env, indexer ); 129 } 130 131 void PtrsCastable_old::postvisit( constEnumInstType * ) {132 if ( dynamic_cast< const EnumInstType* >( dest ) ) {123 void PtrsCastable_old::postvisit( StructInstType * ) { 124 result = objectCast( dest, env, indexer ); 125 } 126 127 void PtrsCastable_old::postvisit( UnionInstType * ) { 128 result = objectCast( dest, env, indexer ); 129 } 130 131 void PtrsCastable_old::postvisit( EnumInstType * ) { 132 if ( dynamic_cast< EnumInstType* >( dest ) ) { 133 133 result = 1; 134 } else if ( const BasicType * bt = dynamic_cast< const BasicType* >( dest ) ) {135 if ( bt-> kind== BasicType::SignedInt ) {134 } else if ( BasicType *bt = dynamic_cast< BasicType* >( dest ) ) { 135 if ( bt->get_kind() == BasicType::SignedInt ) { 136 136 result = 0; 137 137 } else { … … 143 143 } 144 144 145 void PtrsCastable_old::postvisit( constTraitInstType * ) {}146 147 void PtrsCastable_old::postvisit( constTypeInstType *inst ) {145 void PtrsCastable_old::postvisit( TraitInstType * ) {} 146 147 void PtrsCastable_old::postvisit(TypeInstType *inst ) { 148 148 //result = objectCast( inst, env, indexer ) > 0 && objectCast( dest, env, indexer ) > 0 ? 1 : -1; 149 149 result = objectCast( inst, env, indexer ) == objectCast( dest, env, indexer ) ? 1 : -1; 150 150 } 151 151 152 void PtrsCastable_old::postvisit( constTupleType * ) {153 result = objectCast( dest, env, indexer ); 154 } 155 156 void PtrsCastable_old::postvisit( constVarArgsType * ) {157 result = objectCast( dest, env, indexer ); 158 } 159 160 void PtrsCastable_old::postvisit( constZeroType * ) {161 result = objectCast( dest, env, indexer ); 162 } 163 164 void PtrsCastable_old::postvisit( constOneType * ) {152 void PtrsCastable_old::postvisit( TupleType * ) { 153 result = objectCast( dest, env, indexer ); 154 } 155 156 void PtrsCastable_old::postvisit( VarArgsType * ) { 157 result = objectCast( dest, env, indexer ); 158 } 159 160 void PtrsCastable_old::postvisit( ZeroType * ) { 161 result = objectCast( dest, env, indexer ); 162 } 163 164 void PtrsCastable_old::postvisit( OneType * ) { 165 165 result = objectCast( dest, env, indexer ); 166 166 } … … 168 168 namespace { 169 169 // can this type be cast to an object (1 for yes, -1 for no) 170 int objectCast( 171 const ast::Type * src, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 170 int objectCast( 171 const ast::Type * src, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 172 172 ) { 173 173 if ( dynamic_cast< const ast::FunctionType * >( src ) ) { … … 191 191 192 192 // can this type be cast to a function (inverse of objectCast) 193 int functionCast( 194 const ast::Type * src, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 193 int functionCast( 194 const ast::Type * src, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab 195 195 ) { 196 196 return -1 * objectCast( src, env, symtab ); … … 204 204 int result; 205 205 206 PtrsCastable_new( 206 PtrsCastable_new( 207 207 const ast::Type * d, const ast::TypeEnvironment & e, const ast::SymbolTable & syms ) 208 208 : dst( d ), env( e ), symtab( syms ), result( 0 ) {} … … 278 278 } // anonymous namespace 279 279 280 int ptrsCastable( 281 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 282 const ast::TypeEnvironment & env 280 int ptrsCastable( 281 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 282 const ast::TypeEnvironment & env 283 283 ) { 284 284 if ( auto inst = dynamic_cast< const ast::TypeInstType * >( dst ) ) { -
src/ResolvExpr/Resolver.cc
rfce4e31 r302d84c2 562 562 // TODO: Replace *exception type with &exception type. 563 563 if ( throwStmt->get_expr() ) { 564 StructDecl * exception_decl = indexer.lookupMutableStruct( "__cfaabi_ehm__base_exception_t" ); 564 StructDecl * exception_decl = 565 indexer.lookupStruct( "__cfaabi_ehm__base_exception_t" ); 565 566 assert( exception_decl ); 566 567 Type * exceptType = new PointerType( noQualifiers, new StructInstType( noQualifiers, exception_decl ) ); … … 971 972 /// Calls the CandidateFinder and finds the single best candidate 972 973 CandidateRef findUnfinishedKindExpression( 973 const ast::Expr * untyped, const ast::SymbolTable & symtab, const std::string & kind, 974 const ast::Expr * untyped, const ast::SymbolTable & symtab, const std::string & kind, 974 975 std::function<bool(const Candidate &)> pred = anyCandidate, ResolvMode mode = {} 975 976 ) { … … 993 994 // produce invalid error if no candidates 994 995 if ( candidates.empty() ) { 995 SemanticError( untyped, 996 toString( "No reasonable alternatives for ", kind, (kind != "" ? " " : ""), 996 SemanticError( untyped, 997 toString( "No reasonable alternatives for ", kind, (kind != "" ? " " : ""), 997 998 "expression: ") ); 998 999 } … … 1030 1031 if ( winners.size() != 1 ) { 1031 1032 std::ostringstream stream; 1032 stream << "Cannot choose between " << winners.size() << " alternatives for " 1033 stream << "Cannot choose between " << winners.size() << " alternatives for " 1033 1034 << kind << (kind != "" ? " " : "") << "expression\n"; 1034 1035 ast::print( stream, untyped ); … … 1053 1054 struct StripCasts_new final { 1054 1055 const ast::Expr * postmutate( const ast::CastExpr * castExpr ) { 1055 if ( 1056 castExpr->isGenerated 1057 && typesCompatible( castExpr->arg->result, castExpr->result ) 1056 if ( 1057 castExpr->isGenerated 1058 && typesCompatible( castExpr->arg->result, castExpr->result ) 1058 1059 ) { 1059 1060 // generated cast is the same type as its argument, remove it after keeping env 1060 return ast::mutate_field( 1061 return ast::mutate_field( 1061 1062 castExpr->arg.get(), &ast::Expr::env, castExpr->env ); 1062 1063 } … … 1087 1088 1088 1089 /// Establish post-resolver invariants for expressions 1089 void finishExpr( 1090 ast::ptr< ast::Expr > & expr, const ast::TypeEnvironment & env, 1090 void finishExpr( 1091 ast::ptr< ast::Expr > & expr, const ast::TypeEnvironment & env, 1091 1092 const ast::TypeSubstitution * oldenv = nullptr 1092 1093 ) { 1093 1094 // set up new type substitution for expression 1094 ast::ptr< ast::TypeSubstitution > newenv = 1095 ast::ptr< ast::TypeSubstitution > newenv = 1095 1096 oldenv ? oldenv : new ast::TypeSubstitution{}; 1096 1097 env.writeToSubstitution( *newenv.get_and_mutate() ); … … 1101 1102 } // anonymous namespace 1102 1103 1103 1104 1104 1105 ast::ptr< ast::Expr > resolveInVoidContext( 1105 1106 const ast::Expr * expr, const ast::SymbolTable & symtab, ast::TypeEnvironment & env 1106 1107 ) { 1107 1108 assertf( expr, "expected a non-null expression" ); 1108 1109 1109 1110 // set up and resolve expression cast to void 1110 1111 ast::CastExpr * untyped = new ast::CastExpr{ expr }; 1111 CandidateRef choice = findUnfinishedKindExpression( 1112 CandidateRef choice = findUnfinishedKindExpression( 1112 1113 untyped, symtab, "", anyCandidate, ResolvMode::withAdjustment() ); 1113 1114 1114 1115 // a cast expression has either 0 or 1 interpretations (by language rules); 1115 1116 // if 0, an exception has already been thrown, and this code will not run … … 1121 1122 1122 1123 namespace { 1123 /// Resolve `untyped` to the expression whose candidate is the best match for a `void` 1124 /// Resolve `untyped` to the expression whose candidate is the best match for a `void` 1124 1125 /// context. 1125 ast::ptr< ast::Expr > findVoidExpression( 1126 ast::ptr< ast::Expr > findVoidExpression( 1126 1127 const ast::Expr * untyped, const ast::SymbolTable & symtab 1127 1128 ) { … … 1133 1134 } 1134 1135 1135 /// resolve `untyped` to the expression whose candidate satisfies `pred` with the 1136 /// resolve `untyped` to the expression whose candidate satisfies `pred` with the 1136 1137 /// lowest cost, returning the resolved version 1137 1138 ast::ptr< ast::Expr > findKindExpression( 1138 const ast::Expr * untyped, const ast::SymbolTable & symtab, 1139 std::function<bool(const Candidate &)> pred = anyCandidate, 1139 const ast::Expr * untyped, const ast::SymbolTable & symtab, 1140 std::function<bool(const Candidate &)> pred = anyCandidate, 1140 1141 const std::string & kind = "", ResolvMode mode = {} 1141 1142 ) { 1142 1143 if ( ! untyped ) return {}; 1143 CandidateRef choice = 1144 CandidateRef choice = 1144 1145 findUnfinishedKindExpression( untyped, symtab, kind, pred, mode ); 1145 1146 finishExpr( choice->expr, choice->env, untyped->env ); … … 1148 1149 1149 1150 /// Resolve `untyped` to the single expression whose candidate is the best match 1150 ast::ptr< ast::Expr > findSingleExpression( 1151 const ast::Expr * untyped, const ast::SymbolTable & symtab 1151 ast::ptr< ast::Expr > findSingleExpression( 1152 const ast::Expr * untyped, const ast::SymbolTable & symtab 1152 1153 ) { 1153 1154 return findKindExpression( untyped, symtab ); … … 1169 1170 bool hasIntegralType( const Candidate & i ) { 1170 1171 const ast::Type * type = i.expr->result; 1171 1172 1172 1173 if ( auto bt = dynamic_cast< const ast::BasicType * >( type ) ) { 1173 1174 return bt->isInteger(); 1174 } else if ( 1175 dynamic_cast< const ast::EnumInstType * >( type ) 1175 } else if ( 1176 dynamic_cast< const ast::EnumInstType * >( type ) 1176 1177 || dynamic_cast< const ast::ZeroType * >( type ) 1177 1178 || dynamic_cast< const ast::OneType * >( type ) … … 1182 1183 1183 1184 /// Resolve `untyped` as an integral expression, returning the resolved version 1184 ast::ptr< ast::Expr > findIntegralExpression( 1185 const ast::Expr * untyped, const ast::SymbolTable & symtab 1185 ast::ptr< ast::Expr > findIntegralExpression( 1186 const ast::Expr * untyped, const ast::SymbolTable & symtab 1186 1187 ) { 1187 1188 return findKindExpression( untyped, symtab, hasIntegralType, "condition" ); … … 1191 1192 bool isCharType( const ast::Type * t ) { 1192 1193 if ( auto bt = dynamic_cast< const ast::BasicType * >( t ) ) { 1193 return bt->kind == ast::BasicType::Char 1194 || bt->kind == ast::BasicType::SignedChar 1194 return bt->kind == ast::BasicType::Char 1195 || bt->kind == ast::BasicType::SignedChar 1195 1196 || bt->kind == ast::BasicType::UnsignedChar; 1196 1197 } … … 1252 1253 } 1253 1254 1254 ast::ptr< ast::Init > resolveCtorInit( 1255 const ast::ConstructorInit * ctorInit, const ast::SymbolTable & symtab 1255 ast::ptr< ast::Init > resolveCtorInit( 1256 const ast::ConstructorInit * ctorInit, const ast::SymbolTable & symtab 1256 1257 ) { 1257 1258 assert( ctorInit ); … … 1260 1261 } 1261 1262 1262 ast::ptr< ast::Expr > resolveStmtExpr( 1263 const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab 1263 ast::ptr< ast::Expr > resolveStmtExpr( 1264 const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab 1264 1265 ) { 1265 1266 assert( stmtExpr ); … … 1302 1303 1303 1304 void Resolver_new::previsit( const ast::ObjectDecl * objectDecl ) { 1304 // To handle initialization of routine pointers [e.g. int (*fp)(int) = foo()], 1305 // class-variable `initContext` is changed multiple times because the LHS is analyzed 1306 // twice. The second analysis changes `initContext` because a function type can contain 1307 // object declarations in the return and parameter types. Therefore each value of 1308 // `initContext` is retained so the type on the first analysis is preserved and used for 1305 // To handle initialization of routine pointers [e.g. int (*fp)(int) = foo()], 1306 // class-variable `initContext` is changed multiple times because the LHS is analyzed 1307 // twice. The second analysis changes `initContext` because a function type can contain 1308 // object declarations in the return and parameter types. Therefore each value of 1309 // `initContext` is retained so the type on the first analysis is preserved and used for 1309 1310 // selecting the RHS. 1310 1311 GuardValue( currentObject ); 1311 1312 currentObject = ast::CurrentObject{ objectDecl->location, objectDecl->get_type() }; 1312 1313 if ( inEnumDecl && dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() ) ) { 1313 // enumerator initializers should not use the enum type to initialize, since the 1314 // enumerator initializers should not use the enum type to initialize, since the 1314 1315 // enum type is still incomplete at this point. Use `int` instead. 1315 currentObject = ast::CurrentObject{ 1316 currentObject = ast::CurrentObject{ 1316 1317 objectDecl->location, new ast::BasicType{ ast::BasicType::SignedInt } }; 1317 1318 } … … 1324 1325 } 1325 1326 1326 const ast::StaticAssertDecl * Resolver_new::previsit( 1327 const ast::StaticAssertDecl * assertDecl 1327 const ast::StaticAssertDecl * Resolver_new::previsit( 1328 const ast::StaticAssertDecl * assertDecl 1328 1329 ) { 1329 return ast::mutate_field( 1330 assertDecl, &ast::StaticAssertDecl::cond, 1330 return ast::mutate_field( 1331 assertDecl, &ast::StaticAssertDecl::cond, 1331 1332 findIntegralExpression( assertDecl->cond, symtab ) ); 1332 1333 } … … 1337 1338 #warning should use new equivalent to Validate::SizeType rather than sizeType here 1338 1339 ast::ptr< ast::Type > sizeType = new ast::BasicType{ ast::BasicType::LongUnsignedInt }; 1339 ast::mutate_field( 1340 type, &PtrType::dimension, 1340 ast::mutate_field( 1341 type, &PtrType::dimension, 1341 1342 findSingleExpression( type->dimension, sizeType, symtab ) ); 1342 1343 } … … 1355 1356 visit_children = false; 1356 1357 assertf( exprStmt->expr, "ExprStmt has null expression in resolver" ); 1357 1358 return ast::mutate_field( 1358 1359 return ast::mutate_field( 1359 1360 exprStmt, &ast::ExprStmt::expr, findVoidExpression( exprStmt->expr, symtab ) ); 1360 1361 } … … 1363 1364 visit_children = false; 1364 1365 1365 asmExpr = ast::mutate_field( 1366 asmExpr = ast::mutate_field( 1366 1367 asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) ); 1367 1368 1368 1369 if ( asmExpr->inout ) { 1369 1370 asmExpr = ast::mutate_field( 1370 1371 asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) ); 1371 1372 } 1372 1373 1373 1374 return asmExpr; 1374 1375 } … … 1387 1388 1388 1389 const ast::WhileStmt * Resolver_new::previsit( const ast::WhileStmt * whileStmt ) { 1389 return ast::mutate_field( 1390 return ast::mutate_field( 1390 1391 whileStmt, &ast::WhileStmt::cond, findIntegralExpression( whileStmt->cond, symtab ) ); 1391 1392 } … … 1408 1409 GuardValue( currentObject ); 1409 1410 switchStmt = ast::mutate_field( 1410 switchStmt, &ast::SwitchStmt::cond, 1411 switchStmt, &ast::SwitchStmt::cond, 1411 1412 findIntegralExpression( switchStmt->cond, symtab ) ); 1412 1413 currentObject = ast::CurrentObject{ switchStmt->location, switchStmt->cond->result }; … … 1419 1420 assertf( initAlts.size() == 1, "SwitchStmt did not correctly resolve an integral " 1420 1421 "expression." ); 1421 1422 ast::ptr< ast::Expr > untyped = 1422 1423 ast::ptr< ast::Expr > untyped = 1423 1424 new ast::CastExpr{ caseStmt->location, caseStmt->cond, initAlts.front().type }; 1424 1425 ast::ptr< ast::Expr > newExpr = findSingleExpression( untyped, symtab ); 1425 1426 // case condition cannot have a cast in C, so it must be removed here, regardless of 1426 1427 // case condition cannot have a cast in C, so it must be removed here, regardless of 1427 1428 // whether it would perform a conversion. 1428 1429 if ( const ast::CastExpr * castExpr = newExpr.as< ast::CastExpr >() ) { 1429 1430 swap_and_save_env( newExpr, castExpr->arg ); 1430 1431 } 1431 1432 1432 1433 caseStmt = ast::mutate_field( caseStmt, &ast::CaseStmt::cond, newExpr ); 1433 1434 } … … 1442 1443 ast::ptr< ast::Type > target = new ast::PointerType{ new ast::VoidType{} }; 1443 1444 branchStmt = ast::mutate_field( 1444 branchStmt, &ast::BranchStmt::computedTarget, 1445 branchStmt, &ast::BranchStmt::computedTarget, 1445 1446 findSingleExpression( branchStmt->computedTarget, target, symtab ) ); 1446 1447 } … … 1452 1453 if ( returnStmt->expr ) { 1453 1454 returnStmt = ast::mutate_field( 1454 returnStmt, &ast::ReturnStmt::expr, 1455 returnStmt, &ast::ReturnStmt::expr, 1455 1456 findSingleExpression( returnStmt->expr, functionReturn, symtab ) ); 1456 1457 } … … 1461 1462 visit_children = false; 1462 1463 if ( throwStmt->expr ) { 1463 const ast::StructDecl * exceptionDecl = 1464 const ast::StructDecl * exceptionDecl = 1464 1465 symtab.lookupStruct( "__cfaabi_ehm__base_exception_t" ); 1465 1466 assert( exceptionDecl ); 1466 ast::ptr< ast::Type > exceptType = 1467 ast::ptr< ast::Type > exceptType = 1467 1468 new ast::PointerType{ new ast::StructInstType{ exceptionDecl } }; 1468 1469 throwStmt = ast::mutate_field( 1469 throwStmt, &ast::ThrowStmt::expr, 1470 throwStmt, &ast::ThrowStmt::expr, 1470 1471 findSingleExpression( throwStmt->expr, exceptType, symtab ) ); 1471 1472 } … … 1476 1477 if ( catchStmt->cond ) { 1477 1478 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; 1478 catchStmt = ast::mutate_field( 1479 catchStmt, &ast::CatchStmt::cond, 1479 catchStmt = ast::mutate_field( 1480 catchStmt, &ast::CatchStmt::cond, 1480 1481 findSingleExpression( catchStmt->cond, boolType, symtab ) ); 1481 1482 } … … 1505 1506 1506 1507 if ( clause.target.args.empty() ) { 1507 SemanticError( stmt->location, 1508 SemanticError( stmt->location, 1508 1509 "Waitfor clause must have at least one mutex parameter"); 1509 1510 } 1510 1511 1511 1512 // Find all alternatives for all arguments in canonical form 1512 std::vector< CandidateFinder > argFinders = 1513 std::vector< CandidateFinder > argFinders = 1513 1514 funcFinder.findSubExprs( clause.target.args ); 1514 1515 1515 1516 // List all combinations of arguments 1516 1517 std::vector< CandidateList > possibilities; … … 1518 1519 1519 1520 // For every possible function: 1520 // * try matching the arguments to the parameters, not the other way around because 1521 // * try matching the arguments to the parameters, not the other way around because 1521 1522 // more arguments than parameters 1522 1523 CandidateList funcCandidates; … … 1525 1526 for ( CandidateRef & func : funcFinder.candidates ) { 1526 1527 try { 1527 auto pointerType = dynamic_cast< const ast::PointerType * >( 1528 auto pointerType = dynamic_cast< const ast::PointerType * >( 1528 1529 func->expr->result->stripReferences() ); 1529 1530 if ( ! pointerType ) { 1530 SemanticError( stmt->location, func->expr->result.get(), 1531 SemanticError( stmt->location, func->expr->result.get(), 1531 1532 "candidate not viable: not a pointer type\n" ); 1532 1533 } … … 1534 1535 auto funcType = pointerType->base.as< ast::FunctionType >(); 1535 1536 if ( ! funcType ) { 1536 SemanticError( stmt->location, func->expr->result.get(), 1537 SemanticError( stmt->location, func->expr->result.get(), 1537 1538 "candidate not viable: not a function type\n" ); 1538 1539 } … … 1543 1544 1544 1545 if( ! nextMutex( param, paramEnd ) ) { 1545 SemanticError( stmt->location, funcType, 1546 SemanticError( stmt->location, funcType, 1546 1547 "candidate function not viable: no mutex parameters\n"); 1547 1548 } … … 1559 1560 ast::AssertionSet need, have; 1560 1561 ast::TypeEnvironment resultEnv{ func->env }; 1561 // Add all type variables as open so that those not used in the 1562 // Add all type variables as open so that those not used in the 1562 1563 // parameter list are still considered open 1563 1564 resultEnv.add( funcType->forall ); … … 1579 1580 unsigned n_mutex_param = 0; 1580 1581 1581 // For every argument of its set, check if it matches one of the 1582 // For every argument of its set, check if it matches one of the 1582 1583 // parameters. The order is important 1583 1584 for ( auto & arg : argsList ) { … … 1586 1587 // We ran out of parameters but still have arguments. 1587 1588 // This function doesn't match 1588 SemanticError( stmt->location, funcType, 1589 SemanticError( stmt->location, funcType, 1589 1590 toString("candidate function not viable: too many mutex " 1590 1591 "arguments, expected ", n_mutex_param, "\n" ) ); … … 1593 1594 ++n_mutex_param; 1594 1595 1595 // Check if the argument matches the parameter type in the current 1596 // Check if the argument matches the parameter type in the current 1596 1597 // scope 1597 1598 ast::ptr< ast::Type > paramType = (*param)->get_type(); 1598 if ( 1599 ! unify( 1600 arg->expr->result, paramType, resultEnv, need, have, open, 1601 symtab ) 1599 if ( 1600 ! unify( 1601 arg->expr->result, paramType, resultEnv, need, have, open, 1602 symtab ) 1602 1603 ) { 1603 1604 // Type doesn't match … … 1626 1627 } while ( nextMutex( param, paramEnd ) ); 1627 1628 1628 // We ran out of arguments but still have parameters left; this 1629 // We ran out of arguments but still have parameters left; this 1629 1630 // function doesn't match 1630 SemanticError( stmt->location, funcType, 1631 SemanticError( stmt->location, funcType, 1631 1632 toString( "candidate function not viable: too few mutex " 1632 1633 "arguments, expected ", n_mutex_param, "\n" ) ); … … 1656 1657 // Make sure correct number of arguments 1657 1658 if( funcCandidates.empty() ) { 1658 SemanticErrorException top( stmt->location, 1659 SemanticErrorException top( stmt->location, 1659 1660 "No alternatives for function in call to waitfor" ); 1660 1661 top.append( errors ); … … 1663 1664 1664 1665 if( argsCandidates.empty() ) { 1665 SemanticErrorException top( stmt->location, 1666 "No alternatives for arguments in call to waitfor" ); 1666 SemanticErrorException top( stmt->location, 1667 "No alternatives for arguments in call to waitfor" ); 1667 1668 top.append( errors ); 1668 1669 throw top; … … 1670 1671 1671 1672 if( funcCandidates.size() > 1 ) { 1672 SemanticErrorException top( stmt->location, 1673 SemanticErrorException top( stmt->location, 1673 1674 "Ambiguous function in call to waitfor" ); 1674 1675 top.append( errors ); … … 1685 1686 // build new clause 1686 1687 ast::WaitForStmt::Clause clause2; 1687 1688 1688 1689 clause2.target.func = funcCandidates.front()->expr; 1689 1690 1690 1691 clause2.target.args.reserve( clause.target.args.size() ); 1691 1692 for ( auto arg : argsCandidates.front() ) { … … 1707 1708 ast::WaitForStmt::Timeout timeout2; 1708 1709 1709 ast::ptr< ast::Type > target = 1710 ast::ptr< ast::Type > target = 1710 1711 new ast::BasicType{ ast::BasicType::LongLongUnsignedInt }; 1711 1712 timeout2.time = findSingleExpression( stmt->timeout.time, target, symtab ); … … 1739 1740 const ast::SingleInit * Resolver_new::previsit( const ast::SingleInit * singleInit ) { 1740 1741 visit_children = false; 1741 // resolve initialization using the possibilities as determined by the `currentObject` 1742 // resolve initialization using the possibilities as determined by the `currentObject` 1742 1743 // cursor. 1743 ast::ptr< ast::Expr > untyped = new ast::UntypedInitExpr{ 1744 ast::ptr< ast::Expr > untyped = new ast::UntypedInitExpr{ 1744 1745 singleInit->location, singleInit->value, currentObject.getOptions() }; 1745 1746 ast::ptr<ast::Expr> newExpr = findSingleExpression( untyped, symtab ); … … 1750 1751 1751 1752 // discard InitExpr wrapper and retain relevant pieces. 1752 // `initExpr` may have inferred params in the case where the expression specialized a 1753 // function pointer, and newExpr may already have inferParams of its own, so a simple 1753 // `initExpr` may have inferred params in the case where the expression specialized a 1754 // function pointer, and newExpr may already have inferParams of its own, so a simple 1754 1755 // swap is not sufficient 1755 1756 ast::Expr::InferUnion inferred = initExpr->inferred; … … 1757 1758 newExpr.get_and_mutate()->inferred.splice( std::move(inferred) ); 1758 1759 1759 // get the actual object's type (may not exactly match what comes back from the resolver 1760 // get the actual object's type (may not exactly match what comes back from the resolver 1760 1761 // due to conversions) 1761 1762 const ast::Type * initContext = currentObject.getCurrentType(); … … 1769 1770 if ( auto pt = newExpr->result.as< ast::PointerType >() ) { 1770 1771 if ( isCharType( pt->base ) ) { 1771 // strip cast if we're initializing a char[] with a char* 1772 // strip cast if we're initializing a char[] with a char* 1772 1773 // e.g. char x[] = "hello" 1773 1774 if ( auto ce = newExpr.as< ast::CastExpr >() ) { … … 1792 1793 assert( listInit->designations.size() == listInit->initializers.size() ); 1793 1794 for ( unsigned i = 0; i < listInit->designations.size(); ++i ) { 1794 // iterate designations and initializers in pairs, moving the cursor to the current 1795 // iterate designations and initializers in pairs, moving the cursor to the current 1795 1796 // designated object and resolving the initializer against that object 1796 1797 listInit = ast::mutate_field_index( 1797 listInit, &ast::ListInit::designations, i, 1798 listInit, &ast::ListInit::designations, i, 1798 1799 currentObject.findNext( listInit->designations[i] ) ); 1799 1800 listInit = ast::mutate_field_index( … … 1817 1818 ctorInit = ast::mutate_field( ctorInit, &ast::ConstructorInit::init, nullptr ); 1818 1819 1819 // intrinsic single-parameter constructors and destructors do nothing. Since this was 1820 // implicitly generated, there's no way for it to have side effects, so get rid of it to 1820 // intrinsic single-parameter constructors and destructors do nothing. Since this was 1821 // implicitly generated, there's no way for it to have side effects, so get rid of it to 1821 1822 // clean up generated code 1822 1823 if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->ctor ) ) { -
src/ResolvExpr/Unify.cc
rfce4e31 r302d84c2 97 97 bool unifyExact( Type *type1, Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widen, const SymTab::Indexer &indexer ); 98 98 99 bool unifyExact( 100 const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env, 101 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 99 bool unifyExact( 100 const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env, 101 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 102 102 WidenMode widen, const ast::SymbolTable & symtab ); 103 103 … … 121 121 } 122 122 123 bool typesCompatible( 124 const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab, 123 bool typesCompatible( 124 const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab, 125 125 const ast::TypeEnvironment & env ) { 126 126 ast::TypeEnvironment newEnv; … … 135 135 findOpenVars( newSecond, open, closed, need, have, FirstOpen ); 136 136 137 return unifyExact( 137 return unifyExact( 138 138 newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab ); 139 139 } 140 140 141 bool typesCompatibleIgnoreQualifiers( const Type * first, const Type *second, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {141 bool typesCompatibleIgnoreQualifiers( Type *first, Type *second, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 142 142 TypeEnvironment newEnv; 143 143 OpenVarSet openVars; … … 163 163 } 164 164 165 bool typesCompatibleIgnoreQualifiers( 166 const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab, 165 bool typesCompatibleIgnoreQualifiers( 166 const ast::Type * first, const ast::Type * second, const ast::SymbolTable & symtab, 167 167 const ast::TypeEnvironment & env ) { 168 168 ast::TypeEnvironment newEnv; 169 169 ast::OpenVarSet open; 170 170 ast::AssertionSet need, have; 171 171 172 172 ast::ptr<ast::Type> newFirst{ first }, newSecond{ second }; 173 173 env.apply( newFirst ); … … 176 176 reset_qualifiers( newSecond ); 177 177 178 return unifyExact( 178 return unifyExact( 179 179 newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab ); 180 180 } … … 490 490 491 491 // sizes don't have to match if ttypes are involved; need to be more precise wrt where the ttype is to prevent errors 492 if ( 493 (flatFunc->parameters.size() == flatOther->parameters.size() && 494 flatFunc->returnVals.size() == flatOther->returnVals.size()) 495 || flatFunc->isTtype() 496 || flatOther->isTtype() 492 if ( 493 (flatFunc->parameters.size() == flatOther->parameters.size() && 494 flatFunc->returnVals.size() == flatOther->returnVals.size()) 495 || flatFunc->isTtype() 496 || flatOther->isTtype() 497 497 ) { 498 498 if ( unifyDeclList( flatFunc->parameters.begin(), flatFunc->parameters.end(), flatOther->parameters.begin(), flatOther->parameters.end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { … … 711 711 bool result; 712 712 713 Unify_new( 714 const ast::Type * type2, ast::TypeEnvironment & env, ast::AssertionSet & need, 715 ast::AssertionSet & have, const ast::OpenVarSet & open, WidenMode widen, 713 Unify_new( 714 const ast::Type * type2, ast::TypeEnvironment & env, ast::AssertionSet & need, 715 ast::AssertionSet & have, const ast::OpenVarSet & open, WidenMode widen, 716 716 const ast::SymbolTable & symtab ) 717 : type2(type2), tenv(env), need(need), have(have), open(open), widen(widen), 717 : type2(type2), tenv(env), need(need), have(have), open(open), widen(widen), 718 718 symtab(symtab), result(false) {} 719 719 720 720 void previsit( const ast::Node * ) { visit_children = false; } 721 721 722 722 void postvisit( const ast::VoidType * ) { 723 723 result = dynamic_cast< const ast::VoidType * >( type2 ); … … 732 732 void postvisit( const ast::PointerType * pointer ) { 733 733 if ( auto pointer2 = dynamic_cast< const ast::PointerType * >( type2 ) ) { 734 result = unifyExact( 735 pointer->base, pointer2->base, tenv, need, have, open, 734 result = unifyExact( 735 pointer->base, pointer2->base, tenv, need, have, open, 736 736 noWiden(), symtab ); 737 737 } … … 742 742 if ( ! array2 ) return; 743 743 744 // to unify, array types must both be VLA or both not VLA and both must have a 744 // to unify, array types must both be VLA or both not VLA and both must have a 745 745 // dimension expression or not have a dimension 746 746 if ( array->isVarLen != array2->isVarLen ) return; 747 if ( ! array->isVarLen && ! array2->isVarLen 747 if ( ! array->isVarLen && ! array2->isVarLen 748 748 && array->dimension && array2->dimension ) { 749 749 auto ce1 = array->dimension.as< ast::ConstantExpr >(); … … 751 751 752 752 // see C11 Reference Manual 6.7.6.2.6 753 // two array types with size specifiers that are integer constant expressions are 753 // two array types with size specifiers that are integer constant expressions are 754 754 // compatible if both size specifiers have the same constant value 755 755 if ( ce1 && ce2 && ce1->intValue() != ce2->intValue() ) return; 756 756 } 757 757 758 result = unifyExact( 759 array->base, array2->base, tenv, need, have, open, noWiden(), 758 result = unifyExact( 759 array->base, array2->base, tenv, need, have, open, noWiden(), 760 760 symtab ); 761 761 } … … 763 763 void postvisit( const ast::ReferenceType * ref ) { 764 764 if ( auto ref2 = dynamic_cast< const ast::ReferenceType * >( type2 ) ) { 765 result = unifyExact( 766 ref->base, ref2->base, tenv, need, have, open, noWiden(), 765 result = unifyExact( 766 ref->base, ref2->base, tenv, need, have, open, noWiden(), 767 767 symtab ); 768 768 } … … 771 771 private: 772 772 /// Replaces ttype variables with their bound types. 773 /// If this isn't done when satifying ttype assertions, then argument lists can have 773 /// If this isn't done when satifying ttype assertions, then argument lists can have 774 774 /// different size and structure when they should be compatible. 775 775 struct TtypeExpander_new : public ast::WithShortCircuiting { … … 800 800 auto types = flatten( d->get_type() ); 801 801 for ( ast::ptr< ast::Type > & t : types ) { 802 // outermost const, volatile, _Atomic qualifiers in parameters should not play 803 // a role in the unification of function types, since they do not determine 802 // outermost const, volatile, _Atomic qualifiers in parameters should not play 803 // a role in the unification of function types, since they do not determine 804 804 // whether a function is callable. 805 // NOTE: **must** consider at least mutex qualifier, since functions can be 806 // overloaded on outermost mutex and a mutex function has different 805 // NOTE: **must** consider at least mutex qualifier, since functions can be 806 // overloaded on outermost mutex and a mutex function has different 807 807 // requirements than a non-mutex function 808 808 remove_qualifiers( t, ast::CV::Const | ast::CV::Volatile | ast::CV::Atomic ); … … 818 818 std::vector< ast::ptr< ast::Type > > types; 819 819 while ( crnt != end ) { 820 // it is guaranteed that a ttype variable will be bound to a flat tuple, so ensure 820 // it is guaranteed that a ttype variable will be bound to a flat tuple, so ensure 821 821 // that this results in a flat tuple 822 822 flatten( (*crnt)->get_type(), types ); … … 829 829 830 830 template< typename Iter > 831 static bool unifyDeclList( 832 Iter crnt1, Iter end1, Iter crnt2, Iter end2, ast::TypeEnvironment & env, 833 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 831 static bool unifyDeclList( 832 Iter crnt1, Iter end1, Iter crnt2, Iter end2, ast::TypeEnvironment & env, 833 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 834 834 const ast::SymbolTable & symtab 835 835 ) { … … 843 843 if ( isTuple1 && ! isTuple2 ) { 844 844 // combine remainder of list2, then unify 845 return unifyExact( 846 t1, tupleFromDecls( crnt2, end2 ), env, need, have, open, 845 return unifyExact( 846 t1, tupleFromDecls( crnt2, end2 ), env, need, have, open, 847 847 noWiden(), symtab ); 848 848 } else if ( ! isTuple1 && isTuple2 ) { 849 849 // combine remainder of list1, then unify 850 return unifyExact( 851 tupleFromDecls( crnt1, end1 ), t2, env, need, have, open, 850 return unifyExact( 851 tupleFromDecls( crnt1, end1 ), t2, env, need, have, open, 852 852 noWiden(), symtab ); 853 853 } 854 854 855 if ( ! unifyExact( 856 t1, t2, env, need, have, open, noWiden(), symtab ) 855 if ( ! unifyExact( 856 t1, t2, env, need, have, open, noWiden(), symtab ) 857 857 ) return false; 858 858 … … 860 860 } 861 861 862 // May get to the end of one argument list before the other. This is only okay if the 862 // May get to the end of one argument list before the other. This is only okay if the 863 863 // other is a ttype 864 864 if ( crnt1 != end1 ) { … … 866 866 const ast::Type * t1 = (*crnt1)->get_type(); 867 867 if ( ! Tuples::isTtype( t1 ) ) return false; 868 return unifyExact( 869 t1, tupleFromDecls( crnt2, end2 ), env, need, have, open, 868 return unifyExact( 869 t1, tupleFromDecls( crnt2, end2 ), env, need, have, open, 870 870 noWiden(), symtab ); 871 871 } else if ( crnt2 != end2 ) { … … 873 873 const ast::Type * t2 = (*crnt2)->get_type(); 874 874 if ( ! Tuples::isTtype( t2 ) ) return false; 875 return unifyExact( 876 tupleFromDecls( crnt1, end1 ), t2, env, need, have, open, 875 return unifyExact( 876 tupleFromDecls( crnt1, end1 ), t2, env, need, have, open, 877 877 noWiden(), symtab ); 878 878 } … … 881 881 } 882 882 883 static bool unifyDeclList( 884 const std::vector< ast::ptr< ast::DeclWithType > > & list1, 885 const std::vector< ast::ptr< ast::DeclWithType > > & list2, 886 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 883 static bool unifyDeclList( 884 const std::vector< ast::ptr< ast::DeclWithType > > & list1, 885 const std::vector< ast::ptr< ast::DeclWithType > > & list2, 886 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 887 887 const ast::OpenVarSet & open, const ast::SymbolTable & symtab 888 888 ) { 889 return unifyDeclList( 890 list1.begin(), list1.end(), list2.begin(), list2.end(), env, need, have, open, 889 return unifyDeclList( 890 list1.begin(), list1.end(), list2.begin(), list2.end(), env, need, have, open, 891 891 symtab ); 892 892 } … … 900 900 901 901 /// mark all assertions in `type` used in both `assn1` and `assn2` 902 static void markAssertions( 903 ast::AssertionSet & assn1, ast::AssertionSet & assn2, 904 const ast::ParameterizedType * type 902 static void markAssertions( 903 ast::AssertionSet & assn1, ast::AssertionSet & assn2, 904 const ast::ParameterizedType * type 905 905 ) { 906 906 for ( const auto & tyvar : type->forall ) { … … 918 918 919 919 if ( func->isVarArgs != func2->isVarArgs ) return; 920 921 // Flatten the parameter lists for both functions so that tuple structure does not 920 921 // Flatten the parameter lists for both functions so that tuple structure does not 922 922 // affect unification. Does not actually mutate function parameters. 923 923 auto params = flattenList( func->params, tenv ); 924 924 auto params2 = flattenList( func2->params, tenv ); 925 925 926 // sizes don't have to match if ttypes are involved; need to be more precise w.r.t. 926 // sizes don't have to match if ttypes are involved; need to be more precise w.r.t. 927 927 // where the ttype is to prevent errors 928 if ( 928 if ( 929 929 ( params.size() != params2.size() || func->returns.size() != func2->returns.size() ) 930 930 && ! func->isTtype() … … 933 933 934 934 if ( ! unifyDeclList( params, params2, tenv, need, have, open, symtab ) ) return; 935 if ( ! unifyDeclList( 935 if ( ! unifyDeclList( 936 936 func->returns, func2->returns, tenv, need, have, open, symtab ) ) return; 937 937 938 938 markAssertions( have, need, func ); 939 939 markAssertions( have, need, func2 ); … … 941 941 result = true; 942 942 } 943 943 944 944 private: 945 945 template< typename RefType > … … 953 953 /// Creates a tuple type based on a list of TypeExpr 954 954 template< typename Iter > 955 static const ast::Type * tupleFromExprs( 955 static const ast::Type * tupleFromExprs( 956 956 const ast::TypeExpr * param, Iter & crnt, Iter end, ast::CV::Qualifiers qs 957 957 ) { … … 973 973 const RefType * inst2 = handleRefType( inst, other ); 974 974 if ( ! inst2 ) return; 975 975 976 976 // check that parameters of types unify, if any 977 977 const std::vector< ast::ptr< ast::Expr > > & params = inst->params; … … 1002 1002 } 1003 1003 1004 if ( ! unifyExact( 1004 if ( ! unifyExact( 1005 1005 pty, pty2, tenv, need, have, open, noWiden(), symtab ) ) { 1006 1006 result = false; … … 1038 1038 private: 1039 1039 /// Creates a tuple type based on a list of Type 1040 static ast::ptr< ast::Type > tupleFromTypes( 1040 static ast::ptr< ast::Type > tupleFromTypes( 1041 1041 const std::vector< ast::ptr< ast::Type > > & tys 1042 1042 ) { 1043 1043 std::vector< ast::ptr< ast::Type > > out; 1044 1044 for ( const ast::Type * ty : tys ) { 1045 // it is guaranteed that a ttype variable will be bound to a flat tuple, so ensure 1045 // it is guaranteed that a ttype variable will be bound to a flat tuple, so ensure 1046 1046 // that this results in a flat tuple 1047 1047 flatten( ty, out ); … … 1051 1051 } 1052 1052 1053 static bool unifyList( 1054 const std::vector< ast::ptr< ast::Type > > & list1, 1055 const std::vector< ast::ptr< ast::Type > > & list2, ast::TypeEnvironment & env, 1056 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 1053 static bool unifyList( 1054 const std::vector< ast::ptr< ast::Type > > & list1, 1055 const std::vector< ast::ptr< ast::Type > > & list2, ast::TypeEnvironment & env, 1056 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 1057 1057 const ast::SymbolTable & symtab 1058 1058 ) { … … 1068 1068 if ( isTuple1 && ! isTuple2 ) { 1069 1069 // combine entirety of list2, then unify 1070 return unifyExact( 1071 t1, tupleFromTypes( list2 ), env, need, have, open, 1070 return unifyExact( 1071 t1, tupleFromTypes( list2 ), env, need, have, open, 1072 1072 noWiden(), symtab ); 1073 1073 } else if ( ! isTuple1 && isTuple2 ) { 1074 1074 // combine entirety of list1, then unify 1075 1075 return unifyExact( 1076 tupleFromTypes( list1 ), t2, env, need, have, open, 1076 tupleFromTypes( list1 ), t2, env, need, have, open, 1077 1077 noWiden(), symtab ); 1078 1078 } 1079 1079 1080 if ( ! unifyExact( 1081 t1, t2, env, need, have, open, noWiden(), symtab ) 1080 if ( ! unifyExact( 1081 t1, t2, env, need, have, open, noWiden(), symtab ) 1082 1082 ) return false; 1083 1083 … … 1089 1089 const ast::Type * t1 = *crnt1; 1090 1090 if ( ! Tuples::isTtype( t1 ) ) return false; 1091 // xxx - this doesn't generate an empty tuple, contrary to comment; both ported 1091 // xxx - this doesn't generate an empty tuple, contrary to comment; both ported 1092 1092 // from Rob's code 1093 return unifyExact( 1094 t1, tupleFromTypes( list2 ), env, need, have, open, 1093 return unifyExact( 1094 t1, tupleFromTypes( list2 ), env, need, have, open, 1095 1095 noWiden(), symtab ); 1096 1096 } else if ( crnt2 != list2.end() ) { … … 1098 1098 const ast::Type * t2 = *crnt2; 1099 1099 if ( ! Tuples::isTtype( t2 ) ) return false; 1100 // xxx - this doesn't generate an empty tuple, contrary to comment; both ported 1100 // xxx - this doesn't generate an empty tuple, contrary to comment; both ported 1101 1101 // from Rob's code 1102 1102 return unifyExact( 1103 tupleFromTypes( list1 ), t2, env, need, have, open, 1103 tupleFromTypes( list1 ), t2, env, need, have, open, 1104 1104 noWiden(), symtab ); 1105 1105 } … … 1133 1133 void postvisit( const ast::OneType * ) { 1134 1134 result = dynamic_cast< const ast::OneType * >( type2 ); 1135 } 1135 } 1136 1136 1137 1137 private: … … 1140 1140 }; 1141 1141 1142 bool unify( 1143 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1144 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1142 bool unify( 1143 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1144 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1145 1145 ast::OpenVarSet & open, const ast::SymbolTable & symtab 1146 1146 ) { … … 1149 1149 } 1150 1150 1151 bool unify( 1152 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1153 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1154 ast::OpenVarSet & open, const ast::SymbolTable & symtab, ast::ptr<ast::Type> & common 1151 bool unify( 1152 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1153 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1154 ast::OpenVarSet & open, const ast::SymbolTable & symtab, ast::ptr<ast::Type> & common 1155 1155 ) { 1156 1156 ast::OpenVarSet closed; 1157 1157 findOpenVars( type1, open, closed, need, have, FirstClosed ); 1158 1158 findOpenVars( type2, open, closed, need, have, FirstOpen ); 1159 return unifyInexact( 1159 return unifyInexact( 1160 1160 type1, type2, env, need, have, open, WidenMode{ true, true }, symtab, common ); 1161 1161 } 1162 1162 1163 bool unifyExact( 1164 const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env, 1165 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 1163 bool unifyExact( 1164 const ast::Type * type1, const ast::Type * type2, ast::TypeEnvironment & env, 1165 ast::AssertionSet & need, ast::AssertionSet & have, const ast::OpenVarSet & open, 1166 1166 WidenMode widen, const ast::SymbolTable & symtab 1167 1167 ) { … … 1170 1170 auto var1 = dynamic_cast< const ast::TypeInstType * >( type1 ); 1171 1171 auto var2 = dynamic_cast< const ast::TypeInstType * >( type2 ); 1172 ast::OpenVarSet::const_iterator 1173 entry1 = var1 ? open.find( var1->name ) : open.end(), 1172 ast::OpenVarSet::const_iterator 1173 entry1 = var1 ? open.find( var1->name ) : open.end(), 1174 1174 entry2 = var2 ? open.find( var2->name ) : open.end(); 1175 1175 bool isopen1 = entry1 != open.end(); … … 1178 1178 if ( isopen1 && isopen2 ) { 1179 1179 if ( entry1->second.kind != entry2->second.kind ) return false; 1180 return env.bindVarToVar( 1181 var1, var2, ast::TypeDecl::Data{ entry1->second, entry2->second }, need, have, 1180 return env.bindVarToVar( 1181 var1, var2, ast::TypeDecl::Data{ entry1->second, entry2->second }, need, have, 1182 1182 open, widen, symtab ); 1183 1183 } else if ( isopen1 ) { … … 1192 1192 } 1193 1193 1194 bool unifyInexact( 1195 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1196 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1197 const ast::OpenVarSet & open, WidenMode widen, const ast::SymbolTable & symtab, 1198 ast::ptr<ast::Type> & common 1194 bool unifyInexact( 1195 const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2, 1196 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have, 1197 const ast::OpenVarSet & open, WidenMode widen, const ast::SymbolTable & symtab, 1198 ast::ptr<ast::Type> & common 1199 1199 ) { 1200 1200 ast::CV::Qualifiers q1 = type1->qualifiers, q2 = type2->qualifiers; 1201 1202 // force t1 and t2 to be cloned if their qualifiers must be stripped, so that type1 and 1201 1202 // force t1 and t2 to be cloned if their qualifiers must be stripped, so that type1 and 1203 1203 // type2 are left unchanged; calling convention forces type{1,2}->strong_ref >= 1 1204 1204 ast::ptr<ast::Type> t1{ type1 }, t2{ type2 }; 1205 1205 reset_qualifiers( t1 ); 1206 1206 reset_qualifiers( t2 ); 1207 1207 1208 1208 if ( unifyExact( t1, t2, env, need, have, open, widen, symtab ) ) { 1209 1209 t1 = nullptr; t2 = nullptr; // release t1, t2 to avoid spurious clones -
src/ResolvExpr/typeops.h
rfce4e31 r302d84c2 73 73 74 74 /// Replaces array types with equivalent pointer, and function types with a pointer-to-function 75 const ast::Type * adjustExprType( 75 const ast::Type * adjustExprType( 76 76 const ast::Type * type, const ast::TypeEnvironment & env, const ast::SymbolTable & symtab ); 77 77 78 78 // in CastCost.cc 79 Cost castCost( const Type * src, const Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env );80 Cost castCost( 81 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 79 Cost castCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ); 80 Cost castCost( 81 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 82 82 const ast::TypeEnvironment & env ); 83 83 84 84 // in ConversionCost.cc 85 Cost conversionCost( const Type *src, constType *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env );86 Cost conversionCost( 87 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 85 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ); 86 Cost conversionCost( 87 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 88 88 const ast::TypeEnvironment & env ); 89 89 90 90 // in AlternativeFinder.cc 91 Cost computeConversionCost( Type *actualType, Type *formalType, 91 Cost computeConversionCost( Type *actualType, Type *formalType, 92 92 const SymTab::Indexer &indexer, const TypeEnvironment &env ); 93 93 94 94 // in PtrsAssignable.cc 95 int ptrsAssignable( const Type * src, const Type *dest, const TypeEnvironment &env );95 int ptrsAssignable( Type *src, Type *dest, const TypeEnvironment &env ); 96 96 int ptrsAssignable( const ast::Type * src, const ast::Type * dst, 97 97 const ast::TypeEnvironment & env ); 98 98 99 99 // in PtrsCastable.cc 100 int ptrsCastable( const Type * src, const Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer );101 int ptrsCastable( 102 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 100 int ptrsCastable( Type *src, Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ); 101 int ptrsCastable( 102 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, 103 103 const ast::TypeEnvironment & env ); 104 104 105 105 // in Unify.cc 106 106 bool typesCompatible( Type *, Type *, const SymTab::Indexer &indexer, const TypeEnvironment &env ); 107 bool typesCompatibleIgnoreQualifiers( const Type *, constType *, const SymTab::Indexer &indexer, const TypeEnvironment &env );107 bool typesCompatibleIgnoreQualifiers( Type *, Type *, const SymTab::Indexer &indexer, const TypeEnvironment &env ); 108 108 109 109 inline bool typesCompatible( Type *t1, Type *t2, const SymTab::Indexer &indexer ) { … … 112 112 } 113 113 114 inline bool typesCompatibleIgnoreQualifiers( const Type * t1, const Type *t2, const SymTab::Indexer &indexer ) {114 inline bool typesCompatibleIgnoreQualifiers( Type *t1, Type *t2, const SymTab::Indexer &indexer ) { 115 115 TypeEnvironment env; 116 116 return typesCompatibleIgnoreQualifiers( t1, t2, indexer, env ); 117 117 } 118 118 119 bool typesCompatible( 120 const ast::Type *, const ast::Type *, const ast::SymbolTable & symtab = {}, 119 bool typesCompatible( 120 const ast::Type *, const ast::Type *, const ast::SymbolTable & symtab = {}, 121 121 const ast::TypeEnvironment & env = {} ); 122 122 123 123 bool typesCompatibleIgnoreQualifiers( 124 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 124 const ast::Type *, const ast::Type *, const ast::SymbolTable &, 125 125 const ast::TypeEnvironment & env = {} ); 126 126 … … 133 133 Type * commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ); 134 134 ast::ptr< ast::Type > commonType( 135 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2, WidenMode widen, 135 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2, WidenMode widen, 136 136 const ast::SymbolTable & symtab, ast::TypeEnvironment & env, const ast::OpenVarSet & open ); 137 137 138 138 // in PolyCost.cc 139 139 int polyCost( Type *type, const TypeEnvironment &env, const SymTab::Indexer &indexer ); 140 int polyCost( 140 int polyCost( 141 141 const ast::Type * type, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env ); 142 142 … … 149 149 // new AST version in TypeEnvironment.cpp (only place it was used in old AST) 150 150 151 template<typename Iter> 151 template<typename Iter> 152 152 bool occursIn( Type* ty, Iter begin, Iter end, const TypeEnvironment &env ) { 153 153 while ( begin != end ) { … … 176 176 177 177 /// flatten tuple type into existing list of types 178 static inline void flatten( 179 const ast::Type * type, std::vector< ast::ptr< ast::Type > > & out 178 static inline void flatten( 179 const ast::Type * type, std::vector< ast::ptr< ast::Type > > & out 180 180 ) { 181 if ( auto tupleType = dynamic_cast< const ast::TupleType * >( type ) ) { 181 if ( auto tupleType = dynamic_cast< const ast::TupleType * >( type ) ) { 182 182 for ( const ast::Type * t : tupleType->types ) { 183 183 flatten( t, out ); -
src/SymTab/Indexer.cc
rfce4e31 r302d84c2 74 74 } 75 75 76 Indexer::Indexer() 77 : idTable(), typeTable(), structTable(), enumTable(), unionTable(), traitTable(), 78 prevScope(), scope( 0 ), repScope( 0 ) { ++* stats().count; }76 Indexer::Indexer() 77 : idTable(), typeTable(), structTable(), enumTable(), unionTable(), traitTable(), 78 prevScope(), scope( 0 ), repScope( 0 ) { ++*stats().count; } 79 79 80 80 Indexer::~Indexer() { … … 84 84 void Indexer::lazyInitScope() { 85 85 if ( repScope < scope ) { 86 ++* stats().lazy_scopes;86 ++*stats().lazy_scopes; 87 87 // create rollback 88 prevScope = std::make_shared<Indexer>( * this );88 prevScope = std::make_shared<Indexer>( *this ); 89 89 // update repScope 90 90 repScope = scope; … … 95 95 ++scope; 96 96 97 ++* stats().new_scopes;97 ++*stats().new_scopes; 98 98 stats().avg_scope_depth->push( scope ); 99 99 stats().max_scope_depth->push( scope ); … … 103 103 if ( repScope == scope ) { 104 104 Ptr prev = prevScope; // make sure prevScope stays live 105 * this = std::move(*prevScope); // replace with previous scope105 *this = std::move(*prevScope); // replace with previous scope 106 106 } 107 107 … … 109 109 } 110 110 111 void Indexer::lookupId( const std::string & id, std::list< IdData > &out ) const {112 ++* stats().lookup_calls;111 void Indexer::lookupId( const std::string &id, std::list< IdData > &out ) const { 112 ++*stats().lookup_calls; 113 113 if ( ! idTable ) return; 114 114 115 ++* stats().map_lookups;115 ++*stats().map_lookups; 116 116 auto decls = idTable->find( id ); 117 117 if ( decls == idTable->end() ) return; … … 122 122 } 123 123 124 const NamedTypeDecl * Indexer::lookupType( const std::string & id ) const { return lookupMutableType(id); } 125 NamedTypeDecl * Indexer::lookupMutableType( const std::string & id ) const { 126 ++* stats().lookup_calls; 124 NamedTypeDecl *Indexer::lookupType( const std::string &id ) const { 125 ++*stats().lookup_calls; 127 126 if ( ! typeTable ) return nullptr; 128 ++* stats().map_lookups;127 ++*stats().map_lookups; 129 128 auto it = typeTable->find( id ); 130 129 return it == typeTable->end() ? nullptr : it->second.decl; 131 130 } 132 131 133 const StructDecl * Indexer::lookupStruct( const std::string & id ) const { return lookupMutableStruct(id); } 134 StructDecl * Indexer::lookupMutableStruct( const std::string & id ) const { 135 ++* stats().lookup_calls; 132 StructDecl *Indexer::lookupStruct( const std::string &id ) const { 133 ++*stats().lookup_calls; 136 134 if ( ! structTable ) return nullptr; 137 ++* stats().map_lookups;135 ++*stats().map_lookups; 138 136 auto it = structTable->find( id ); 139 137 return it == structTable->end() ? nullptr : it->second.decl; 140 138 } 141 139 142 const EnumDecl * Indexer::lookupEnum( const std::string & id ) const { return lookupMutableEnum(id); } 143 EnumDecl * Indexer::lookupMutableEnum( const std::string & id ) const { 144 ++* stats().lookup_calls; 140 EnumDecl *Indexer::lookupEnum( const std::string &id ) const { 141 ++*stats().lookup_calls; 145 142 if ( ! enumTable ) return nullptr; 146 ++* stats().map_lookups;143 ++*stats().map_lookups; 147 144 auto it = enumTable->find( id ); 148 145 return it == enumTable->end() ? nullptr : it->second.decl; 149 146 } 150 147 151 const UnionDecl * Indexer::lookupUnion( const std::string & id ) const { return lookupMutableUnion(id); } 152 UnionDecl * Indexer::lookupMutableUnion( const std::string & id ) const { 153 ++* stats().lookup_calls; 148 UnionDecl *Indexer::lookupUnion( const std::string &id ) const { 149 ++*stats().lookup_calls; 154 150 if ( ! unionTable ) return nullptr; 155 ++* stats().map_lookups;151 ++*stats().map_lookups; 156 152 auto it = unionTable->find( id ); 157 153 return it == unionTable->end() ? nullptr : it->second.decl; 158 154 } 159 155 160 const TraitDecl * Indexer::lookupTrait( const std::string & id ) const { return lookupMutableTrait(id); } 161 TraitDecl * Indexer::lookupMutableTrait( const std::string & id ) const { 162 ++* stats().lookup_calls; 156 TraitDecl *Indexer::lookupTrait( const std::string &id ) const { 157 ++*stats().lookup_calls; 163 158 if ( ! traitTable ) return nullptr; 164 ++* stats().map_lookups;159 ++*stats().map_lookups; 165 160 auto it = traitTable->find( id ); 166 161 return it == traitTable->end() ? nullptr : it->second.decl; 167 162 } 168 163 169 const Indexer * Indexer::atScope( unsigned long target ) const {164 const Indexer* Indexer::atScope( unsigned long target ) const { 170 165 // by lazy construction, final indexer in list has repScope 0, cannot be > target 171 166 // otherwise, will find first scope representing the target 172 const Indexer * indexer = this;167 const Indexer* indexer = this; 173 168 while ( indexer->repScope > target ) { 174 169 indexer = indexer->prevScope.get(); … … 177 172 } 178 173 179 const NamedTypeDecl * Indexer::globalLookupType( const std::string &id ) const {174 NamedTypeDecl *Indexer::globalLookupType( const std::string &id ) const { 180 175 return atScope( 0 )->lookupType( id ); 181 176 } 182 177 183 const StructDecl * Indexer::globalLookupStruct( const std::string &id ) const {178 StructDecl *Indexer::globalLookupStruct( const std::string &id ) const { 184 179 return atScope( 0 )->lookupStruct( id ); 185 180 } 186 181 187 const UnionDecl * Indexer::globalLookupUnion( const std::string &id ) const {182 UnionDecl *Indexer::globalLookupUnion( const std::string &id ) const { 188 183 return atScope( 0 )->lookupUnion( id ); 189 184 } 190 185 191 const EnumDecl * Indexer::globalLookupEnum( const std::string &id ) const {186 EnumDecl *Indexer::globalLookupEnum( const std::string &id ) const { 192 187 return atScope( 0 )->lookupEnum( id ); 193 188 } … … 212 207 } 213 208 214 215 bool Indexer::addedIdConflicts( 216 const Indexer::IdData & existing, DeclarationWithType * added,209 210 bool Indexer::addedIdConflicts( 211 const Indexer::IdData & existing, DeclarationWithType *added, 217 212 Indexer::OnConflict handleConflicts, BaseSyntaxNode * deleteStmt ) { 218 // if we're giving the same name mangling to things of different types then there is 213 // if we're giving the same name mangling to things of different types then there is 219 214 // something wrong 220 215 assert( (isObject( added ) && isObject( existing.id ) ) … … 224 219 // new definition shadows the autogenerated one, even at the same scope 225 220 return false; 226 } else if ( LinkageSpec::isMangled( added->linkage ) 227 || ResolvExpr::typesCompatible( 221 } else if ( LinkageSpec::isMangled( added->linkage ) 222 || ResolvExpr::typesCompatible( 228 223 added->get_type(), existing.id->get_type(), Indexer() ) ) { 229 224 … … 243 238 if ( isDefinition( added ) && isDefinition( existing.id ) ) { 244 239 if ( handleConflicts.mode == OnConflict::Error ) { 245 SemanticError( added, 246 isFunction( added ) ? 247 "duplicate function definition for " : 240 SemanticError( added, 241 isFunction( added ) ? 242 "duplicate function definition for " : 248 243 "duplicate object definition for " ); 249 244 } … … 260 255 } 261 256 262 bool Indexer::hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const {257 bool Indexer::hasCompatibleCDecl( const std::string &id, const std::string &mangleName ) const { 263 258 if ( ! idTable ) return false; 264 259 265 ++* stats().map_lookups;260 ++*stats().map_lookups; 266 261 auto decls = idTable->find( id ); 267 262 if ( decls == idTable->end() ) return false; … … 275 270 } 276 271 } 277 272 278 273 return false; 279 274 } 280 275 281 bool Indexer::hasIncompatibleCDecl( 282 const std::string & id, const std::string &mangleName ) const {276 bool Indexer::hasIncompatibleCDecl( 277 const std::string &id, const std::string &mangleName ) const { 283 278 if ( ! idTable ) return false; 284 279 285 ++* stats().map_lookups;280 ++*stats().map_lookups; 286 281 auto decls = idTable->find( id ); 287 282 if ( decls == idTable->end() ) return false; … … 300 295 301 296 /// gets the base type of the first parameter; decl must be a ctor/dtor/assignment function 302 std::string getOtypeKey( FunctionDecl * function ) {297 std::string getOtypeKey( FunctionDecl* function ) { 303 298 auto& params = function->type->parameters; 304 299 assert( ! params.empty() ); 305 300 // use base type of pointer, so that qualifiers on the pointer type aren't considered. 306 Type * base = InitTweak::getPointerBase( params.front()->get_type() );301 Type* base = InitTweak::getPointerBase( params.front()->get_type() ); 307 302 assert( base ); 308 303 return Mangler::mangle( base ); 309 304 } 310 305 311 /// gets the declaration for the function acting on a type specified by otype key, 306 /// gets the declaration for the function acting on a type specified by otype key, 312 307 /// nullptr if none such 313 308 FunctionDecl * getFunctionForOtype( DeclarationWithType * decl, const std::string& otypeKey ) { … … 317 312 } 318 313 319 bool Indexer::removeSpecialOverrides( 314 bool Indexer::removeSpecialOverrides( 320 315 Indexer::IdData& data, Indexer::MangleTable::Ptr& mangleTable ) { 321 // if a type contains user defined ctor/dtor/assign, then special rules trigger, which 322 // determinethe set of ctor/dtor/assign that can be used by the requester. In particular, 323 // if the user defines a default ctor, then the generated default ctor is unavailable, 324 // likewise for copy ctor and dtor. If the user defines any ctor/dtor, then no generated 325 // field ctors are available. If the user defines any ctor then the generated default ctor 326 // is unavailable (intrinsic default ctor must be overridden exactly). If the user defines 327 // anything that looks like a copy constructor, then the generated copy constructor is 316 // if a type contains user defined ctor/dtor/assign, then special rules trigger, which 317 // determinethe set of ctor/dtor/assign that can be used by the requester. In particular, 318 // if the user defines a default ctor, then the generated default ctor is unavailable, 319 // likewise for copy ctor and dtor. If the user defines any ctor/dtor, then no generated 320 // field ctors are available. If the user defines any ctor then the generated default ctor 321 // is unavailable (intrinsic default ctor must be overridden exactly). If the user defines 322 // anything that looks like a copy constructor, then the generated copy constructor is 328 323 // unavailable, and likewise for the assignment operator. 329 324 … … 345 340 std::vector< MangleTable::value_type > deleted; 346 341 bool alreadyUserDefinedFunc = false; 347 348 for ( const auto& entry : * mangleTable ) {342 343 for ( const auto& entry : *mangleTable ) { 349 344 // skip decls that aren't functions or are for the wrong type 350 345 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 373 368 // perform removals from mangle table, and deletions if necessary 374 369 for ( const auto& key : removed ) { 375 ++* stats().map_mutations;370 ++*stats().map_mutations; 376 371 mangleTable = mangleTable->erase( key ); 377 372 } 378 373 if ( ! alreadyUserDefinedFunc ) for ( const auto& entry : deleted ) { 379 ++* stats().map_mutations;374 ++*stats().map_mutations; 380 375 mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } ); 381 376 } … … 384 379 // if this is the first user-defined function, delete non-user-defined overloads 385 380 std::vector< MangleTable::value_type > deleted; 386 387 for ( const auto& entry : * mangleTable ) {381 382 for ( const auto& entry : *mangleTable ) { 388 383 // skip decls that aren't functions or are for the wrong type 389 384 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 407 402 // this needs to be a separate loop because of iterator invalidation 408 403 for ( const auto& entry : deleted ) { 409 ++* stats().map_mutations;404 ++*stats().map_mutations; 410 405 mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } ); 411 406 } … … 413 408 // this is an overridable generated function 414 409 // if there already exists a matching user-defined function, delete this appropriately 415 for ( const auto& entry : * mangleTable ) {410 for ( const auto& entry : *mangleTable ) { 416 411 // skip decls that aren't functions or are for the wrong type 417 412 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 423 418 if ( dataIsCopyFunc ) { 424 419 // remove current function if exists a user-defined copy function 425 // since the signatures for copy functions don't need to match exactly, using 420 // since the signatures for copy functions don't need to match exactly, using 426 421 // a delete statement is the wrong approach 427 422 if ( InitTweak::isCopyFunction( decl, decl->name ) ) return false; … … 433 428 } 434 429 } 435 430 436 431 // nothing (more) to fix, return true 437 432 return true; 438 433 } 439 434 440 void Indexer::addId( 441 DeclarationWithType * decl, OnConflict handleConflicts, Expression * baseExpr,435 void Indexer::addId( 436 DeclarationWithType *decl, OnConflict handleConflicts, Expression * baseExpr, 442 437 BaseSyntaxNode * deleteStmt ) { 443 ++* stats().add_calls;438 ++*stats().add_calls; 444 439 const std::string &name = decl->name; 445 440 if ( name == "" ) return; 446 441 447 442 std::string mangleName; 448 443 if ( LinkageSpec::isOverridable( decl->linkage ) ) { 449 // mangle the name without including the appropriate suffix, so overridable routines 444 // mangle the name without including the appropriate suffix, so overridable routines 450 445 // are placed into the same "bucket" as their user defined versions. 451 446 mangleName = Mangler::mangle( decl, false ); … … 454 449 } // if 455 450 456 // this ensures that no two declarations with the same unmangled name at the same scope 451 // this ensures that no two declarations with the same unmangled name at the same scope 457 452 // both have C linkage 458 453 if ( LinkageSpec::isMangled( decl->linkage ) ) { … … 462 457 } 463 458 } else { 464 // NOTE: only correct if name mangling is completely isomorphic to C 459 // NOTE: only correct if name mangling is completely isomorphic to C 465 460 // type-compatibility, which it may not be. 466 461 if ( hasIncompatibleCDecl( name, mangleName ) ) { … … 475 470 mangleTable = MangleTable::new_ptr(); 476 471 } else { 477 ++* stats().map_lookups;472 ++*stats().map_lookups; 478 473 auto decls = idTable->find( name ); 479 474 if ( decls == idTable->end() ) { … … 482 477 mangleTable = decls->second; 483 478 // skip in-scope repeat declarations of same identifier 484 ++* stats().map_lookups;479 ++*stats().map_lookups; 485 480 auto existing = mangleTable->find( mangleName ); 486 481 if ( existing != mangleTable->end() … … 491 486 // set delete expression for conflicting identifier 492 487 lazyInitScope(); 493 * stats().map_mutations += 2;488 *stats().map_mutations += 2; 494 489 idTable = idTable->set( 495 490 name, 496 mangleTable->set( 497 mangleName, 491 mangleTable->set( 492 mangleName, 498 493 IdData{ existing->second, handleConflicts.deleteStmt } ) ); 499 494 } … … 509 504 // Ensure that auto-generated ctor/dtor/assignment are deleted if necessary 510 505 if ( ! removeSpecialOverrides( data, mangleTable ) ) return; 511 * stats().map_mutations += 2;506 *stats().map_mutations += 2; 512 507 idTable = idTable->set( name, mangleTable->set( mangleName, std::move(data) ) ); 513 508 } … … 523 518 } 524 519 525 bool addedTypeConflicts( NamedTypeDecl * existing, NamedTypeDecl *added ) {520 bool addedTypeConflicts( NamedTypeDecl *existing, NamedTypeDecl *added ) { 526 521 if ( existing->base == nullptr ) { 527 522 return false; … … 535 530 } 536 531 } 537 // does not need to be added to the table if both existing and added have a base that are 532 // does not need to be added to the table if both existing and added have a base that are 538 533 // the same 539 534 return true; 540 535 } 541 536 542 void Indexer::addType( NamedTypeDecl * decl ) {543 ++* stats().add_calls;544 const std::string & id = decl->name;545 546 if ( ! typeTable ) { 537 void Indexer::addType( NamedTypeDecl *decl ) { 538 ++*stats().add_calls; 539 const std::string &id = decl->name; 540 541 if ( ! typeTable ) { 547 542 typeTable = TypeTable::new_ptr(); 548 543 } else { 549 ++* stats().map_lookups;544 ++*stats().map_lookups; 550 545 auto existing = typeTable->find( id ); 551 if ( existing != typeTable->end() 552 && existing->second.scope == scope 546 if ( existing != typeTable->end() 547 && existing->second.scope == scope 553 548 && addedTypeConflicts( existing->second.decl, decl ) ) return; 554 549 } 555 550 556 551 lazyInitScope(); 557 ++* stats().map_mutations;552 ++*stats().map_mutations; 558 553 typeTable = typeTable->set( id, Scoped<NamedTypeDecl>{ decl, scope } ); 559 554 } 560 555 561 bool addedDeclConflicts( AggregateDecl * existing, AggregateDecl *added ) {556 bool addedDeclConflicts( AggregateDecl *existing, AggregateDecl *added ) { 562 557 if ( ! existing->body ) { 563 558 return false; … … 568 563 } 569 564 570 void Indexer::addStruct( const std::string & id ) {565 void Indexer::addStruct( const std::string &id ) { 571 566 addStruct( new StructDecl( id ) ); 572 567 } 573 568 574 void Indexer::addStruct( StructDecl * decl ) {575 ++* stats().add_calls;576 const std::string & id = decl->name;569 void Indexer::addStruct( StructDecl *decl ) { 570 ++*stats().add_calls; 571 const std::string &id = decl->name; 577 572 578 573 if ( ! structTable ) { 579 574 structTable = StructTable::new_ptr(); 580 575 } else { 581 ++* stats().map_lookups;576 ++*stats().map_lookups; 582 577 auto existing = structTable->find( id ); 583 if ( existing != structTable->end() 584 && existing->second.scope == scope 578 if ( existing != structTable->end() 579 && existing->second.scope == scope 585 580 && addedDeclConflicts( existing->second.decl, decl ) ) return; 586 581 } 587 582 588 583 lazyInitScope(); 589 ++* stats().map_mutations;584 ++*stats().map_mutations; 590 585 structTable = structTable->set( id, Scoped<StructDecl>{ decl, scope } ); 591 586 } 592 587 593 void Indexer::addEnum( EnumDecl * decl ) {594 ++* stats().add_calls;595 const std::string & id = decl->name;588 void Indexer::addEnum( EnumDecl *decl ) { 589 ++*stats().add_calls; 590 const std::string &id = decl->name; 596 591 597 592 if ( ! enumTable ) { 598 593 enumTable = EnumTable::new_ptr(); 599 594 } else { 600 ++* stats().map_lookups;595 ++*stats().map_lookups; 601 596 auto existing = enumTable->find( id ); 602 if ( existing != enumTable->end() 603 && existing->second.scope == scope 597 if ( existing != enumTable->end() 598 && existing->second.scope == scope 604 599 && addedDeclConflicts( existing->second.decl, decl ) ) return; 605 600 } 606 601 607 602 lazyInitScope(); 608 ++* stats().map_mutations;603 ++*stats().map_mutations; 609 604 enumTable = enumTable->set( id, Scoped<EnumDecl>{ decl, scope } ); 610 605 } 611 606 612 void Indexer::addUnion( const std::string & id ) {607 void Indexer::addUnion( const std::string &id ) { 613 608 addUnion( new UnionDecl( id ) ); 614 609 } 615 610 616 void Indexer::addUnion( UnionDecl * decl ) {617 ++* stats().add_calls;618 const std::string & id = decl->name;611 void Indexer::addUnion( UnionDecl *decl ) { 612 ++*stats().add_calls; 613 const std::string &id = decl->name; 619 614 620 615 if ( ! unionTable ) { 621 616 unionTable = UnionTable::new_ptr(); 622 617 } else { 623 ++* stats().map_lookups;618 ++*stats().map_lookups; 624 619 auto existing = unionTable->find( id ); 625 if ( existing != unionTable->end() 626 && existing->second.scope == scope 620 if ( existing != unionTable->end() 621 && existing->second.scope == scope 627 622 && addedDeclConflicts( existing->second.decl, decl ) ) return; 628 623 } 629 624 630 625 lazyInitScope(); 631 ++* stats().map_mutations;626 ++*stats().map_mutations; 632 627 unionTable = unionTable->set( id, Scoped<UnionDecl>{ decl, scope } ); 633 628 } 634 629 635 void Indexer::addTrait( TraitDecl * decl ) {636 ++* stats().add_calls;637 const std::string & id = decl->name;630 void Indexer::addTrait( TraitDecl *decl ) { 631 ++*stats().add_calls; 632 const std::string &id = decl->name; 638 633 639 634 if ( ! traitTable ) { 640 635 traitTable = TraitTable::new_ptr(); 641 636 } else { 642 ++* stats().map_lookups;637 ++*stats().map_lookups; 643 638 auto existing = traitTable->find( id ); 644 if ( existing != traitTable->end() 645 && existing->second.scope == scope 639 if ( existing != traitTable->end() 640 && existing->second.scope == scope 646 641 && addedDeclConflicts( existing->second.decl, decl ) ) return; 647 642 } 648 643 649 644 lazyInitScope(); 650 ++* stats().map_mutations;645 ++*stats().map_mutations; 651 646 traitTable = traitTable->set( id, Scoped<TraitDecl>{ decl, scope } ); 652 647 } 653 648 654 void Indexer::addMembers( AggregateDecl * aggr, Expression * expr, 649 void Indexer::addMembers( AggregateDecl * aggr, Expression * expr, 655 650 OnConflict handleConflicts ) { 656 651 for ( Declaration * decl : aggr->members ) { … … 659 654 if ( dwt->name == "" ) { 660 655 Type * t = dwt->get_type()->stripReferences(); 661 if ( dynamic_cast<StructInstType *>( t ) || dynamic_cast<UnionInstType*>( t ) ) {656 if ( dynamic_cast<StructInstType*>( t ) || dynamic_cast<UnionInstType*>( t ) ) { 662 657 Expression * base = expr->clone(); 663 658 ResolvExpr::Cost cost = ResolvExpr::Cost::zero; // xxx - carry this cost into the indexer as a base cost? -
src/SymTab/Indexer.h
rfce4e31 r302d84c2 34 34 virtual ~Indexer(); 35 35 36 // when using an indexer manually (e.g., within a mutator traversal), it is necessary to 36 // when using an indexer manually (e.g., within a mutator traversal), it is necessary to 37 37 // tell the indexer explicitly when scopes begin and end 38 38 void enterScope(); … … 50 50 // NOTE: shouldn't need either of these constructors, but gcc-4 does not properly support initializer lists with default members. 51 51 IdData() = default; 52 IdData( 52 IdData( 53 53 DeclarationWithType * id, Expression * baseExpr, BaseSyntaxNode * deleteStmt, 54 unsigned long scope ) 54 unsigned long scope ) 55 55 : id( id ), baseExpr( baseExpr ), deleteStmt( deleteStmt ), scope( scope ) {} 56 56 IdData( const IdData& o, BaseSyntaxNode * deleteStmt ) … … 61 61 62 62 /// Gets all declarations with the given ID 63 void lookupId( const std::string & id, std::list< IdData > &out ) const;63 void lookupId( const std::string &id, std::list< IdData > &out ) const; 64 64 /// Gets the top-most type declaration with the given ID 65 const NamedTypeDecl * lookupType( const std::string & id ) const; 66 NamedTypeDecl * lookupMutableType( const std::string & id ) const; 65 NamedTypeDecl *lookupType( const std::string &id ) const; 67 66 /// Gets the top-most struct declaration with the given ID 68 const StructDecl * lookupStruct( const std::string & id ) const; 69 StructDecl * lookupMutableStruct( const std::string & id ) const; 67 StructDecl *lookupStruct( const std::string &id ) const; 70 68 /// Gets the top-most enum declaration with the given ID 71 const EnumDecl * lookupEnum( const std::string & id ) const; 72 EnumDecl * lookupMutableEnum( const std::string & id ) const; 69 EnumDecl *lookupEnum( const std::string &id ) const; 73 70 /// Gets the top-most union declaration with the given ID 74 const UnionDecl * lookupUnion( const std::string & id ) const; 75 UnionDecl * lookupMutableUnion( const std::string & id ) const; 71 UnionDecl *lookupUnion( const std::string &id ) const; 76 72 /// Gets the top-most trait declaration with the given ID 77 const TraitDecl * lookupTrait( const std::string & id ) const; 78 TraitDecl * lookupMutableTrait( const std::string & id ) const; 73 TraitDecl *lookupTrait( const std::string &id ) const; 79 74 80 75 /// Gets the type declaration with the given ID at global scope 81 const NamedTypeDecl * globalLookupType( const std::string &id ) const;76 NamedTypeDecl *globalLookupType( const std::string &id ) const; 82 77 /// Gets the struct declaration with the given ID at global scope 83 const StructDecl * globalLookupStruct( const std::string &id ) const;78 StructDecl *globalLookupStruct( const std::string &id ) const; 84 79 /// Gets the union declaration with the given ID at global scope 85 const UnionDecl * globalLookupUnion( const std::string &id ) const;80 UnionDecl *globalLookupUnion( const std::string &id ) const; 86 81 /// Gets the enum declaration with the given ID at global scope 87 const EnumDecl * globalLookupEnum( const std::string &id ) const;82 EnumDecl *globalLookupEnum( const std::string &id ) const; 88 83 89 84 void addId( DeclarationWithType * decl, Expression * baseExpr = nullptr ); 90 85 void addDeletedId( DeclarationWithType * decl, BaseSyntaxNode * deleteStmt ); 91 86 92 void addType( NamedTypeDecl * decl );93 void addStruct( const std::string & id );94 void addStruct( StructDecl * decl );95 void addEnum( EnumDecl * decl );96 void addUnion( const std::string & id );97 void addUnion( UnionDecl * decl );98 void addTrait( TraitDecl * decl );87 void addType( NamedTypeDecl *decl ); 88 void addStruct( const std::string &id ); 89 void addStruct( StructDecl *decl ); 90 void addEnum( EnumDecl *decl ); 91 void addUnion( const std::string &id ); 92 void addUnion( UnionDecl *decl ); 93 void addTrait( TraitDecl *decl ); 99 94 100 95 /// adds all of the IDs from WithStmt exprs … … 111 106 112 107 private: 113 /// Wraps a Decl * with a scope108 /// Wraps a Decl* with a scope 114 109 template<typename Decl> 115 110 struct Scoped { 116 Decl * decl; ///< declaration111 Decl* decl; ///< declaration 117 112 unsigned long scope; ///< scope of this declaration 118 113 119 Scoped(Decl * d, unsigned long s) : decl(d), scope(s) {}114 Scoped(Decl* d, unsigned long s) : decl(d), scope(s) {} 120 115 }; 121 116 … … 145 140 146 141 /// Gets the indexer at the given scope 147 const Indexer * atScope( unsigned long scope ) const;142 const Indexer* atScope( unsigned long scope ) const; 148 143 149 /// Removes matching autogenerated constructors and destructors so that they will not be 144 /// Removes matching autogenerated constructors and destructors so that they will not be 150 145 /// selected. If returns false, passed decl should not be added. 151 146 bool removeSpecialOverrides( IdData& decl, MangleTable::Ptr& mangleTable ); … … 171 166 /// true if the existing identifier conflicts with the added identifier 172 167 bool addedIdConflicts( 173 const IdData& existing, DeclarationWithType * added, OnConflict handleConflicts, 168 const IdData& existing, DeclarationWithType * added, OnConflict handleConflicts, 174 169 BaseSyntaxNode * deleteStmt ); 175 170 176 171 /// common code for addId, addDeletedId, etc. 177 void addId( 178 DeclarationWithType * decl, OnConflict handleConflicts, 172 void addId( 173 DeclarationWithType * decl, OnConflict handleConflicts, 179 174 Expression * baseExpr = nullptr, BaseSyntaxNode * deleteStmt = nullptr ); 180 175 … … 183 178 184 179 /// returns true if there exists a declaration with C linkage and the given name with the same mangled name 185 bool hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const;180 bool hasCompatibleCDecl( const std::string &id, const std::string &mangleName ) const; 186 181 /// returns true if there exists a declaration with C linkage and the given name with a different mangled name 187 bool hasIncompatibleCDecl( const std::string & id, const std::string &mangleName ) const;182 bool hasIncompatibleCDecl( const std::string &id, const std::string &mangleName ) const; 188 183 }; 189 184 } // namespace SymTab -
src/SymTab/Validate.cc
rfce4e31 r302d84c2 119 119 120 120 private: 121 template< typename AggDecl > void handleAggregate( AggDecl * aggregateDecl );121 template< typename AggDecl > void handleAggregate( AggDecl *aggregateDecl ); 122 122 123 123 AggregateDecl * parentAggr = nullptr; … … 134 134 /// Replaces enum types by int, and function or array types in function parameter and return lists by appropriate pointers. 135 135 struct EnumAndPointerDecay_old { 136 void previsit( EnumDecl * aggregateDecl );137 void previsit( FunctionType * func );136 void previsit( EnumDecl *aggregateDecl ); 137 void previsit( FunctionType *func ); 138 138 }; 139 139 140 140 /// Associates forward declarations of aggregates with their definitions 141 141 struct LinkReferenceToTypes_old final : public WithIndexer, public WithGuards, public WithVisitorRef<LinkReferenceToTypes_old>, public WithShortCircuiting { 142 LinkReferenceToTypes_old( const Indexer * indexer );143 void postvisit( TypeInstType * typeInst );144 145 void postvisit( EnumInstType * enumInst );146 void postvisit( StructInstType * structInst );147 void postvisit( UnionInstType * unionInst );148 void postvisit( TraitInstType * traitInst );142 LinkReferenceToTypes_old( const Indexer *indexer ); 143 void postvisit( TypeInstType *typeInst ); 144 145 void postvisit( EnumInstType *enumInst ); 146 void postvisit( StructInstType *structInst ); 147 void postvisit( UnionInstType *unionInst ); 148 void postvisit( TraitInstType *traitInst ); 149 149 void previsit( QualifiedType * qualType ); 150 150 void postvisit( QualifiedType * qualType ); 151 151 152 void postvisit( EnumDecl * enumDecl );153 void postvisit( StructDecl * structDecl );154 void postvisit( UnionDecl * unionDecl );152 void postvisit( EnumDecl *enumDecl ); 153 void postvisit( StructDecl *structDecl ); 154 void postvisit( UnionDecl *unionDecl ); 155 155 void postvisit( TraitDecl * traitDecl ); 156 156 157 void previsit( StructDecl * structDecl );158 void previsit( UnionDecl * unionDecl );157 void previsit( StructDecl *structDecl ); 158 void previsit( UnionDecl *unionDecl ); 159 159 160 160 void renameGenericParams( std::list< TypeDecl * > & params ); 161 161 162 162 private: 163 const Indexer * local_indexer;163 const Indexer *local_indexer; 164 164 165 165 typedef std::map< std::string, std::list< EnumInstType * > > ForwardEnumsType; … … 239 239 240 240 template<typename AggDecl> 241 void handleAggregate( AggDecl * aggregateDecl );241 void handleAggregate( AggDecl *aggregateDecl ); 242 242 243 243 void previsit( StructDecl * aggregateDecl ); … … 252 252 static void verify( std::list< Declaration * > &translationUnit ); 253 253 254 void previsit( FunctionDecl * funcDecl );254 void previsit( FunctionDecl *funcDecl ); 255 255 }; 256 256 … … 287 287 Type::StorageClasses storageClasses; 288 288 289 void premutate( ObjectDecl * objectDecl );290 Expression * postmutate( CompoundLiteralExpr * compLitExpr );289 void premutate( ObjectDecl *objectDecl ); 290 Expression * postmutate( CompoundLiteralExpr *compLitExpr ); 291 291 }; 292 292 … … 393 393 } 394 394 395 void validateType( Type * type, const Indexer *indexer ) {395 void validateType( Type *type, const Indexer *indexer ) { 396 396 PassVisitor<EnumAndPointerDecay_old> epc; 397 397 PassVisitor<LinkReferenceToTypes_old> lrt( indexer ); … … 496 496 } 497 497 498 bool shouldHoist( Declaration * decl ) {498 bool shouldHoist( Declaration *decl ) { 499 499 return dynamic_cast< StructDecl * >( decl ) || dynamic_cast< UnionDecl * >( decl ) || dynamic_cast< StaticAssertDecl * >( decl ); 500 500 } … … 515 515 516 516 template< typename AggDecl > 517 void HoistStruct::handleAggregate( AggDecl * aggregateDecl ) {517 void HoistStruct::handleAggregate( AggDecl *aggregateDecl ) { 518 518 if ( parentAggr ) { 519 519 aggregateDecl->parent = parentAggr; … … 560 560 561 561 562 bool isTypedef( Declaration * decl ) {562 bool isTypedef( Declaration *decl ) { 563 563 return dynamic_cast< TypedefDecl * >( decl ); 564 564 } … … 571 571 572 572 template< typename AggDecl > 573 void EliminateTypedef::handleAggregate( AggDecl * aggregateDecl ) {573 void EliminateTypedef::handleAggregate( AggDecl *aggregateDecl ) { 574 574 filter( aggregateDecl->members, isTypedef, true ); 575 575 } … … 586 586 // remove and delete decl stmts 587 587 filter( compoundStmt->kids, [](Statement * stmt) { 588 if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {588 if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( stmt ) ) { 589 589 if ( dynamic_cast< TypedefDecl * >( declStmt->decl ) ) { 590 590 return true; … … 595 595 } 596 596 597 void EnumAndPointerDecay_old::previsit( EnumDecl * enumDecl ) {597 void EnumAndPointerDecay_old::previsit( EnumDecl *enumDecl ) { 598 598 // Set the type of each member of the enumeration to be EnumConstant 599 599 for ( std::list< Declaration * >::iterator i = enumDecl->members.begin(); i != enumDecl->members.end(); ++i ) { 600 ObjectDecl * obj = dynamic_cast< ObjectDecl * >( * i );600 ObjectDecl * obj = dynamic_cast< ObjectDecl * >( *i ); 601 601 assert( obj ); 602 602 obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl->name ) ); … … 627 627 } 628 628 629 void EnumAndPointerDecay_old::previsit( FunctionType * func ) {629 void EnumAndPointerDecay_old::previsit( FunctionType *func ) { 630 630 // Fix up parameters and return types 631 631 fixFunctionList( func->parameters, func->isVarArgs, func ); … … 633 633 } 634 634 635 LinkReferenceToTypes_old::LinkReferenceToTypes_old( const Indexer * other_indexer ) {635 LinkReferenceToTypes_old::LinkReferenceToTypes_old( const Indexer *other_indexer ) { 636 636 if ( other_indexer ) { 637 637 local_indexer = other_indexer; … … 641 641 } 642 642 643 void LinkReferenceToTypes_old::postvisit( EnumInstType * enumInst ) {644 EnumDecl * st = local_indexer->lookupMutableEnum( enumInst->name );643 void LinkReferenceToTypes_old::postvisit( EnumInstType *enumInst ) { 644 EnumDecl *st = local_indexer->lookupEnum( enumInst->name ); 645 645 // it's not a semantic error if the enum is not found, just an implicit forward declaration 646 646 if ( st ) { … … 661 661 } 662 662 663 void LinkReferenceToTypes_old::postvisit( StructInstType * structInst ) {664 StructDecl * st = local_indexer->lookupMutableStruct( structInst->name );663 void LinkReferenceToTypes_old::postvisit( StructInstType *structInst ) { 664 StructDecl *st = local_indexer->lookupStruct( structInst->name ); 665 665 // it's not a semantic error if the struct is not found, just an implicit forward declaration 666 666 if ( st ) { … … 674 674 } 675 675 676 void LinkReferenceToTypes_old::postvisit( UnionInstType * unionInst ) {677 UnionDecl * un = local_indexer->lookupMutableUnion( unionInst->name );676 void LinkReferenceToTypes_old::postvisit( UnionInstType *unionInst ) { 677 UnionDecl *un = local_indexer->lookupUnion( unionInst->name ); 678 678 // it's not a semantic error if the union is not found, just an implicit forward declaration 679 679 if ( un ) { … … 693 693 void LinkReferenceToTypes_old::postvisit( QualifiedType * qualType ) { 694 694 // linking only makes sense for the 'oldest ancestor' of the qualified type 695 qualType->parent->accept( * visitor );695 qualType->parent->accept( *visitor ); 696 696 } 697 697 … … 762 762 void LinkReferenceToTypes_old::postvisit( TraitInstType * traitInst ) { 763 763 // handle other traits 764 TraitDecl * traitDecl = local_indexer->lookupMutableTrait( traitInst->name );764 TraitDecl *traitDecl = local_indexer->lookupTrait( traitInst->name ); 765 765 if ( ! traitDecl ) { 766 766 SemanticError( traitInst->location, "use of undeclared trait " + traitInst->name ); … … 786 786 } 787 787 788 void LinkReferenceToTypes_old::postvisit( EnumDecl * enumDecl ) {788 void LinkReferenceToTypes_old::postvisit( EnumDecl *enumDecl ) { 789 789 // visit enum members first so that the types of self-referencing members are updated properly 790 790 if ( enumDecl->body ) { … … 792 792 if ( fwds != forwardEnums.end() ) { 793 793 for ( std::list< EnumInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 794 (* inst)->baseEnum = enumDecl;794 (*inst)->baseEnum = enumDecl; 795 795 } // for 796 796 forwardEnums.erase( fwds ); … … 834 834 } 835 835 836 void LinkReferenceToTypes_old::postvisit( StructDecl * structDecl ) {836 void LinkReferenceToTypes_old::postvisit( StructDecl *structDecl ) { 837 837 // visit struct members first so that the types of self-referencing members are updated properly 838 838 // xxx - need to ensure that type parameters match up between forward declarations and definition (most importantly, number of type parameters and their defaults) … … 841 841 if ( fwds != forwardStructs.end() ) { 842 842 for ( std::list< StructInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 843 (* inst)->baseStruct = structDecl;843 (*inst)->baseStruct = structDecl; 844 844 } // for 845 845 forwardStructs.erase( fwds ); … … 848 848 } 849 849 850 void LinkReferenceToTypes_old::postvisit( UnionDecl * unionDecl ) {850 void LinkReferenceToTypes_old::postvisit( UnionDecl *unionDecl ) { 851 851 if ( unionDecl->body ) { 852 852 ForwardUnionsType::iterator fwds = forwardUnions.find( unionDecl->name ); 853 853 if ( fwds != forwardUnions.end() ) { 854 854 for ( std::list< UnionInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 855 (* inst)->baseUnion = unionDecl;855 (*inst)->baseUnion = unionDecl; 856 856 } // for 857 857 forwardUnions.erase( fwds ); … … 860 860 } 861 861 862 void LinkReferenceToTypes_old::postvisit( TypeInstType * typeInst ) {862 void LinkReferenceToTypes_old::postvisit( TypeInstType *typeInst ) { 863 863 // ensure generic parameter instances are renamed like the base type 864 864 if ( inGeneric && typeInst->baseType ) typeInst->name = typeInst->baseType->name; 865 if ( const NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->name ) ) {866 if ( const TypeDecl * typeDecl = dynamic_cast< constTypeDecl * >( namedTypeDecl ) ) {867 typeInst->set_isFtype( typeDecl-> kind== TypeDecl::Ftype );865 if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->name ) ) { 866 if ( TypeDecl *typeDecl = dynamic_cast< TypeDecl * >( namedTypeDecl ) ) { 867 typeInst->set_isFtype( typeDecl->get_kind() == TypeDecl::Ftype ); 868 868 } // if 869 869 } // if … … 877 877 // expand trait instances into their members 878 878 for ( DeclarationWithType * assertion : asserts ) { 879 if ( TraitInstType * traitInst = dynamic_cast< TraitInstType * >( assertion->get_type() ) ) {879 if ( TraitInstType *traitInst = dynamic_cast< TraitInstType * >( assertion->get_type() ) ) { 880 880 // expand trait instance into all of its members 881 881 expandAssertions( traitInst, back_inserter( type->assertions ) ); … … 897 897 } 898 898 899 void ForallPointerDecay_old::previsit( ObjectDecl * object ) {899 void ForallPointerDecay_old::previsit( ObjectDecl *object ) { 900 900 // ensure that operator names only apply to functions or function pointers 901 901 if ( CodeGen::isOperator( object->name ) && ! dynamic_cast< FunctionType * >( object->type->stripDeclarator() ) ) { … … 905 905 } 906 906 907 void ForallPointerDecay_old::previsit( FunctionDecl * func ) {907 void ForallPointerDecay_old::previsit( FunctionDecl *func ) { 908 908 func->fixUniqueId(); 909 909 } … … 961 961 Type * ReplaceTypedef::postmutate( QualifiedType * qualType ) { 962 962 // replacing typedefs only makes sense for the 'oldest ancestor' of the qualified type 963 qualType->parent = qualType->parent->acceptMutator( * visitor );963 qualType->parent = qualType->parent->acceptMutator( *visitor ); 964 964 return qualType; 965 965 } … … 970 970 TypedefMap::const_iterator def = typedefNames.find( typeInst->name ); 971 971 if ( def != typedefNames.end() ) { 972 Type * ret = def->second.first->base->clone();972 Type *ret = def->second.first->base->clone(); 973 973 ret->location = typeInst->location; 974 974 ret->get_qualifiers() |= typeInst->get_qualifiers(); … … 982 982 // place instance parameters on the typedef'd type 983 983 if ( ! typeInst->parameters.empty() ) { 984 ReferenceToType * rtt = dynamic_cast<ReferenceToType*>(ret);984 ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret); 985 985 if ( ! rtt ) { 986 986 SemanticError( typeInst->location, "Cannot apply type parameters to base type of " + typeInst->name ); … … 988 988 rtt->parameters.clear(); 989 989 cloneAll( typeInst->parameters, rtt->parameters ); 990 mutateAll( rtt->parameters, * visitor ); // recursively fix typedefs on parameters990 mutateAll( rtt->parameters, *visitor ); // recursively fix typedefs on parameters 991 991 } // if 992 992 delete typeInst; … … 1043 1043 // struct screen; 1044 1044 // because the expansion of the typedef is: 1045 // void rtn( SCREEN * p ) => void rtn( struct screen *p )1045 // void rtn( SCREEN *p ) => void rtn( struct screen *p ) 1046 1046 // hence the type-name "screen" must be defined. 1047 1047 // Note, qualifiers on the typedef are superfluous for the forward declaration. 1048 1048 1049 Type * designatorType = tyDecl->base->stripDeclarator();1050 if ( StructInstType * aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {1049 Type *designatorType = tyDecl->base->stripDeclarator(); 1050 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) { 1051 1051 declsToAddBefore.push_back( new StructDecl( aggDecl->name, DeclarationNode::Struct, noAttributes, tyDecl->linkage ) ); 1052 } else if ( UnionInstType * aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {1052 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) { 1053 1053 declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) ); 1054 } else if ( EnumInstType * enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {1054 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) { 1055 1055 declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage ) ); 1056 1056 } // if … … 1078 1078 1079 1079 DeclarationWithType * ReplaceTypedef::postmutate( ObjectDecl * objDecl ) { 1080 if ( FunctionType * funtype = dynamic_cast<FunctionType *>( objDecl->type ) ) { // function type?1080 if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl->type ) ) { // function type? 1081 1081 // replace the current object declaration with a function declaration 1082 1082 FunctionDecl * newDecl = new FunctionDecl( objDecl->name, objDecl->get_storageClasses(), objDecl->linkage, funtype, 0, objDecl->attributes, objDecl->get_funcSpec() ); … … 1104 1104 void ReplaceTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 1105 1105 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 1106 Type * type = nullptr;1106 Type *type = nullptr; 1107 1107 if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) { 1108 1108 type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ); … … 1130 1130 GuardScope( typedefNames ); 1131 1131 GuardScope( typedeclNames ); 1132 mutateAll( aggr->parameters, * visitor );1132 mutateAll( aggr->parameters, *visitor ); 1133 1133 1134 1134 // unroll mutateAll for aggr->members so that implicit typedefs for nested types are added to the aggregate body. … … 1137 1137 1138 1138 try { 1139 * i = maybeMutate( * i, *visitor );1139 *i = maybeMutate( *i, *visitor ); 1140 1140 } catch ( SemanticErrorException &e ) { 1141 1141 errors.append( e ); … … 1217 1217 for ( size_t i = 0; paramIter != params->end(); ++paramIter, ++i ) { 1218 1218 if ( i < args.size() ) { 1219 TypeExpr * expr = strict_dynamic_cast< TypeExpr * >( * std::next( args.begin(), i ) );1220 sub.add( (* paramIter)->get_name(), expr->get_type()->clone() );1219 TypeExpr * expr = strict_dynamic_cast< TypeExpr * >( *std::next( args.begin(), i ) ); 1220 sub.add( (*paramIter)->get_name(), expr->get_type()->clone() ); 1221 1221 } else if ( i == args.size() ) { 1222 Type * defaultType = (* paramIter)->get_init();1222 Type * defaultType = (*paramIter)->get_init(); 1223 1223 if ( defaultType ) { 1224 1224 args.push_back( new TypeExpr( defaultType->clone() ) ); 1225 sub.add( (* paramIter)->get_name(), defaultType->clone() );1225 sub.add( (*paramIter)->get_name(), defaultType->clone() ); 1226 1226 } 1227 1227 } … … 1242 1242 } 1243 1243 1244 void CompoundLiteral::premutate( ObjectDecl * objectDecl ) {1244 void CompoundLiteral::premutate( ObjectDecl *objectDecl ) { 1245 1245 storageClasses = objectDecl->get_storageClasses(); 1246 1246 } 1247 1247 1248 Expression * CompoundLiteral::postmutate( CompoundLiteralExpr *compLitExpr ) {1248 Expression *CompoundLiteral::postmutate( CompoundLiteralExpr *compLitExpr ) { 1249 1249 // transform [storage_class] ... (struct S){ 3, ... }; 1250 1250 // into [storage_class] struct S temp = { 3, ... }; 1251 1251 static UniqueName indexName( "_compLit" ); 1252 1252 1253 ObjectDecl * tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() );1253 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() ); 1254 1254 compLitExpr->set_result( nullptr ); 1255 1255 compLitExpr->set_initializer( nullptr ); … … 1289 1289 TupleType * tupleType = strict_dynamic_cast< TupleType * >( ResolvExpr::extractResultType( ftype ) ); 1290 1290 // ensure return value is not destructed by explicitly creating an empty ListInit node wherein maybeConstruct is false. 1291 ObjectDecl * newRet = new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, tupleType, new ListInit( std::list<Initializer *>(), noDesignators, false ) );1291 ObjectDecl * newRet = new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) ); 1292 1292 deleteAll( retVals ); 1293 1293 retVals.clear(); … … 1302 1302 1303 1303 void FixObjectType::previsit( ObjectDecl * objDecl ) { 1304 Type * new_type = ResolvExpr::resolveTypeof( objDecl->get_type(), indexer );1304 Type *new_type = ResolvExpr::resolveTypeof( objDecl->get_type(), indexer ); 1305 1305 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type 1306 1306 objDecl->set_type( new_type ); … … 1308 1308 1309 1309 void FixObjectType::previsit( FunctionDecl * funcDecl ) { 1310 Type * new_type = ResolvExpr::resolveTypeof( funcDecl->type, indexer );1310 Type *new_type = ResolvExpr::resolveTypeof( funcDecl->type, indexer ); 1311 1311 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type 1312 1312 funcDecl->set_type( new_type ); 1313 1313 } 1314 1314 1315 void FixObjectType::previsit( TypeDecl * typeDecl ) {1315 void FixObjectType::previsit( TypeDecl *typeDecl ) { 1316 1316 if ( typeDecl->get_base() ) { 1317 Type * new_type = ResolvExpr::resolveTypeof( typeDecl->get_base(), indexer );1317 Type *new_type = ResolvExpr::resolveTypeof( typeDecl->get_base(), indexer ); 1318 1318 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type 1319 1319 typeDecl->set_base( new_type ); … … 1378 1378 1379 1379 namespace { 1380 /// Replaces enum types by int, and function/array types in function parameter and return 1380 /// Replaces enum types by int, and function/array types in function parameter and return 1381 1381 /// lists by appropriate pointers 1382 1382 struct EnumAndPointerDecay_new { … … 1385 1385 for ( unsigned i = 0; i < enumDecl->members.size(); ++i ) { 1386 1386 // build new version of object with EnumConstant 1387 ast::ptr< ast::ObjectDecl > obj = 1387 ast::ptr< ast::ObjectDecl > obj = 1388 1388 enumDecl->members[i].strict_as< ast::ObjectDecl >(); 1389 obj.get_and_mutate()->type = 1389 obj.get_and_mutate()->type = 1390 1390 new ast::EnumInstType{ enumDecl->name, ast::CV::Const }; 1391 1391 1392 1392 // set into decl 1393 1393 ast::EnumDecl * mut = mutate( enumDecl ); … … 1399 1399 1400 1400 static const ast::FunctionType * fixFunctionList( 1401 const ast::FunctionType * func, 1401 const ast::FunctionType * func, 1402 1402 std::vector< ast::ptr< ast::DeclWithType > > ast::FunctionType::* field, 1403 1403 ast::ArgumentFlag isVarArgs = ast::FixedArgs 1404 1404 ) { 1405 const auto & dwts = func->* field;1405 const auto & dwts = func->*field; 1406 1406 unsigned nvals = dwts.size(); 1407 1407 bool hasVoid = false; … … 1409 1409 func = ast::mutate_field_index( func, field, i, fixFunction( dwts[i], hasVoid ) ); 1410 1410 } 1411 1411 1412 1412 // the only case in which "void" is valid is where it is the only one in the list 1413 1413 if ( hasVoid && ( nvals > 1 || isVarArgs ) ) { 1414 SemanticError( 1414 SemanticError( 1415 1415 dwts.front()->location, func, "invalid type void in function type" ); 1416 1416 } … … 1418 1418 // one void is the only thing in the list, remove it 1419 1419 if ( hasVoid ) { 1420 func = ast::mutate_field( 1420 func = ast::mutate_field( 1421 1421 func, field, std::vector< ast::ptr< ast::DeclWithType > >{} ); 1422 1422 } … … 1432 1432 1433 1433 /// expand assertions from a trait instance, performing appropriate type variable substitutions 1434 void expandAssertions( 1435 const ast::TraitInstType * inst, std::vector< ast::ptr< ast::DeclWithType > > & out 1434 void expandAssertions( 1435 const ast::TraitInstType * inst, std::vector< ast::ptr< ast::DeclWithType > > & out 1436 1436 ) { 1437 1437 assertf( inst->base, "Trait instance not linked to base trait: %s", toCString( inst ) ); 1438 1438 1439 1439 // build list of trait members, substituting trait decl parameters for instance parameters 1440 ast::TypeSubstitution sub{ 1440 ast::TypeSubstitution sub{ 1441 1441 inst->base->params.begin(), inst->base->params.end(), inst->params.begin() }; 1442 1442 // deliberately take ast::ptr by-value to ensure this does not mutate inst->base … … 1449 1449 1450 1450 /// Associates forward declarations of aggregates with their definitions 1451 class LinkReferenceToTypes_new final 1452 : public ast::WithSymbolTable, public ast::WithGuards, public 1451 class LinkReferenceToTypes_new final 1452 : public ast::WithSymbolTable, public ast::WithGuards, public 1453 1453 ast::WithVisitorRef<LinkReferenceToTypes_new>, public ast::WithShortCircuiting { 1454 1455 // these maps of uses of forward declarations of types need to have the actual type 1456 // declaration switched in * after * they have been traversed. To enable this in the1457 // ast::Pass framework, any node that needs to be so mutated has mutate() called on it 1458 // before it is placed in the map, properly updating its parents in the usual traversal, 1454 1455 // these maps of uses of forward declarations of types need to have the actual type 1456 // declaration switched in *after* they have been traversed. To enable this in the 1457 // ast::Pass framework, any node that needs to be so mutated has mutate() called on it 1458 // before it is placed in the map, properly updating its parents in the usual traversal, 1459 1459 // then can have the actual mutation applied later 1460 1460 using ForwardEnumsType = std::unordered_multimap< std::string, ast::EnumInstType * >; 1461 1461 using ForwardStructsType = std::unordered_multimap< std::string, ast::StructInstType * >; 1462 1462 using ForwardUnionsType = std::unordered_multimap< std::string, ast::UnionInstType * >; 1463 1463 1464 1464 const CodeLocation & location; 1465 1465 const ast::SymbolTable * localSymtab; 1466 1466 1467 1467 ForwardEnumsType forwardEnums; 1468 1468 ForwardStructsType forwardStructs; 1469 1469 ForwardUnionsType forwardUnions; 1470 1470 1471 /// true if currently in a generic type body, so that type parameter instances can be 1471 /// true if currently in a generic type body, so that type parameter instances can be 1472 1472 /// renamed appropriately 1473 1473 bool inGeneric = false; … … 1475 1475 public: 1476 1476 /// contstruct using running symbol table 1477 LinkReferenceToTypes_new( const CodeLocation & loc ) 1477 LinkReferenceToTypes_new( const CodeLocation & loc ) 1478 1478 : location( loc ), localSymtab( &symtab ) {} 1479 1479 1480 1480 /// construct using provided symbol table 1481 LinkReferenceToTypes_new( const CodeLocation & loc, const ast::SymbolTable & syms ) 1481 LinkReferenceToTypes_new( const CodeLocation & loc, const ast::SymbolTable & syms ) 1482 1482 : location( loc ), localSymtab( &syms ) {} 1483 1483 … … 1485 1485 // ensure generic parameter instances are renamed like the base type 1486 1486 if ( inGeneric && typeInst->base ) { 1487 typeInst = ast::mutate_field( 1487 typeInst = ast::mutate_field( 1488 1488 typeInst, &ast::TypeInstType::name, typeInst->base->name ); 1489 1489 } 1490 1490 1491 if ( 1492 auto typeDecl = dynamic_cast< const ast::TypeDecl * >( 1493 localSymtab->lookupType( typeInst->name ) ) 1491 if ( 1492 auto typeDecl = dynamic_cast< const ast::TypeDecl * >( 1493 localSymtab->lookupType( typeInst->name ) ) 1494 1494 ) { 1495 1495 typeInst = ast::mutate_field( typeInst, &ast::TypeInstType::kind, typeDecl->kind ); … … 1517 1517 for ( const ast::Expr * param : inst->params ) { 1518 1518 if ( ! dynamic_cast< const ast::TypeExpr * >( param ) ) { 1519 SemanticError( 1519 SemanticError( 1520 1520 location, inst, "Expression parameters for generic types are currently " 1521 1521 "unsupported: " ); … … 1571 1571 auto expr = traitInst->params[i].as< ast::TypeExpr >(); 1572 1572 if ( ! expr ) { 1573 SemanticError( 1573 SemanticError( 1574 1574 traitInst->params[i].get(), "Expression parameters for trait instances " 1575 1575 "are currently unsupported: " ); … … 1593 1593 return traitInst; 1594 1594 } 1595 1595 1596 1596 void previsit( const ast::QualifiedType * ) { visit_children = false; } 1597 1597 1598 1598 const ast::Type * postvisit( const ast::QualifiedType * qualType ) { 1599 1599 // linking only makes sense for the "oldest ancestor" of the qualified type 1600 return ast::mutate_field( 1601 qualType, &ast::QualifiedType::parent, qualType->parent->accept( * visitor ) );1600 return ast::mutate_field( 1601 qualType, &ast::QualifiedType::parent, qualType->parent->accept( *visitor ) ); 1602 1602 } 1603 1603 1604 1604 const ast::Decl * postvisit( const ast::EnumDecl * enumDecl ) { 1605 // visit enum members first so that the types of self-referencing members are updated 1605 // visit enum members first so that the types of self-referencing members are updated 1606 1606 // properly 1607 1607 if ( ! enumDecl->body ) return enumDecl; … … 1612 1612 auto inst = fwds.first; 1613 1613 do { 1614 // forward decl is stored * mutably* in map, can thus be updated1614 // forward decl is stored *mutably* in map, can thus be updated 1615 1615 inst->second->base = enumDecl; 1616 1616 } while ( ++inst != fwds.second ); 1617 1617 forwardEnums.erase( fwds.first, fwds.second ); 1618 1618 } 1619 1619 1620 1620 // ensure that enumerator initializers are properly set 1621 1621 for ( unsigned i = 0; i < enumDecl->members.size(); ++i ) { 1622 1622 auto field = enumDecl->members[i].strict_as< ast::ObjectDecl >(); 1623 1623 if ( field->init ) { 1624 // need to resolve enumerator initializers early so that other passes that 1624 // need to resolve enumerator initializers early so that other passes that 1625 1625 // determine if an expression is constexpr have appropriate information 1626 1626 auto init = field->init.strict_as< ast::SingleInit >(); 1627 1628 enumDecl = ast::mutate_field_index( 1629 enumDecl, &ast::EnumDecl::members, i, 1630 ast::mutate_field( field, &ast::ObjectDecl::init, 1627 1628 enumDecl = ast::mutate_field_index( 1629 enumDecl, &ast::EnumDecl::members, i, 1630 ast::mutate_field( field, &ast::ObjectDecl::init, 1631 1631 ast::mutate_field( init, &ast::SingleInit::value, 1632 ResolvExpr::findSingleExpression( 1632 ResolvExpr::findSingleExpression( 1633 1633 init->value, new ast::BasicType{ ast::BasicType::SignedInt }, 1634 1634 symtab ) ) ) ); … … 1639 1639 } 1640 1640 1641 /// rename generic type parameters uniquely so that they do not conflict with user defined 1641 /// rename generic type parameters uniquely so that they do not conflict with user defined 1642 1642 /// function forall parameters, e.g. the T in Box and the T in f, below 1643 1643 /// forall(otype T) … … 1657 1657 const ast::TypeDecl * td = aggr->params[i]; 1658 1658 1659 aggr = ast::mutate_field_index( 1660 aggr, &AggrDecl::params, i, 1659 aggr = ast::mutate_field_index( 1660 aggr, &AggrDecl::params, i, 1661 1661 ast::mutate_field( td, &ast::TypeDecl::name, "__" + td->name + "_generic_" ) ); 1662 1662 } … … 1669 1669 1670 1670 void postvisit( const ast::StructDecl * structDecl ) { 1671 // visit struct members first so that the types of self-referencing members are 1671 // visit struct members first so that the types of self-referencing members are 1672 1672 // updated properly 1673 1673 if ( ! structDecl->body ) return; … … 1678 1678 auto inst = fwds.first; 1679 1679 do { 1680 // forward decl is stored * mutably* in map, can thus be updated1680 // forward decl is stored *mutably* in map, can thus be updated 1681 1681 inst->second->base = structDecl; 1682 1682 } while ( ++inst != fwds.second ); … … 1690 1690 1691 1691 void postvisit( const ast::UnionDecl * unionDecl ) { 1692 // visit union members first so that the types of self-referencing members are updated 1692 // visit union members first so that the types of self-referencing members are updated 1693 1693 // properly 1694 1694 if ( ! unionDecl->body ) return; … … 1699 1699 auto inst = fwds.first; 1700 1700 do { 1701 // forward decl is stored * mutably* in map, can thus be updated1701 // forward decl is stored *mutably* in map, can thus be updated 1702 1702 inst->second->base = unionDecl; 1703 1703 } while ( ++inst != fwds.second ); … … 1712 1712 "number of parameters: %zd", traitDecl->params.size() ); 1713 1713 1714 traitDecl = ast::mutate_field_index( 1715 traitDecl, &ast::TraitDecl::params, 0, 1716 ast::mutate_field( 1714 traitDecl = ast::mutate_field_index( 1715 traitDecl, &ast::TraitDecl::params, 0, 1716 ast::mutate_field( 1717 1717 traitDecl->params.front().get(), &ast::TypeDecl::sized, true ) ); 1718 1718 } … … 1737 1737 traitDecl = mut; 1738 1738 } 1739 1739 1740 1740 return traitDecl; 1741 1741 } 1742 1742 }; 1743 1743 1744 /// Replaces array and function types in forall lists by appropriate pointer type and assigns 1744 /// Replaces array and function types in forall lists by appropriate pointer type and assigns 1745 1745 /// each object and function declaration a unique ID 1746 1746 class ForallPointerDecay_new { … … 1751 1751 const ast::ObjectDecl * previsit( const ast::ObjectDecl * obj ) { 1752 1752 // ensure that operator names only apply to functions or function pointers 1753 if ( 1754 CodeGen::isOperator( obj->name ) 1753 if ( 1754 CodeGen::isOperator( obj->name ) 1755 1755 && ! dynamic_cast< const ast::FunctionType * >( obj->type->stripDeclarator() ) 1756 1756 ) { … … 1776 1776 /// Fix up assertions -- flattens assertion lists, removing all trait instances 1777 1777 template< typename node_t, typename parent_t > 1778 static const node_t * forallFixer( 1779 const CodeLocation & loc, const node_t * node, 1778 static const node_t * forallFixer( 1779 const CodeLocation & loc, const node_t * node, 1780 1780 ast::ParameterizedType::ForallList parent_t::* forallField 1781 1781 ) { 1782 for ( unsigned i = 0; i < (node->* forallField).size(); ++i ) {1783 const ast::TypeDecl * type = (node->* forallField)[i];1782 for ( unsigned i = 0; i < (node->*forallField).size(); ++i ) { 1783 const ast::TypeDecl * type = (node->*forallField)[i]; 1784 1784 if ( type->assertions.empty() ) continue; 1785 1785 … … 1789 1789 // expand trait instances into their members 1790 1790 for ( const ast::DeclWithType * assn : type->assertions ) { 1791 auto traitInst = 1792 dynamic_cast< const ast::TraitInstType * >( assn->get_type() ); 1791 auto traitInst = 1792 dynamic_cast< const ast::TraitInstType * >( assn->get_type() ); 1793 1793 if ( traitInst ) { 1794 1794 // expand trait instance to all its members … … 1831 1831 } // anonymous namespace 1832 1832 1833 const ast::Type * validateType( 1833 const ast::Type * validateType( 1834 1834 const CodeLocation & loc, const ast::Type * type, const ast::SymbolTable & symtab ) { 1835 1835 ast::Pass< EnumAndPointerDecay_new > epc; -
src/SymTab/Validate.h
rfce4e31 r302d84c2 19 19 #include <list> // for list 20 20 21 structCodeLocation;22 class Declaration;23 class Type;21 class CodeLocation; 22 class Declaration; 23 class Type; 24 24 25 25 namespace ast { … … 35 35 void validateType( Type *type, const Indexer *indexer ); 36 36 37 const ast::Type * validateType( 37 const ast::Type * validateType( 38 38 const CodeLocation & loc, const ast::Type * type, const ast::SymbolTable & symtab ); 39 39 } // namespace SymTab -
src/SynTree/Attribute.h
rfce4e31 r302d84c2 50 50 Attribute * clone() const override { return new Attribute( *this ); } 51 51 virtual void accept( Visitor & v ) override { v.visit( this ); } 52 virtual void accept( Visitor & v ) const override { v.visit( this ); }53 52 virtual Attribute * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 54 53 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/BaseSyntaxNode.h
rfce4e31 r302d84c2 32 32 BaseSyntaxNode( const BaseSyntaxNode & o ) : location(o.location) { ++*new_nodes; } 33 33 BaseSyntaxNode & operator=( const BaseSyntaxNode & ) = default; 34 34 35 35 virtual ~BaseSyntaxNode() {} 36 36 37 37 virtual BaseSyntaxNode * clone() const = 0; 38 38 virtual void accept( Visitor & v ) = 0; 39 virtual void accept( Visitor & v ) const = 0;40 39 virtual BaseSyntaxNode * acceptMutator( Mutator & m ) = 0; 41 40 /// Notes: -
src/SynTree/Constant.h
rfce4e31 r302d84c2 33 33 virtual ~Constant(); 34 34 35 virtual Constant * clone() const override{ return new Constant( *this ); }35 virtual Constant * clone() const { return new Constant( *this ); } 36 36 37 37 Type * get_type() { return type; } … … 51 51 static Constant null( Type * ptrtype = nullptr ); 52 52 53 virtual void accept( Visitor & v ) override { v.visit( this ); } 54 virtual void accept( Visitor & v ) const override { v.visit( this ); } 55 virtual Constant * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 56 virtual void print( std::ostream & os, Indenter indent = 0 ) const override; 57 53 virtual void accept( Visitor & v ) { v.visit( this ); } 54 virtual Constant * acceptMutator( Mutator & m ) { return m.mutate( this ); } 55 virtual void print( std::ostream & os, Indenter indent = 0 ) const; 56 private: 58 57 Type * type; 59 58 std::string rep; 60 59 std::optional<unsigned long long> ival; 60 61 friend class ConverterOldToNew; 61 62 }; 62 63 -
src/SynTree/Declaration.h
rfce4e31 r302d84c2 63 63 void fixUniqueId( void ); 64 64 virtual Declaration *clone() const override = 0; 65 virtual void accept( Visitor & v ) override = 0; 66 virtual void accept( Visitor & v ) const override = 0; 65 virtual void accept( Visitor &v ) override = 0; 67 66 virtual Declaration *acceptMutator( Mutator &m ) override = 0; 68 67 virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0; … … 140 139 141 140 virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); } 142 virtual void accept( Visitor & v ) override { v.visit( this ); } 143 virtual void accept( Visitor & v ) const override { v.visit( this ); } 141 virtual void accept( Visitor &v ) override { v.visit( this ); } 144 142 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 145 143 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 171 169 172 170 virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); } 173 virtual void accept( Visitor & v ) override { v.visit( this ); } 174 virtual void accept( Visitor & v ) const override { v.visit( this ); } 171 virtual void accept( Visitor &v ) override { v.visit( this ); } 175 172 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 176 173 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 241 238 242 239 virtual TypeDecl *clone() const override { return new TypeDecl( *this ); } 243 virtual void accept( Visitor & v ) override { v.visit( this ); } 244 virtual void accept( Visitor & v ) const override { v.visit( this ); } 240 virtual void accept( Visitor &v ) override { v.visit( this ); } 245 241 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 246 242 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 260 256 261 257 virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); } 262 virtual void accept( Visitor & v ) override { v.visit( this ); } 263 virtual void accept( Visitor & v ) const override { v.visit( this ); } 258 virtual void accept( Visitor &v ) override { v.visit( this ); } 264 259 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 265 260 private: … … 305 300 306 301 virtual StructDecl *clone() const override { return new StructDecl( *this ); } 307 virtual void accept( Visitor & v ) override { v.visit( this ); } 308 virtual void accept( Visitor & v ) const override { v.visit( this ); } 302 virtual void accept( Visitor &v ) override { v.visit( this ); } 309 303 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 310 304 DeclarationNode::Aggregate kind; … … 320 314 321 315 virtual UnionDecl *clone() const override { return new UnionDecl( *this ); } 322 virtual void accept( Visitor & v ) override { v.visit( this ); } 323 virtual void accept( Visitor & v ) const override { v.visit( this ); } 316 virtual void accept( Visitor &v ) override { v.visit( this ); } 324 317 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 325 318 private: … … 336 329 337 330 virtual EnumDecl *clone() const override { return new EnumDecl( *this ); } 338 virtual void accept( Visitor & v ) override { v.visit( this ); } 339 virtual void accept( Visitor & v ) const override { v.visit( this ); } 331 virtual void accept( Visitor &v ) override { v.visit( this ); } 340 332 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 341 333 private: … … 353 345 354 346 virtual TraitDecl *clone() const override { return new TraitDecl( *this ); } 355 virtual void accept( Visitor & v ) override { v.visit( this ); } 356 virtual void accept( Visitor & v ) const override { v.visit( this ); } 347 virtual void accept( Visitor &v ) override { v.visit( this ); } 357 348 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 358 349 private: … … 372 363 373 364 virtual AsmDecl *clone() const override { return new AsmDecl( *this ); } 374 virtual void accept( Visitor & v ) override { v.visit( this ); } 375 virtual void accept( Visitor & v ) const override { v.visit( this ); } 365 virtual void accept( Visitor &v ) override { v.visit( this ); } 376 366 virtual AsmDecl *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 377 367 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 389 379 390 380 virtual StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); } 391 virtual void accept( Visitor & v ) override { v.visit( this ); } 392 virtual void accept( Visitor & v ) const override { v.visit( this ); } 381 virtual void accept( Visitor &v ) override { v.visit( this ); } 393 382 virtual StaticAssertDecl * acceptMutator( Mutator &m ) override { return m.mutate( this ); } 394 383 virtual void print( std::ostream &os, Indenter indent = {} ) const override; -
src/SynTree/Expression.h
rfce4e31 r302d84c2 82 82 virtual Expression * clone() const override = 0; 83 83 virtual void accept( Visitor & v ) override = 0; 84 virtual void accept( Visitor & v ) const override = 0;85 84 virtual Expression * acceptMutator( Mutator & m ) override = 0; 86 85 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 102 101 std::list<Expression *>& get_args() { return args; } 103 102 104 virtual ApplicationExpr * clone() const override { return new ApplicationExpr( * this ); } 105 virtual void accept( Visitor & v ) override { v.visit( this ); } 106 virtual void accept( Visitor & v ) const override { v.visit( this ); } 107 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 108 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 103 virtual ApplicationExpr * clone() const { return new ApplicationExpr( * this ); } 104 virtual void accept( Visitor & v ) { v.visit( this ); } 105 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 106 virtual void print( std::ostream & os, Indenter indent = {} ) const; 109 107 }; 110 108 … … 131 129 static UntypedExpr * createAssign( Expression * arg1, Expression * arg2 ); 132 130 133 virtual UntypedExpr * clone() const override { return new UntypedExpr( * this ); } 134 virtual void accept( Visitor & v ) override { v.visit( this ); } 135 virtual void accept( Visitor & v ) const override { v.visit( this ); } 136 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 137 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 131 virtual UntypedExpr * clone() const { return new UntypedExpr( * this ); } 132 virtual void accept( Visitor & v ) { v.visit( this ); } 133 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 134 virtual void print( std::ostream & os, Indenter indent = {} ) const; 138 135 }; 139 136 … … 150 147 void set_name( std::string newValue ) { name = newValue; } 151 148 152 virtual NameExpr * clone() const override { return new NameExpr( * this ); } 153 virtual void accept( Visitor & v ) override { v.visit( this ); } 154 virtual void accept( Visitor & v ) const override { v.visit( this ); } 155 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 156 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 149 virtual NameExpr * clone() const { return new NameExpr( * this ); } 150 virtual void accept( Visitor & v ) { v.visit( this ); } 151 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 152 virtual void print( std::ostream & os, Indenter indent = {} ) const; 157 153 }; 158 154 … … 172 168 void set_arg(Expression * newValue ) { arg = newValue; } 173 169 174 virtual AddressExpr * clone() const override { return new AddressExpr( * this ); } 175 virtual void accept( Visitor & v ) override { v.visit( this ); } 176 virtual void accept( Visitor & v ) const override { v.visit( this ); } 177 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 178 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 170 virtual AddressExpr * clone() const { return new AddressExpr( * this ); } 171 virtual void accept( Visitor & v ) { v.visit( this ); } 172 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 173 virtual void print( std::ostream & os, Indenter indent = {} ) const; 179 174 }; 180 175 … … 189 184 virtual ~LabelAddressExpr(); 190 185 191 virtual LabelAddressExpr * clone() const override { return new LabelAddressExpr( * this ); } 192 virtual void accept( Visitor & v ) override { v.visit( this ); } 193 virtual void accept( Visitor & v ) const override { v.visit( this ); } 194 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 195 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 186 virtual LabelAddressExpr * clone() const { return new LabelAddressExpr( * this ); } 187 virtual void accept( Visitor & v ) { v.visit( this ); } 188 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 189 virtual void print( std::ostream & os, Indenter indent = {} ) const; 196 190 }; 197 191 … … 211 205 void set_arg( Expression * newValue ) { arg = newValue; } 212 206 213 virtual CastExpr * clone() const override { return new CastExpr( * this ); } 214 virtual void accept( Visitor & v ) override { v.visit( this ); } 215 virtual void accept( Visitor & v ) const override { v.visit( this ); } 216 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 217 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 207 virtual CastExpr * clone() const { return new CastExpr( * this ); } 208 virtual void accept( Visitor & v ) { v.visit( this ); } 209 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 210 virtual void print( std::ostream & os, Indenter indent = {} ) const; 218 211 }; 219 212 … … 232 225 const std::string & targetString() const; 233 226 234 virtual KeywordCastExpr * clone() const override { return new KeywordCastExpr( * this ); } 235 virtual void accept( Visitor & v ) override { v.visit( this ); } 236 virtual void accept( Visitor & v ) const override { v.visit( this ); } 237 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 238 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 227 virtual KeywordCastExpr * clone() const { return new KeywordCastExpr( * this ); } 228 virtual void accept( Visitor & v ) { v.visit( this ); } 229 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 230 virtual void print( std::ostream & os, Indenter indent = {} ) const; 239 231 }; 240 232 … … 251 243 void set_arg( Expression * newValue ) { arg = newValue; } 252 244 253 virtual VirtualCastExpr * clone() const override { return new VirtualCastExpr( * this ); } 254 virtual void accept( Visitor & v ) override { v.visit( this ); } 255 virtual void accept( Visitor & v ) const override { v.visit( this ); } 256 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 257 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 245 virtual VirtualCastExpr * clone() const { return new VirtualCastExpr( * this ); } 246 virtual void accept( Visitor & v ) { v.visit( this ); } 247 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 248 virtual void print( std::ostream & os, Indenter indent = {} ) const; 258 249 }; 259 250 … … 273 264 void set_aggregate( Expression * newValue ) { aggregate = newValue; } 274 265 275 virtual UntypedMemberExpr * clone() const override { return new UntypedMemberExpr( * this ); } 276 virtual void accept( Visitor & v ) override { v.visit( this ); } 277 virtual void accept( Visitor & v ) const override { v.visit( this ); } 278 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 279 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 266 virtual UntypedMemberExpr * clone() const { return new UntypedMemberExpr( * this ); } 267 virtual void accept( Visitor & v ) { v.visit( this ); } 268 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 269 virtual void print( std::ostream & os, Indenter indent = {} ) const; 280 270 }; 281 271 … … 296 286 void set_aggregate( Expression * newValue ) { aggregate = newValue; } 297 287 298 virtual MemberExpr * clone() const override { return new MemberExpr( * this ); } 299 virtual void accept( Visitor & v ) override { v.visit( this ); } 300 virtual void accept( Visitor & v ) const override { v.visit( this ); } 301 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 302 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 288 virtual MemberExpr * clone() const { return new MemberExpr( * this ); } 289 virtual void accept( Visitor & v ) { v.visit( this ); } 290 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 291 virtual void print( std::ostream & os, Indenter indent = {} ) const; 303 292 }; 304 293 … … 319 308 static VariableExpr * functionPointer( FunctionDecl * decl ); 320 309 321 virtual VariableExpr * clone() const override { return new VariableExpr( * this ); } 322 virtual void accept( Visitor & v ) override { v.visit( this ); } 323 virtual void accept( Visitor & v ) const override { v.visit( this ); } 324 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 325 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 310 virtual VariableExpr * clone() const { return new VariableExpr( * this ); } 311 virtual void accept( Visitor & v ) { v.visit( this ); } 312 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 313 virtual void print( std::ostream & os, Indenter indent = {} ) const; 326 314 }; 327 315 … … 341 329 long long int intValue() const; 342 330 343 virtual ConstantExpr * clone() const override { return new ConstantExpr( * this ); } 344 virtual void accept( Visitor & v ) override { v.visit( this ); } 345 virtual void accept( Visitor & v ) const override { v.visit( this ); } 346 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 347 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 331 virtual ConstantExpr * clone() const { return new ConstantExpr( * this ); } 332 virtual void accept( Visitor & v ) { v.visit( this ); } 333 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 334 virtual void print( std::ostream & os, Indenter indent = {} ) const; 348 335 }; 349 336 … … 367 354 void set_isType( bool newValue ) { isType = newValue; } 368 355 369 virtual SizeofExpr * clone() const override { return new SizeofExpr( * this ); } 370 virtual void accept( Visitor & v ) override { v.visit( this ); } 371 virtual void accept( Visitor & v ) const override { v.visit( this ); } 372 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 373 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 356 virtual SizeofExpr * clone() const { return new SizeofExpr( * this ); } 357 virtual void accept( Visitor & v ) { v.visit( this ); } 358 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 359 virtual void print( std::ostream & os, Indenter indent = {} ) const; 374 360 }; 375 361 … … 393 379 void set_isType( bool newValue ) { isType = newValue; } 394 380 395 virtual AlignofExpr * clone() const override { return new AlignofExpr( * this ); } 396 virtual void accept( Visitor & v ) override { v.visit( this ); } 397 virtual void accept( Visitor & v ) const override { v.visit( this ); } 398 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 399 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 381 virtual AlignofExpr * clone() const { return new AlignofExpr( * this ); } 382 virtual void accept( Visitor & v ) { v.visit( this ); } 383 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 384 virtual void print( std::ostream & os, Indenter indent = {} ) const; 400 385 }; 401 386 … … 415 400 void set_type( Type * newValue ) { type = newValue; } 416 401 417 virtual UntypedOffsetofExpr * clone() const override { return new UntypedOffsetofExpr( * this ); } 418 virtual void accept( Visitor & v ) override { v.visit( this ); } 419 virtual void accept( Visitor & v ) const override { v.visit( this ); } 420 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 421 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 402 virtual UntypedOffsetofExpr * clone() const { return new UntypedOffsetofExpr( * this ); } 403 virtual void accept( Visitor & v ) { v.visit( this ); } 404 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 405 virtual void print( std::ostream & os, Indenter indent = {} ) const; 422 406 }; 423 407 … … 437 421 void set_member( DeclarationWithType * newValue ) { member = newValue; } 438 422 439 virtual OffsetofExpr * clone() const override { return new OffsetofExpr( * this ); } 440 virtual void accept( Visitor & v ) override { v.visit( this ); } 441 virtual void accept( Visitor & v ) const override { v.visit( this ); } 442 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 443 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 423 virtual OffsetofExpr * clone() const { return new OffsetofExpr( * this ); } 424 virtual void accept( Visitor & v ) { v.visit( this ); } 425 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 426 virtual void print( std::ostream & os, Indenter indent = {} ) const; 444 427 }; 445 428 … … 456 439 void set_type( StructInstType * newValue ) { type = newValue; } 457 440 458 virtual OffsetPackExpr * clone() const override { return new OffsetPackExpr( * this ); } 459 virtual void accept( Visitor & v ) override { v.visit( this ); } 460 virtual void accept( Visitor & v ) const override { v.visit( this ); } 461 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 462 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 441 virtual OffsetPackExpr * clone() const { return new OffsetPackExpr( * this ); } 442 virtual void accept( Visitor & v ) { v.visit( this ); } 443 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 444 virtual void print( std::ostream & os, Indenter indent = {} ) const; 463 445 }; 464 446 … … 485 467 void set_isType( bool newValue ) { isType = newValue; } 486 468 487 virtual AttrExpr * clone() const override { return new AttrExpr( * this ); } 488 virtual void accept( Visitor & v ) override { v.visit( this ); } 489 virtual void accept( Visitor & v ) const override { v.visit( this ); } 490 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 491 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 469 virtual AttrExpr * clone() const { return new AttrExpr( * this ); } 470 virtual void accept( Visitor & v ) { v.visit( this ); } 471 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 472 virtual void print( std::ostream & os, Indenter indent = {} ) const; 492 473 }; 493 474 … … 508 489 void set_arg2( Expression * newValue ) { arg2 = newValue; } 509 490 510 virtual LogicalExpr * clone() const override { return new LogicalExpr( * this ); } 511 virtual void accept( Visitor & v ) override { v.visit( this ); } 512 virtual void accept( Visitor & v ) const override { v.visit( this ); } 513 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 514 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 491 virtual LogicalExpr * clone() const { return new LogicalExpr( * this ); } 492 virtual void accept( Visitor & v ) { v.visit( this ); } 493 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 494 virtual void print( std::ostream & os, Indenter indent = {} ) const; 515 495 516 496 private: … … 536 516 void set_arg3( Expression * newValue ) { arg3 = newValue; } 537 517 538 virtual ConditionalExpr * clone() const override { return new ConditionalExpr( * this ); } 539 virtual void accept( Visitor & v ) override { v.visit( this ); } 540 virtual void accept( Visitor & v ) const override { v.visit( this ); } 541 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 542 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 518 virtual ConditionalExpr * clone() const { return new ConditionalExpr( * this ); } 519 virtual void accept( Visitor & v ) { v.visit( this ); } 520 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 521 virtual void print( std::ostream & os, Indenter indent = {} ) const; 543 522 }; 544 523 … … 558 537 void set_arg2( Expression * newValue ) { arg2 = newValue; } 559 538 560 virtual CommaExpr * clone() const override { return new CommaExpr( * this ); } 561 virtual void accept( Visitor & v ) override { v.visit( this ); } 562 virtual void accept( Visitor & v ) const override { v.visit( this ); } 563 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 564 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 539 virtual CommaExpr * clone() const { return new CommaExpr( * this ); } 540 virtual void accept( Visitor & v ) { v.visit( this ); } 541 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 542 virtual void print( std::ostream & os, Indenter indent = {} ) const; 565 543 }; 566 544 … … 577 555 void set_type( Type * newValue ) { type = newValue; } 578 556 579 virtual TypeExpr * clone() const override { return new TypeExpr( * this ); } 580 virtual void accept( Visitor & v ) override { v.visit( this ); } 581 virtual void accept( Visitor & v ) const override { v.visit( this ); } 582 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 583 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 557 virtual TypeExpr * clone() const { return new TypeExpr( * this ); } 558 virtual void accept( Visitor & v ) { v.visit( this ); } 559 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 560 virtual void print( std::ostream & os, Indenter indent = {} ) const; 584 561 }; 585 562 … … 604 581 void set_operand( Expression * newValue ) { operand = newValue; } 605 582 606 virtual AsmExpr * clone() const override { return new AsmExpr( * this ); } 607 virtual void accept( Visitor & v ) override { v.visit( this ); } 608 virtual void accept( Visitor & v ) const override { v.visit( this ); } 609 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 610 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 583 virtual AsmExpr * clone() const { return new AsmExpr( * this ); } 584 virtual void accept( Visitor & v ) { v.visit( this ); } 585 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 586 virtual void print( std::ostream & os, Indenter indent = {} ) const; 611 587 612 588 // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints … … 623 599 virtual ~ImplicitCopyCtorExpr(); 624 600 625 virtual ImplicitCopyCtorExpr * clone() const override { return new ImplicitCopyCtorExpr( * this ); } 626 virtual void accept( Visitor & v ) override { v.visit( this ); } 627 virtual void accept( Visitor & v ) const override { v.visit( this ); } 628 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 629 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 601 virtual ImplicitCopyCtorExpr * clone() const { return new ImplicitCopyCtorExpr( * this ); } 602 virtual void accept( Visitor & v ) { v.visit( this ); } 603 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 604 virtual void print( std::ostream & os, Indenter indent = {} ) const; 630 605 }; 631 606 … … 642 617 void set_callExpr( Expression * newValue ) { callExpr = newValue; } 643 618 644 virtual ConstructorExpr * clone() const override { return new ConstructorExpr( * this ); } 645 virtual void accept( Visitor & v ) override { v.visit( this ); } 646 virtual void accept( Visitor & v ) const override { v.visit( this ); } 647 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 648 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 619 virtual ConstructorExpr * clone() const { return new ConstructorExpr( * this ); } 620 virtual void accept( Visitor & v ) { v.visit( this ); } 621 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 622 virtual void print( std::ostream & os, Indenter indent = {} ) const; 649 623 }; 650 624 … … 661 635 void set_initializer( Initializer * i ) { initializer = i; } 662 636 663 virtual CompoundLiteralExpr * clone() const override { return new CompoundLiteralExpr( * this ); } 664 virtual void accept( Visitor & v ) override { v.visit( this ); } 665 virtual void accept( Visitor & v ) const override { v.visit( this ); } 666 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 667 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 637 virtual CompoundLiteralExpr * clone() const { return new CompoundLiteralExpr( * this ); } 638 virtual void accept( Visitor & v ) { v.visit( this ); } 639 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 640 virtual void print( std::ostream & os, Indenter indent = {} ) const; 668 641 }; 669 642 … … 681 654 RangeExpr * set_high( Expression * high ) { RangeExpr::high = high; return this; } 682 655 683 virtual RangeExpr * clone() const override { return new RangeExpr( * this ); } 684 virtual void accept( Visitor & v ) override { v.visit( this ); } 685 virtual void accept( Visitor & v ) const override { v.visit( this ); } 686 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 687 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 656 virtual RangeExpr * clone() const { return new RangeExpr( * this ); } 657 virtual void accept( Visitor & v ) { v.visit( this ); } 658 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 659 virtual void print( std::ostream & os, Indenter indent = {} ) const; 688 660 }; 689 661 … … 699 671 std::list<Expression*>& get_exprs() { return exprs; } 700 672 701 virtual UntypedTupleExpr * clone() const override { return new UntypedTupleExpr( * this ); } 702 virtual void accept( Visitor & v ) override { v.visit( this ); } 703 virtual void accept( Visitor & v ) const override { v.visit( this ); } 704 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 705 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 673 virtual UntypedTupleExpr * clone() const { return new UntypedTupleExpr( * this ); } 674 virtual void accept( Visitor & v ) { v.visit( this ); } 675 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 676 virtual void print( std::ostream & os, Indenter indent = {} ) const; 706 677 }; 707 678 … … 717 688 std::list<Expression*>& get_exprs() { return exprs; } 718 689 719 virtual TupleExpr * clone() const override { return new TupleExpr( * this ); } 720 virtual void accept( Visitor & v ) override { v.visit( this ); } 721 virtual void accept( Visitor & v ) const override { v.visit( this ); } 722 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 723 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 690 virtual TupleExpr * clone() const { return new TupleExpr( * this ); } 691 virtual void accept( Visitor & v ) { v.visit( this ); } 692 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 693 virtual void print( std::ostream & os, Indenter indent = {} ) const; 724 694 }; 725 695 … … 739 709 TupleIndexExpr * set_index( unsigned int newValue ) { index = newValue; return this; } 740 710 741 virtual TupleIndexExpr * clone() const override { return new TupleIndexExpr( * this ); } 742 virtual void accept( Visitor & v ) override { v.visit( this ); } 743 virtual void accept( Visitor & v ) const override { v.visit( this ); } 744 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 745 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 711 virtual TupleIndexExpr * clone() const { return new TupleIndexExpr( * this ); } 712 virtual void accept( Visitor & v ) { v.visit( this ); } 713 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 714 virtual void print( std::ostream & os, Indenter indent = {} ) const; 746 715 }; 747 716 … … 758 727 StmtExpr * get_stmtExpr() const { return stmtExpr; } 759 728 760 virtual TupleAssignExpr * clone() const override { return new TupleAssignExpr( * this ); } 761 virtual void accept( Visitor & v ) override { v.visit( this ); } 762 virtual void accept( Visitor & v ) const override { v.visit( this ); } 763 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 764 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 729 virtual TupleAssignExpr * clone() const { return new TupleAssignExpr( * this ); } 730 virtual void accept( Visitor & v ) { v.visit( this ); } 731 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 732 virtual void print( std::ostream & os, Indenter indent = {} ) const; 765 733 766 734 friend class ConverterNewToOld; … … 792 760 std::list< Expression * > & get_dtors() { return dtors; } 793 761 794 virtual StmtExpr * clone() const override { return new StmtExpr( * this ); } 795 virtual void accept( Visitor & v ) override { v.visit( this ); } 796 virtual void accept( Visitor & v ) const override { v.visit( this ); } 797 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 798 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 762 virtual StmtExpr * clone() const { return new StmtExpr( * this ); } 763 virtual void accept( Visitor & v ) { v.visit( this ); } 764 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 765 virtual void print( std::ostream & os, Indenter indent = {} ) const; 799 766 }; 800 767 … … 820 787 int get_id() const { return id; } 821 788 822 virtual UniqueExpr * clone() const override { return new UniqueExpr( * this ); } 823 virtual void accept( Visitor & v ) override { v.visit( this ); } 824 virtual void accept( Visitor & v ) const override { v.visit( this ); } 825 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 826 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 789 virtual UniqueExpr * clone() const { return new UniqueExpr( * this ); } 790 virtual void accept( Visitor & v ) { v.visit( this ); } 791 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 792 virtual void print( std::ostream & os, Indenter indent = {} ) const; 827 793 828 794 private: … … 855 821 std::list<InitAlternative> & get_initAlts() { return initAlts; } 856 822 857 virtual UntypedInitExpr * clone() const override { return new UntypedInitExpr( * this ); } 858 virtual void accept( Visitor & v ) override { v.visit( this ); } 859 virtual void accept( Visitor & v ) const override { v.visit( this ); } 860 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 861 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 823 virtual UntypedInitExpr * clone() const { return new UntypedInitExpr( * this ); } 824 virtual void accept( Visitor & v ) { v.visit( this ); } 825 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 826 virtual void print( std::ostream & os, Indenter indent = {} ) const; 862 827 }; 863 828 … … 877 842 InitExpr * set_designation( Designation * newValue ) { designation = newValue; return this; } 878 843 879 virtual InitExpr * clone() const override { return new InitExpr( * this ); } 880 virtual void accept( Visitor & v ) override { v.visit( this ); } 881 virtual void accept( Visitor & v ) const override { v.visit( this ); } 882 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 883 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 844 virtual InitExpr * clone() const { return new InitExpr( * this ); } 845 virtual void accept( Visitor & v ) { v.visit( this ); } 846 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 847 virtual void print( std::ostream & os, Indenter indent = {} ) const; 884 848 }; 885 849 … … 894 858 ~DeletedExpr(); 895 859 896 virtual DeletedExpr * clone() const override { return new DeletedExpr( * this ); } 897 virtual void accept( Visitor & v ) override { v.visit( this ); } 898 virtual void accept( Visitor & v ) const override { v.visit( this ); } 899 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 900 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 860 virtual DeletedExpr * clone() const { return new DeletedExpr( * this ); } 861 virtual void accept( Visitor & v ) { v.visit( this ); } 862 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 863 virtual void print( std::ostream & os, Indenter indent = {} ) const; 901 864 }; 902 865 … … 910 873 ~DefaultArgExpr(); 911 874 912 virtual DefaultArgExpr * clone() const override { return new DefaultArgExpr( * this ); } 913 virtual void accept( Visitor & v ) override { v.visit( this ); } 914 virtual void accept( Visitor & v ) const override { v.visit( this ); } 915 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 916 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 875 virtual DefaultArgExpr * clone() const { return new DefaultArgExpr( * this ); } 876 virtual void accept( Visitor & v ) { v.visit( this ); } 877 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 878 virtual void print( std::ostream & os, Indenter indent = {} ) const; 917 879 }; 918 880 … … 939 901 virtual ~GenericExpr(); 940 902 941 virtual GenericExpr * clone() const override { return new GenericExpr( * this ); } 942 virtual void accept( Visitor & v ) override { v.visit( this ); } 943 virtual void accept( Visitor & v ) const override { v.visit( this ); } 944 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 945 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 903 virtual GenericExpr * clone() const { return new GenericExpr( * this ); } 904 virtual void accept( Visitor & v ) { v.visit( this ); } 905 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 906 virtual void print( std::ostream & os, Indenter indent = {} ) const; 946 907 }; 947 908 -
src/SynTree/Initializer.h
rfce4e31 r302d84c2 38 38 39 39 virtual Designation * clone() const override { return new Designation( *this ); }; 40 virtual void accept( Visitor & v ) override { v.visit( this ); } 41 virtual void accept( Visitor & v ) const override { v.visit( this ); } 40 virtual void accept( Visitor &v ) override { v.visit( this ); } 42 41 virtual Designation * acceptMutator( Mutator &m ) override { return m.mutate( this ); } 43 42 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 53 52 virtual ~Initializer(); 54 53 55 bool get_maybeConstructed() const{ return maybeConstructed; }54 bool get_maybeConstructed() { return maybeConstructed; } 56 55 57 56 virtual Initializer *clone() const override = 0; 58 virtual void accept( Visitor & v ) override = 0; 59 virtual void accept( Visitor & v ) const override = 0; 57 virtual void accept( Visitor &v ) override = 0; 60 58 virtual Initializer *acceptMutator( Mutator &m ) override = 0; 61 59 virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0; … … 78 76 79 77 virtual SingleInit *clone() const override { return new SingleInit( *this); } 80 virtual void accept( Visitor & v ) override { v.visit( this ); } 81 virtual void accept( Visitor & v ) const override { v.visit( this ); } 78 virtual void accept( Visitor &v ) override { v.visit( this ); } 82 79 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 83 80 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 107 104 108 105 virtual ListInit *clone() const override { return new ListInit( *this ); } 109 virtual void accept( Visitor & v ) override { v.visit( this ); } 110 virtual void accept( Visitor & v ) const override { v.visit( this ); } 106 virtual void accept( Visitor &v ) override { v.visit( this ); } 111 107 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 112 108 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 137 133 138 134 ConstructorInit *clone() const override { return new ConstructorInit( *this ); } 139 virtual void accept( Visitor & v ) override { v.visit( this ); } 140 virtual void accept( Visitor & v ) const override { v.visit( this ); } 135 virtual void accept( Visitor &v ) override { v.visit( this ); } 141 136 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 142 137 virtual void print( std::ostream &os, Indenter indent = {} ) const override; -
src/SynTree/Statement.h
rfce4e31 r302d84c2 45 45 virtual Statement * clone() const override = 0; 46 46 virtual void accept( Visitor & v ) override = 0; 47 virtual void accept( Visitor & v ) const override = 0;48 47 virtual Statement * acceptMutator( Mutator & m ) override = 0; 49 48 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 65 64 virtual CompoundStmt * clone() const override { return new CompoundStmt( *this ); } 66 65 virtual void accept( Visitor & v ) override { v.visit( this ); } 67 virtual void accept( Visitor & v ) const override { v.visit( this ); }68 66 virtual CompoundStmt * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 69 67 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 76 74 virtual NullStmt * clone() const override { return new NullStmt( *this ); } 77 75 virtual void accept( Visitor & v ) override { v.visit( this ); } 78 virtual void accept( Visitor & v ) const override { v.visit( this ); }79 76 virtual NullStmt * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 80 77 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 94 91 virtual ExprStmt * clone() const override { return new ExprStmt( *this ); } 95 92 virtual void accept( Visitor & v ) override { v.visit( this ); } 96 virtual void accept( Visitor & v ) const override { v.visit( this ); }97 93 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 98 94 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 124 120 void set_gotolabels( const std::list<Label> & newValue ) { gotolabels = newValue; } 125 121 126 virtual AsmStmt * clone() const override { return new AsmStmt( *this ); } 127 virtual void accept( Visitor & v ) override { v.visit( this ); } 128 virtual void accept( Visitor & v ) const override { v.visit( this ); } 129 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 130 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 122 virtual AsmStmt * clone() const { return new AsmStmt( *this ); } 123 virtual void accept( Visitor & v ) { v.visit( this ); } 124 virtual Statement * acceptMutator( Mutator & m ) { return m.mutate( this ); } 125 virtual void print( std::ostream & os, Indenter indent = {} ) const; 131 126 }; 132 127 … … 138 133 virtual ~DirectiveStmt(){} 139 134 140 virtual DirectiveStmt * clone() const override { return new DirectiveStmt( *this ); } 141 virtual void accept( Visitor & v ) override { v.visit( this ); } 142 virtual void accept( Visitor & v ) const override { v.visit( this ); } 143 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 144 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 135 virtual DirectiveStmt * clone() const { return new DirectiveStmt( *this ); } 136 virtual void accept( Visitor & v ) { v.visit( this ); } 137 virtual Statement * acceptMutator( Mutator & m ) { return m.mutate( this ); } 138 virtual void print( std::ostream & os, Indenter indent = {} ) const; 145 139 }; 146 140 … … 167 161 virtual IfStmt * clone() const override { return new IfStmt( *this ); } 168 162 virtual void accept( Visitor & v ) override { v.visit( this ); } 169 virtual void accept( Visitor & v ) const override { v.visit( this ); }170 163 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 171 164 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 187 180 188 181 virtual void accept( Visitor & v ) override { v.visit( this ); } 189 virtual void accept( Visitor & v ) const override { v.visit( this ); }190 182 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 191 183 … … 216 208 217 209 virtual void accept( Visitor & v ) override { v.visit( this ); } 218 virtual void accept( Visitor & v ) const override { v.visit( this ); }219 210 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 220 211 … … 245 236 virtual WhileStmt * clone() const override { return new WhileStmt( *this ); } 246 237 virtual void accept( Visitor & v ) override { v.visit( this ); } 247 virtual void accept( Visitor & v ) const override { v.visit( this ); }248 238 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 249 239 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 271 261 virtual ForStmt * clone() const override { return new ForStmt( *this ); } 272 262 virtual void accept( Visitor & v ) override { v.visit( this ); } 273 virtual void accept( Visitor & v ) const override { v.visit( this ); }274 263 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 275 264 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 301 290 virtual BranchStmt * clone() const override { return new BranchStmt( *this ); } 302 291 virtual void accept( Visitor & v ) override { v.visit( this ); } 303 virtual void accept( Visitor & v ) const override { v.visit( this ); }304 292 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 305 293 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 321 309 virtual ReturnStmt * clone() const override { return new ReturnStmt( *this ); } 322 310 virtual void accept( Visitor & v ) override { v.visit( this ); } 323 virtual void accept( Visitor & v ) const override { v.visit( this ); }324 311 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 325 312 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 346 333 virtual ThrowStmt * clone() const override { return new ThrowStmt( *this ); } 347 334 virtual void accept( Visitor & v ) override { v.visit( this ); } 348 virtual void accept( Visitor & v ) const override { v.visit( this ); }349 335 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 350 336 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 370 356 virtual TryStmt * clone() const override { return new TryStmt( *this ); } 371 357 virtual void accept( Visitor & v ) override { v.visit( this ); } 372 virtual void accept( Visitor & v ) const override { v.visit( this ); }373 358 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 374 359 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 399 384 virtual CatchStmt * clone() const override { return new CatchStmt( *this ); } 400 385 virtual void accept( Visitor & v ) override { v.visit( this ); } 401 virtual void accept( Visitor & v ) const override { v.visit( this ); }402 386 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 403 387 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 417 401 virtual FinallyStmt * clone() const override { return new FinallyStmt( *this ); } 418 402 virtual void accept( Visitor & v ) override { v.visit( this ); } 419 virtual void accept( Visitor & v ) const override { v.visit( this ); }420 403 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 421 404 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 455 438 virtual WaitForStmt * clone() const override { return new WaitForStmt( *this ); } 456 439 virtual void accept( Visitor & v ) override { v.visit( this ); } 457 virtual void accept( Visitor & v ) const override { v.visit( this ); }458 440 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 459 441 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 472 454 virtual WithStmt * clone() const override { return new WithStmt( *this ); } 473 455 virtual void accept( Visitor & v ) override { v.visit( this ); } 474 virtual void accept( Visitor & v ) const override { v.visit( this ); }475 456 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 476 457 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 492 473 virtual DeclStmt * clone() const override { return new DeclStmt( *this ); } 493 474 virtual void accept( Visitor & v ) override { v.visit( this ); } 494 virtual void accept( Visitor & v ) const override { v.visit( this ); }495 475 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 496 476 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 514 494 virtual ImplicitCtorDtorStmt * clone() const override { return new ImplicitCtorDtorStmt( *this ); } 515 495 virtual void accept( Visitor & v ) override { v.visit( this ); } 516 virtual void accept( Visitor & v ) const override { v.visit( this ); }517 496 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 518 497 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/Type.h
rfce4e31 r302d84c2 144 144 145 145 Qualifiers & get_qualifiers() { return tq; } 146 bool get_const() const{ return tq.is_const; }147 bool get_volatile() const{ return tq.is_volatile; }148 bool get_restrict() const{ return tq.is_restrict; }149 bool get_lvalue() const{ return tq.is_lvalue; }150 bool get_mutex() const{ return tq.is_mutex; }151 bool get_atomic() const{ return tq.is_atomic; }146 bool get_const() { return tq.is_const; } 147 bool get_volatile() { return tq.is_volatile; } 148 bool get_restrict() { return tq.is_restrict; } 149 bool get_lvalue() { return tq.is_lvalue; } 150 bool get_mutex() { return tq.is_mutex; } 151 bool get_atomic() { return tq.is_atomic; } 152 152 void set_const( bool newValue ) { tq.is_const = newValue; } 153 153 void set_volatile( bool newValue ) { tq.is_volatile = newValue; } … … 184 184 virtual Type *clone() const = 0; 185 185 virtual void accept( Visitor & v ) = 0; 186 virtual void accept( Visitor & v ) const = 0;187 186 virtual Type *acceptMutator( Mutator & m ) = 0; 188 187 virtual void print( std::ostream & os, Indenter indent = {} ) const; … … 202 201 virtual VoidType *clone() const override { return new VoidType( *this ); } 203 202 virtual void accept( Visitor & v ) override { v.visit( this ); } 204 virtual void accept( Visitor & v ) const override { v.visit( this ); }205 203 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 206 204 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 261 259 virtual BasicType *clone() const override { return new BasicType( *this ); } 262 260 virtual void accept( Visitor & v ) override { v.visit( this ); } 263 virtual void accept( Visitor & v ) const override { v.visit( this ); }264 261 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 265 262 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 297 294 virtual PointerType *clone() const override { return new PointerType( *this ); } 298 295 virtual void accept( Visitor & v ) override { v.visit( this ); } 299 virtual void accept( Visitor & v ) const override { v.visit( this ); }300 296 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 301 297 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 329 325 virtual ArrayType *clone() const override { return new ArrayType( *this ); } 330 326 virtual void accept( Visitor & v ) override { v.visit( this ); } 331 virtual void accept( Visitor & v ) const override { v.visit( this ); }332 327 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 333 328 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 345 340 virtual QualifiedType *clone() const override { return new QualifiedType( *this ); } 346 341 virtual void accept( Visitor & v ) override { v.visit( this ); } 347 virtual void accept( Visitor & v ) const override { v.visit( this ); }348 342 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 349 343 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 372 366 virtual ReferenceType *clone() const override { return new ReferenceType( *this ); } 373 367 virtual void accept( Visitor & v ) override { v.visit( this ); } 374 virtual void accept( Visitor & v ) const override { v.visit( this ); }375 368 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 376 369 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 402 395 virtual FunctionType *clone() const override { return new FunctionType( *this ); } 403 396 virtual void accept( Visitor & v ) override { v.visit( this ); } 404 virtual void accept( Visitor & v ) const override { v.visit( this ); }405 397 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 406 398 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 463 455 virtual StructInstType *clone() const override { return new StructInstType( *this ); } 464 456 virtual void accept( Visitor & v ) override { v.visit( this ); } 465 virtual void accept( Visitor & v ) const override { v.visit( this ); }466 457 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 467 458 … … 501 492 virtual UnionInstType *clone() const override { return new UnionInstType( *this ); } 502 493 virtual void accept( Visitor & v ) override { v.visit( this ); } 503 virtual void accept( Visitor & v ) const override { v.visit( this ); }504 494 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 505 495 … … 529 519 virtual EnumInstType *clone() const override { return new EnumInstType( *this ); } 530 520 virtual void accept( Visitor & v ) override { v.visit( this ); } 531 virtual void accept( Visitor & v ) const override { v.visit( this ); }532 521 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 533 522 … … 553 542 virtual TraitInstType *clone() const override { return new TraitInstType( *this ); } 554 543 virtual void accept( Visitor & v ) override { v.visit( this ); } 555 virtual void accept( Visitor & v ) const override { v.visit( this ); }556 544 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 557 545 private: … … 581 569 virtual TypeInstType *clone() const override { return new TypeInstType( *this ); } 582 570 virtual void accept( Visitor & v ) override { v.visit( this ); } 583 virtual void accept( Visitor & v ) const override { v.visit( this ); }584 571 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 585 572 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 619 606 virtual TupleType *clone() const override { return new TupleType( *this ); } 620 607 virtual void accept( Visitor & v ) override { v.visit( this ); } 621 virtual void accept( Visitor & v ) const override { v.visit( this ); }622 608 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 623 609 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 630 616 631 617 TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 632 TypeofType( const Type::Qualifiers & tq, Expression *expr, bool is_basetypeof, 618 TypeofType( const Type::Qualifiers & tq, Expression *expr, bool is_basetypeof, 633 619 const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 634 620 TypeofType( const TypeofType& ); … … 642 628 virtual TypeofType *clone() const override { return new TypeofType( *this ); } 643 629 virtual void accept( Visitor & v ) override { v.visit( this ); } 644 virtual void accept( Visitor & v ) const override { v.visit( this ); }645 630 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 646 631 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 672 657 virtual AttrType *clone() const override { return new AttrType( *this ); } 673 658 virtual void accept( Visitor & v ) override { v.visit( this ); } 674 virtual void accept( Visitor & v ) const override { v.visit( this ); }675 659 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 676 660 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 687 671 virtual VarArgsType *clone() const override { return new VarArgsType( *this ); } 688 672 virtual void accept( Visitor & v ) override { v.visit( this ); } 689 virtual void accept( Visitor & v ) const override { v.visit( this ); }690 673 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 691 674 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 700 683 virtual ZeroType *clone() const override { return new ZeroType( *this ); } 701 684 virtual void accept( Visitor & v ) override { v.visit( this ); } 702 virtual void accept( Visitor & v ) const override { v.visit( this ); }703 685 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 704 686 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 713 695 virtual OneType *clone() const override { return new OneType( *this ); } 714 696 virtual void accept( Visitor & v ) override { v.visit( this ); } 715 virtual void accept( Visitor & v ) const override { v.visit( this ); }716 697 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 717 698 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 724 705 virtual GlobalScopeType *clone() const override { return new GlobalScopeType( *this ); } 725 706 virtual void accept( Visitor & v ) override { v.visit( this ); } 726 virtual void accept( Visitor & v ) const override { v.visit( this ); }727 707 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 728 708 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/Visitor.h
rfce4e31 r302d84c2 27 27 // of the given syntax node, but performs no other action. 28 28 29 virtual void visit( ObjectDecl * node ) { visit( const_cast<const ObjectDecl *>(node) ); } 30 virtual void visit( const ObjectDecl * objectDecl ) = 0; 31 virtual void visit( FunctionDecl * node ) { visit( const_cast<const FunctionDecl *>(node) ); } 32 virtual void visit( const FunctionDecl * functionDecl ) = 0; 33 virtual void visit( StructDecl * node ) { visit( const_cast<const StructDecl *>(node) ); } 34 virtual void visit( const StructDecl * aggregateDecl ) = 0; 35 virtual void visit( UnionDecl * node ) { visit( const_cast<const UnionDecl *>(node) ); } 36 virtual void visit( const UnionDecl * aggregateDecl ) = 0; 37 virtual void visit( EnumDecl * node ) { visit( const_cast<const EnumDecl *>(node) ); } 38 virtual void visit( const EnumDecl * aggregateDecl ) = 0; 39 virtual void visit( TraitDecl * node ) { visit( const_cast<const TraitDecl *>(node) ); } 40 virtual void visit( const TraitDecl * aggregateDecl ) = 0; 41 virtual void visit( TypeDecl * node ) { visit( const_cast<const TypeDecl *>(node) ); } 42 virtual void visit( const TypeDecl * typeDecl ) = 0; 43 virtual void visit( TypedefDecl * node ) { visit( const_cast<const TypedefDecl *>(node) ); } 44 virtual void visit( const TypedefDecl * typeDecl ) = 0; 45 virtual void visit( AsmDecl * node ) { visit( const_cast<const AsmDecl *>(node) ); } 46 virtual void visit( const AsmDecl * asmDecl ) = 0; 47 virtual void visit( StaticAssertDecl * node ) { visit( const_cast<const StaticAssertDecl *>(node) ); } 48 virtual void visit( const StaticAssertDecl * assertDecl ) = 0; 29 virtual void visit( ObjectDecl * objectDecl ) = 0; 30 virtual void visit( FunctionDecl * functionDecl ) = 0; 31 virtual void visit( StructDecl * aggregateDecl ) = 0; 32 virtual void visit( UnionDecl * aggregateDecl ) = 0; 33 virtual void visit( EnumDecl * aggregateDecl ) = 0; 34 virtual void visit( TraitDecl * aggregateDecl ) = 0; 35 virtual void visit( TypeDecl * typeDecl ) = 0; 36 virtual void visit( TypedefDecl * typeDecl ) = 0; 37 virtual void visit( AsmDecl * asmDecl ) = 0; 38 virtual void visit( StaticAssertDecl * assertDecl ) = 0; 49 39 50 virtual void visit( CompoundStmt * node ) { visit( const_cast<const CompoundStmt *>(node) ); } 51 virtual void visit( const CompoundStmt * compoundStmt ) = 0; 52 virtual void visit( ExprStmt * node ) { visit( const_cast<const ExprStmt *>(node) ); } 53 virtual void visit( const ExprStmt * exprStmt ) = 0; 54 virtual void visit( AsmStmt * node ) { visit( const_cast<const AsmStmt *>(node) ); } 55 virtual void visit( const AsmStmt * asmStmt ) = 0; 56 virtual void visit( DirectiveStmt * node ) { visit( const_cast<const DirectiveStmt *>(node) ); } 57 virtual void visit( const DirectiveStmt * directiveStmt ) = 0; 58 virtual void visit( IfStmt * node ) { visit( const_cast<const IfStmt *>(node) ); } 59 virtual void visit( const IfStmt * ifStmt ) = 0; 60 virtual void visit( WhileStmt * node ) { visit( const_cast<const WhileStmt *>(node) ); } 61 virtual void visit( const WhileStmt * whileStmt ) = 0; 62 virtual void visit( ForStmt * node ) { visit( const_cast<const ForStmt *>(node) ); } 63 virtual void visit( const ForStmt * forStmt ) = 0; 64 virtual void visit( SwitchStmt * node ) { visit( const_cast<const SwitchStmt *>(node) ); } 65 virtual void visit( const SwitchStmt * switchStmt ) = 0; 66 virtual void visit( CaseStmt * node ) { visit( const_cast<const CaseStmt *>(node) ); } 67 virtual void visit( const CaseStmt * caseStmt ) = 0; 68 virtual void visit( BranchStmt * node ) { visit( const_cast<const BranchStmt *>(node) ); } 69 virtual void visit( const BranchStmt * branchStmt ) = 0; 70 virtual void visit( ReturnStmt * node ) { visit( const_cast<const ReturnStmt *>(node) ); } 71 virtual void visit( const ReturnStmt * returnStmt ) = 0; 72 virtual void visit( ThrowStmt * node ) { visit( const_cast<const ThrowStmt *>(node) ); } 73 virtual void visit( const ThrowStmt * throwStmt ) = 0; 74 virtual void visit( TryStmt * node ) { visit( const_cast<const TryStmt *>(node) ); } 75 virtual void visit( const TryStmt * tryStmt ) = 0; 76 virtual void visit( CatchStmt * node ) { visit( const_cast<const CatchStmt *>(node) ); } 77 virtual void visit( const CatchStmt * catchStmt ) = 0; 78 virtual void visit( FinallyStmt * node ) { visit( const_cast<const FinallyStmt *>(node) ); } 79 virtual void visit( const FinallyStmt * finallyStmt ) = 0; 80 virtual void visit( WaitForStmt * node ) { visit( const_cast<const WaitForStmt *>(node) ); } 81 virtual void visit( const WaitForStmt * waitforStmt ) = 0; 82 virtual void visit( WithStmt * node ) { visit( const_cast<const WithStmt *>(node) ); } 83 virtual void visit( const WithStmt * withStmt ) = 0; 84 virtual void visit( NullStmt * node ) { visit( const_cast<const NullStmt *>(node) ); } 85 virtual void visit( const NullStmt * nullStmt ) = 0; 86 virtual void visit( DeclStmt * node ) { visit( const_cast<const DeclStmt *>(node) ); } 87 virtual void visit( const DeclStmt * declStmt ) = 0; 88 virtual void visit( ImplicitCtorDtorStmt * node ) { visit( const_cast<const ImplicitCtorDtorStmt *>(node) ); } 89 virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) = 0; 40 virtual void visit( CompoundStmt * compoundStmt ) = 0; 41 virtual void visit( ExprStmt * exprStmt ) = 0; 42 virtual void visit( AsmStmt * asmStmt ) = 0; 43 virtual void visit( DirectiveStmt * directiveStmt ) = 0; 44 virtual void visit( IfStmt * ifStmt ) = 0; 45 virtual void visit( WhileStmt * whileStmt ) = 0; 46 virtual void visit( ForStmt * forStmt ) = 0; 47 virtual void visit( SwitchStmt * switchStmt ) = 0; 48 virtual void visit( CaseStmt * caseStmt ) = 0; 49 virtual void visit( BranchStmt * branchStmt ) = 0; 50 virtual void visit( ReturnStmt * returnStmt ) = 0; 51 virtual void visit( ThrowStmt * throwStmt ) = 0; 52 virtual void visit( TryStmt * tryStmt ) = 0; 53 virtual void visit( CatchStmt * catchStmt ) = 0; 54 virtual void visit( FinallyStmt * finallyStmt ) = 0; 55 virtual void visit( WaitForStmt * waitforStmt ) = 0; 56 virtual void visit( WithStmt * withStmt ) = 0; 57 virtual void visit( NullStmt * nullStmt ) = 0; 58 virtual void visit( DeclStmt * declStmt ) = 0; 59 virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) = 0; 90 60 91 virtual void visit( ApplicationExpr * node ) { visit( const_cast<const ApplicationExpr *>(node) ); } 92 virtual void visit( const ApplicationExpr * applicationExpr ) = 0; 93 virtual void visit( UntypedExpr * node ) { visit( const_cast<const UntypedExpr *>(node) ); } 94 virtual void visit( const UntypedExpr * untypedExpr ) = 0; 95 virtual void visit( NameExpr * node ) { visit( const_cast<const NameExpr *>(node) ); } 96 virtual void visit( const NameExpr * nameExpr ) = 0; 97 virtual void visit( CastExpr * node ) { visit( const_cast<const CastExpr *>(node) ); } 98 virtual void visit( const CastExpr * castExpr ) = 0; 99 virtual void visit( KeywordCastExpr * node ) { visit( const_cast<const KeywordCastExpr *>(node) ); } 100 virtual void visit( const KeywordCastExpr * castExpr ) = 0; 101 virtual void visit( VirtualCastExpr * node ) { visit( const_cast<const VirtualCastExpr *>(node) ); } 102 virtual void visit( const VirtualCastExpr * castExpr ) = 0; 103 virtual void visit( AddressExpr * node ) { visit( const_cast<const AddressExpr *>(node) ); } 104 virtual void visit( const AddressExpr * addressExpr ) = 0; 105 virtual void visit( LabelAddressExpr * node ) { visit( const_cast<const LabelAddressExpr *>(node) ); } 106 virtual void visit( const LabelAddressExpr * labAddressExpr ) = 0; 107 virtual void visit( UntypedMemberExpr * node ) { visit( const_cast<const UntypedMemberExpr *>(node) ); } 108 virtual void visit( const UntypedMemberExpr * memberExpr ) = 0; 109 virtual void visit( MemberExpr * node ) { visit( const_cast<const MemberExpr *>(node) ); } 110 virtual void visit( const MemberExpr * memberExpr ) = 0; 111 virtual void visit( VariableExpr * node ) { visit( const_cast<const VariableExpr *>(node) ); } 112 virtual void visit( const VariableExpr * variableExpr ) = 0; 113 virtual void visit( ConstantExpr * node ) { visit( const_cast<const ConstantExpr *>(node) ); } 114 virtual void visit( const ConstantExpr * constantExpr ) = 0; 115 virtual void visit( SizeofExpr * node ) { visit( const_cast<const SizeofExpr *>(node) ); } 116 virtual void visit( const SizeofExpr * sizeofExpr ) = 0; 117 virtual void visit( AlignofExpr * node ) { visit( const_cast<const AlignofExpr *>(node) ); } 118 virtual void visit( const AlignofExpr * alignofExpr ) = 0; 119 virtual void visit( UntypedOffsetofExpr * node ) { visit( const_cast<const UntypedOffsetofExpr *>(node) ); } 120 virtual void visit( const UntypedOffsetofExpr * offsetofExpr ) = 0; 121 virtual void visit( OffsetofExpr * node ) { visit( const_cast<const OffsetofExpr *>(node) ); } 122 virtual void visit( const OffsetofExpr * offsetofExpr ) = 0; 123 virtual void visit( OffsetPackExpr * node ) { visit( const_cast<const OffsetPackExpr *>(node) ); } 124 virtual void visit( const OffsetPackExpr * offsetPackExpr ) = 0; 125 virtual void visit( AttrExpr * node ) { visit( const_cast<const AttrExpr *>(node) ); } 126 virtual void visit( const AttrExpr * attrExpr ) = 0; 127 virtual void visit( LogicalExpr * node ) { visit( const_cast<const LogicalExpr *>(node) ); } 128 virtual void visit( const LogicalExpr * logicalExpr ) = 0; 129 virtual void visit( ConditionalExpr * node ) { visit( const_cast<const ConditionalExpr *>(node) ); } 130 virtual void visit( const ConditionalExpr * conditionalExpr ) = 0; 131 virtual void visit( CommaExpr * node ) { visit( const_cast<const CommaExpr *>(node) ); } 132 virtual void visit( const CommaExpr * commaExpr ) = 0; 133 virtual void visit( TypeExpr * node ) { visit( const_cast<const TypeExpr *>(node) ); } 134 virtual void visit( const TypeExpr * typeExpr ) = 0; 135 virtual void visit( AsmExpr * node ) { visit( const_cast<const AsmExpr *>(node) ); } 136 virtual void visit( const AsmExpr * asmExpr ) = 0; 137 virtual void visit( ImplicitCopyCtorExpr * node ) { visit( const_cast<const ImplicitCopyCtorExpr *>(node) ); } 138 virtual void visit( const ImplicitCopyCtorExpr * impCpCtorExpr ) = 0; 139 virtual void visit( ConstructorExpr * node ) { visit( const_cast<const ConstructorExpr *>(node) ); } 140 virtual void visit( const ConstructorExpr * ctorExpr ) = 0; 141 virtual void visit( CompoundLiteralExpr * node ) { visit( const_cast<const CompoundLiteralExpr *>(node) ); } 142 virtual void visit( const CompoundLiteralExpr * compLitExpr ) = 0; 143 virtual void visit( RangeExpr * node ) { visit( const_cast<const RangeExpr *>(node) ); } 144 virtual void visit( const RangeExpr * rangeExpr ) = 0; 145 virtual void visit( UntypedTupleExpr * node ) { visit( const_cast<const UntypedTupleExpr *>(node) ); } 146 virtual void visit( const UntypedTupleExpr * tupleExpr ) = 0; 147 virtual void visit( TupleExpr * node ) { visit( const_cast<const TupleExpr *>(node) ); } 148 virtual void visit( const TupleExpr * tupleExpr ) = 0; 149 virtual void visit( TupleIndexExpr * node ) { visit( const_cast<const TupleIndexExpr *>(node) ); } 150 virtual void visit( const TupleIndexExpr * tupleExpr ) = 0; 151 virtual void visit( TupleAssignExpr * node ) { visit( const_cast<const TupleAssignExpr *>(node) ); } 152 virtual void visit( const TupleAssignExpr * assignExpr ) = 0; 153 virtual void visit( StmtExpr * node ) { visit( const_cast<const StmtExpr *>(node) ); } 154 virtual void visit( const StmtExpr * stmtExpr ) = 0; 155 virtual void visit( UniqueExpr * node ) { visit( const_cast<const UniqueExpr *>(node) ); } 156 virtual void visit( const UniqueExpr * uniqueExpr ) = 0; 157 virtual void visit( UntypedInitExpr * node ) { visit( const_cast<const UntypedInitExpr *>(node) ); } 158 virtual void visit( const UntypedInitExpr * initExpr ) = 0; 159 virtual void visit( InitExpr * node ) { visit( const_cast<const InitExpr *>(node) ); } 160 virtual void visit( const InitExpr * initExpr ) = 0; 161 virtual void visit( DeletedExpr * node ) { visit( const_cast<const DeletedExpr *>(node) ); } 162 virtual void visit( const DeletedExpr * delExpr ) = 0; 163 virtual void visit( DefaultArgExpr * node ) { visit( const_cast<const DefaultArgExpr *>(node) ); } 164 virtual void visit( const DefaultArgExpr * argExpr ) = 0; 165 virtual void visit( GenericExpr * node ) { visit( const_cast<const GenericExpr *>(node) ); } 166 virtual void visit( const GenericExpr * genExpr ) = 0; 61 virtual void visit( ApplicationExpr * applicationExpr ) = 0; 62 virtual void visit( UntypedExpr * untypedExpr ) = 0; 63 virtual void visit( NameExpr * nameExpr ) = 0; 64 virtual void visit( CastExpr * castExpr ) = 0; 65 virtual void visit( KeywordCastExpr * castExpr ) = 0; 66 virtual void visit( VirtualCastExpr * castExpr ) = 0; 67 virtual void visit( AddressExpr * addressExpr ) = 0; 68 virtual void visit( LabelAddressExpr * labAddressExpr ) = 0; 69 virtual void visit( UntypedMemberExpr * memberExpr ) = 0; 70 virtual void visit( MemberExpr * memberExpr ) = 0; 71 virtual void visit( VariableExpr * variableExpr ) = 0; 72 virtual void visit( ConstantExpr * constantExpr ) = 0; 73 virtual void visit( SizeofExpr * sizeofExpr ) = 0; 74 virtual void visit( AlignofExpr * alignofExpr ) = 0; 75 virtual void visit( UntypedOffsetofExpr * offsetofExpr ) = 0; 76 virtual void visit( OffsetofExpr * offsetofExpr ) = 0; 77 virtual void visit( OffsetPackExpr * offsetPackExpr ) = 0; 78 virtual void visit( AttrExpr * attrExpr ) = 0; 79 virtual void visit( LogicalExpr * logicalExpr ) = 0; 80 virtual void visit( ConditionalExpr * conditionalExpr ) = 0; 81 virtual void visit( CommaExpr * commaExpr ) = 0; 82 virtual void visit( TypeExpr * typeExpr ) = 0; 83 virtual void visit( AsmExpr * asmExpr ) = 0; 84 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) = 0; 85 virtual void visit( ConstructorExpr * ctorExpr ) = 0; 86 virtual void visit( CompoundLiteralExpr * compLitExpr ) = 0; 87 virtual void visit( RangeExpr * rangeExpr ) = 0; 88 virtual void visit( UntypedTupleExpr * tupleExpr ) = 0; 89 virtual void visit( TupleExpr * tupleExpr ) = 0; 90 virtual void visit( TupleIndexExpr * tupleExpr ) = 0; 91 virtual void visit( TupleAssignExpr * assignExpr ) = 0; 92 virtual void visit( StmtExpr * stmtExpr ) = 0; 93 virtual void visit( UniqueExpr * uniqueExpr ) = 0; 94 virtual void visit( UntypedInitExpr * initExpr ) = 0; 95 virtual void visit( InitExpr * initExpr ) = 0; 96 virtual void visit( DeletedExpr * delExpr ) = 0; 97 virtual void visit( DefaultArgExpr * argExpr ) = 0; 98 virtual void visit( GenericExpr * genExpr ) = 0; 167 99 168 virtual void visit( VoidType * node ) { visit( const_cast<const VoidType *>(node) ); } 169 virtual void visit( const VoidType * basicType ) = 0; 170 virtual void visit( BasicType * node ) { visit( const_cast<const BasicType *>(node) ); } 171 virtual void visit( const BasicType * basicType ) = 0; 172 virtual void visit( PointerType * node ) { visit( const_cast<const PointerType *>(node) ); } 173 virtual void visit( const PointerType * pointerType ) = 0; 174 virtual void visit( ArrayType * node ) { visit( const_cast<const ArrayType *>(node) ); } 175 virtual void visit( const ArrayType * arrayType ) = 0; 176 virtual void visit( ReferenceType * node ) { visit( const_cast<const ReferenceType *>(node) ); } 177 virtual void visit( const ReferenceType * refType ) = 0; 178 virtual void visit( QualifiedType * node ) { visit( const_cast<const QualifiedType *>(node) ); } 179 virtual void visit( const QualifiedType * qualType ) = 0; 180 virtual void visit( FunctionType * node ) { visit( const_cast<const FunctionType *>(node) ); } 181 virtual void visit( const FunctionType * functionType ) = 0; 182 virtual void visit( StructInstType * node ) { visit( const_cast<const StructInstType *>(node) ); } 183 virtual void visit( const StructInstType * aggregateUseType ) = 0; 184 virtual void visit( UnionInstType * node ) { visit( const_cast<const UnionInstType *>(node) ); } 185 virtual void visit( const UnionInstType * aggregateUseType ) = 0; 186 virtual void visit( EnumInstType * node ) { visit( const_cast<const EnumInstType *>(node) ); } 187 virtual void visit( const EnumInstType * aggregateUseType ) = 0; 188 virtual void visit( TraitInstType * node ) { visit( const_cast<const TraitInstType *>(node) ); } 189 virtual void visit( const TraitInstType * aggregateUseType ) = 0; 190 virtual void visit( TypeInstType * node ) { visit( const_cast<const TypeInstType *>(node) ); } 191 virtual void visit( const TypeInstType * aggregateUseType ) = 0; 192 virtual void visit( TupleType * node ) { visit( const_cast<const TupleType *>(node) ); } 193 virtual void visit( const TupleType * tupleType ) = 0; 194 virtual void visit( TypeofType * node ) { visit( const_cast<const TypeofType *>(node) ); } 195 virtual void visit( const TypeofType * typeofType ) = 0; 196 virtual void visit( AttrType * node ) { visit( const_cast<const AttrType *>(node) ); } 197 virtual void visit( const AttrType * attrType ) = 0; 198 virtual void visit( VarArgsType * node ) { visit( const_cast<const VarArgsType *>(node) ); } 199 virtual void visit( const VarArgsType * varArgsType ) = 0; 200 virtual void visit( ZeroType * node ) { visit( const_cast<const ZeroType *>(node) ); } 201 virtual void visit( const ZeroType * zeroType ) = 0; 202 virtual void visit( OneType * node ) { visit( const_cast<const OneType *>(node) ); } 203 virtual void visit( const OneType * oneType ) = 0; 204 virtual void visit( GlobalScopeType * node ) { visit( const_cast<const GlobalScopeType *>(node) ); } 205 virtual void visit( const GlobalScopeType * globalType ) = 0; 100 virtual void visit( VoidType * basicType ) = 0; 101 virtual void visit( BasicType * basicType ) = 0; 102 virtual void visit( PointerType * pointerType ) = 0; 103 virtual void visit( ArrayType * arrayType ) = 0; 104 virtual void visit( ReferenceType * refType ) = 0; 105 virtual void visit( QualifiedType * qualType ) = 0; 106 virtual void visit( FunctionType * functionType ) = 0; 107 virtual void visit( StructInstType * aggregateUseType ) = 0; 108 virtual void visit( UnionInstType * aggregateUseType ) = 0; 109 virtual void visit( EnumInstType * aggregateUseType ) = 0; 110 virtual void visit( TraitInstType * aggregateUseType ) = 0; 111 virtual void visit( TypeInstType * aggregateUseType ) = 0; 112 virtual void visit( TupleType * tupleType ) = 0; 113 virtual void visit( TypeofType * typeofType ) = 0; 114 virtual void visit( AttrType * attrType ) = 0; 115 virtual void visit( VarArgsType * varArgsType ) = 0; 116 virtual void visit( ZeroType * zeroType ) = 0; 117 virtual void visit( OneType * oneType ) = 0; 118 virtual void visit( GlobalScopeType * globalType ) = 0; 206 119 207 virtual void visit( Designation * node ) { visit( const_cast<const Designation *>(node) ); } 208 virtual void visit( const Designation * designation ) = 0; 209 virtual void visit( SingleInit * node ) { visit( const_cast<const SingleInit *>(node) ); } 210 virtual void visit( const SingleInit * singleInit ) = 0; 211 virtual void visit( ListInit * node ) { visit( const_cast<const ListInit *>(node) ); } 212 virtual void visit( const ListInit * listInit ) = 0; 213 virtual void visit( ConstructorInit * node ) { visit( const_cast<const ConstructorInit *>(node) ); } 214 virtual void visit( const ConstructorInit * ctorInit ) = 0; 120 virtual void visit( Designation * designation ) = 0; 121 virtual void visit( SingleInit * singleInit ) = 0; 122 virtual void visit( ListInit * listInit ) = 0; 123 virtual void visit( ConstructorInit * ctorInit ) = 0; 215 124 216 virtual void visit( Constant * node ) { visit( const_cast<const Constant *>(node) ); } 217 virtual void visit( const Constant * constant ) = 0; 125 virtual void visit( Constant * constant ) = 0; 218 126 219 virtual void visit( Attribute * node ) { visit( const_cast<const Attribute *>(node) ); } 220 virtual void visit( const Attribute * attribute ) = 0; 127 virtual void visit( Attribute * attribute ) = 0; 221 128 }; 222 129 -
src/Tuples/Explode.h
rfce4e31 r302d84c2 51 51 template<typename OutputIterator> 52 52 void append( OutputIterator out, Expression* expr, const ResolvExpr::TypeEnvironment& env, 53 const ResolvExpr::OpenVarSet& openVars, const ResolvExpr::AssertionList& need, 53 const ResolvExpr::OpenVarSet& openVars, const ResolvExpr::AssertionList& need, 54 54 const ResolvExpr::Cost& cost, const ResolvExpr::Cost& cvtCost ) { 55 55 *out++ = ResolvExpr::Alternative{ expr, env, openVars, need, cost, cvtCost }; … … 58 58 /// Append alternative to an ExplodedActual 59 59 static inline void append( ResolvExpr::ExplodedActual& ea, Expression* expr, 60 const ResolvExpr::TypeEnvironment&, const ResolvExpr::OpenVarSet&, 60 const ResolvExpr::TypeEnvironment&, const ResolvExpr::OpenVarSet&, 61 61 const ResolvExpr::AssertionList&, const ResolvExpr::Cost&, const ResolvExpr::Cost& ) { 62 62 ea.exprs.emplace_back( expr ); … … 111 111 } else { 112 112 // atomic (non-tuple) type - output a clone of the expression in a new alternative 113 append( std::forward<Output>(out), expr->clone(), alt.env, alt.openVars, alt.need, 113 append( std::forward<Output>(out), expr->clone(), alt.env, alt.openVars, alt.need, 114 114 alt.cost, alt.cvtCost ); 115 115 } … … 174 174 template< typename Output > 175 175 void explodeRecursive( 176 const ast::CastExpr * , const ResolvExpr::Candidate &,177 const ast::SymbolTable & , Output &&176 const ast::CastExpr * expr, const ResolvExpr::Candidate & arg, 177 const ast::SymbolTable & symtab, Output && out 178 178 ) { 179 179 } … … 240 240 /// explode list of candidates into flattened list of candidates 241 241 template< typename Output > 242 void explode( 243 const ResolvExpr::CandidateList & cands, const ast::SymbolTable & symtab, Output && out, 242 void explode( 243 const ResolvExpr::CandidateList & cands, const ast::SymbolTable & symtab, Output && out, 244 244 bool isTupleAssign = false 245 245 ) { -
src/Tuples/TupleAssignment.cc
rfce4e31 r302d84c2 67 67 struct Matcher { 68 68 public: 69 Matcher( TupleAssignSpotter_old &spotter, const ResolvExpr::AltList& lhs, 69 Matcher( TupleAssignSpotter_old &spotter, const ResolvExpr::AltList& lhs, 70 70 const ResolvExpr::AltList& rhs ); 71 71 virtual ~Matcher() {} 72 72 73 73 virtual void match( std::list< Expression * > &out ) = 0; 74 74 ObjectDecl * newObject( UniqueName & namer, Expression * expr ); … … 83 83 for ( const ResolvExpr::Alternative& alt : alts ) { combineState( alt ); } 84 84 } 85 85 86 86 ResolvExpr::AltList lhs, rhs; 87 87 TupleAssignSpotter_old &spotter; … … 264 264 } 265 265 266 // extract expressions from the assignment alternatives to produce a list of assignments 266 // extract expressions from the assignment alternatives to produce a list of assignments 267 267 // that together form a single alternative 268 268 std::list< Expression *> solved_assigns; … … 271 271 matcher->combineState( alt ); 272 272 } 273 273 274 274 // xxx -- was push_front 275 275 currentFinder.get_alternatives().push_back( ResolvExpr::Alternative{ 276 new TupleAssignExpr{ solved_assigns, matcher->tmpDecls }, matcher->compositeEnv, 277 matcher->openVars, 278 ResolvExpr::AssertionList( matcher->need.begin(), matcher->need.end() ), 276 new TupleAssignExpr{ solved_assigns, matcher->tmpDecls }, matcher->compositeEnv, 277 matcher->openVars, 278 ResolvExpr::AssertionList( matcher->need.begin(), matcher->need.end() ), 279 279 ResolvExpr::sumCost( current ) + matcher->baseCost } ); 280 280 } … … 284 284 : lhs(lhs), rhs(rhs), spotter(spotter), 285 285 baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ) { 286 combineState( lhs ); 286 combineState( lhs ); 287 287 combineState( rhs ); 288 288 } … … 390 390 return dynamic_cast< const ast::TupleType * >( expr->result->stripReferences() ); 391 391 } 392 392 393 393 /// true if `expr` is of tuple type or a reference to one 394 394 bool refToTuple( const ast::Expr * expr ) { … … 421 421 } 422 422 423 Matcher( 423 Matcher( 424 424 TupleAssignSpotter_new & s, const CodeLocation & loc, 425 425 const ResolvExpr::CandidateList & l, const ResolvExpr::CandidateList & r ) 426 : lhs( l ), rhs( r ), spotter( s ), location( loc ), 427 baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ), tmpDecls(), 426 : lhs( l ), rhs( r ), spotter( s ), location( loc ), 427 baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ), tmpDecls(), 428 428 env(), open(), need() { 429 429 for ( auto & cand : lhs ) combineState( *cand ); 430 430 for ( auto & cand : rhs ) combineState( *cand ); 431 431 } 432 virtual ~Matcher() = default;433 432 434 433 virtual std::vector< ast::ptr< ast::Expr > > match() = 0; 435 434 436 /// removes environments from subexpressions within statement expressions, which could 437 /// throw off later passes like those in Box which rely on PolyMutator, and adds the 435 /// removes environments from subexpressions within statement expressions, which could 436 /// throw off later passes like those in Box which rely on PolyMutator, and adds the 438 437 /// bindings to the env 439 438 struct EnvRemover { … … 456 455 ast::ObjectDecl * newObject( UniqueName & namer, const ast::Expr * expr ) { 457 456 assert( expr->result && ! expr->result->isVoid() ); 458 459 ast::ObjectDecl * ret = new ast::ObjectDecl{ 460 location, namer.newName(), expr->result, new ast::SingleInit{ location, expr }, 457 458 ast::ObjectDecl * ret = new ast::ObjectDecl{ 459 location, namer.newName(), expr->result, new ast::SingleInit{ location, expr }, 461 460 ast::Storage::Classes{}, ast::Linkage::Cforall }; 462 461 463 462 // if expression type is a reference, just need an initializer, otherwise construct 464 463 if ( ! expr->result.as< ast::ReferenceType >() ) { 465 464 // resolve ctor/dtor for the new object 466 ast::ptr< ast::Init > ctorInit = ResolvExpr::resolveCtorInit( 465 ast::ptr< ast::Init > ctorInit = ResolvExpr::resolveCtorInit( 467 466 InitTweak::genCtorInit( location, ret ), spotter.crntFinder.symtab ); 468 467 // remove environments from subexpressions of stmtExpr … … 475 474 } 476 475 477 ast::UntypedExpr * createFunc( 478 const std::string & fname, const ast::ObjectDecl * left, 479 const ast::ObjectDecl * right 476 ast::UntypedExpr * createFunc( 477 const std::string & fname, const ast::ObjectDecl * left, 478 const ast::ObjectDecl * right 480 479 ) { 481 480 assert( left ); … … 487 486 args.front() = new ast::AddressExpr{ location, args.front() }; 488 487 if ( right ) { args.back() = new ast::AddressExpr{ location, args.back() }; } 489 return new ast::UntypedExpr{ 488 return new ast::UntypedExpr{ 490 489 location, new ast::NameExpr{ location, "?=?" }, std::move(args) }; 491 490 } else { 492 return new ast::UntypedExpr{ 491 return new ast::UntypedExpr{ 493 492 location, new ast::NameExpr{ location, fname }, std::move(args) }; 494 493 } … … 499 498 struct MassAssignMatcher final : public Matcher { 500 499 MassAssignMatcher( 501 TupleAssignSpotter_new & s, const CodeLocation & loc, 500 TupleAssignSpotter_new & s, const CodeLocation & loc, 502 501 const ResolvExpr::CandidateList & l, const ResolvExpr::CandidateList & r ) 503 502 : Matcher( s, loc, l, r ) {} … … 509 508 assert( lhs.empty() ? rhs.empty() : rhs.size() <= 1 ); 510 509 511 ast::ptr< ast::ObjectDecl > rtmp = 510 ast::ptr< ast::ObjectDecl > rtmp = 512 511 rhs.size() == 1 ? newObject( rhsNamer, rhs.front()->expr ) : nullptr; 513 512 514 513 std::vector< ast::ptr< ast::Expr > > out; 515 514 for ( ResolvExpr::CandidateRef & lhsCand : lhs ) { 516 // create a temporary object for each value in the LHS and create a call 515 // create a temporary object for each value in the LHS and create a call 517 516 // involving the RHS 518 517 ast::ptr< ast::ObjectDecl > ltmp = newObject( lhsNamer, lhsCand->expr ); … … 529 528 struct MultipleAssignMatcher final : public Matcher { 530 529 MultipleAssignMatcher( 531 TupleAssignSpotter_new & s, const CodeLocation & loc, 530 TupleAssignSpotter_new & s, const CodeLocation & loc, 532 531 const ResolvExpr::CandidateList & l, const ResolvExpr::CandidateList & r ) 533 532 : Matcher( s, loc, l, r ) {} … … 539 538 if ( lhs.size() != rhs.size() ) return {}; 540 539 541 // produce a new temporary object for each value in the LHS and RHS and pairwise 540 // produce a new temporary object for each value in the LHS and RHS and pairwise 542 541 // create the calls 543 542 std::vector< ast::ptr< ast::ObjectDecl > > ltmp, rtmp; … … 548 547 ResolvExpr::CandidateRef & rhsCand = rhs[i]; 549 548 550 // convert RHS to LHS type minus one reference -- important for case where LHS 549 // convert RHS to LHS type minus one reference -- important for case where LHS 551 550 // is && and RHS is lvalue 552 551 auto lhsType = lhsCand->expr->result.strict_as< ast::ReferenceType >(); … … 558 557 rtmp.emplace_back( std::move( robj ) ); 559 558 560 // resolve the cast expression so that rhsCand return type is bound by the cast 559 // resolve the cast expression so that rhsCand return type is bound by the cast 561 560 // type as needed, and transfer the resulting environment 562 561 ResolvExpr::CandidateFinder finder{ spotter.crntFinder.symtab, env }; … … 565 564 env = std::move( finder.candidates.front()->env ); 566 565 } 567 566 568 567 splice( tmpDecls, ltmp ); 569 568 splice( tmpDecls, rtmp ); 570 569 571 570 return out; 572 571 } … … 576 575 std::string fname; 577 576 std::unique_ptr< Matcher > matcher; 578 577 579 578 public: 580 TupleAssignSpotter_new( ResolvExpr::CandidateFinder & f ) 579 TupleAssignSpotter_new( ResolvExpr::CandidateFinder & f ) 581 580 : crntFinder( f ), fname(), matcher() {} 582 581 583 582 // find left- and right-hand-sides for mass or multiple assignment 584 void spot( 585 const ast::UntypedExpr * expr, std::vector< ResolvExpr::CandidateFinder > & args 583 void spot( 584 const ast::UntypedExpr * expr, std::vector< ResolvExpr::CandidateFinder > & args 586 585 ) { 587 586 if ( auto op = expr->func.as< ast::NameExpr >() ) { … … 600 599 if ( ! refToTuple( lhsCand->expr ) ) continue; 601 600 602 // explode is aware of casts - ensure every LHS is sent into explode with a 601 // explode is aware of casts - ensure every LHS is sent into explode with a 603 602 // reference cast 604 603 if ( ! lhsCand->expr.as< ast::CastExpr >() ) { 605 lhsCand->expr = new ast::CastExpr{ 604 lhsCand->expr = new ast::CastExpr{ 606 605 lhsCand->expr, new ast::ReferenceType{ lhsCand->expr->result } }; 607 606 } … … 611 610 explode( *lhsCand, crntFinder.symtab, back_inserter(lhs), true ); 612 611 for ( ResolvExpr::CandidateRef & cand : lhs ) { 613 // each LHS value must be a reference - some come in with a cast, if not 612 // each LHS value must be a reference - some come in with a cast, if not 614 613 // just cast to reference here 615 614 if ( ! cand->expr->result.as< ast::ReferenceType >() ) { … … 630 629 // multiple assignment 631 630 explode( *rhsCand, crntFinder.symtab, back_inserter(rhs), true ); 632 matcher.reset( 631 matcher.reset( 633 632 new MultipleAssignMatcher{ *this, expr->location, lhs, rhs } ); 634 633 } else { 635 634 // mass assignment 636 635 rhs.emplace_back( rhsCand ); 637 matcher.reset( 636 matcher.reset( 638 637 new MassAssignMatcher{ *this, expr->location, lhs, rhs } ); 639 638 } … … 643 642 // expand all possible RHS possibilities 644 643 std::vector< ResolvExpr::CandidateList > rhsCands; 645 combos( 644 combos( 646 645 std::next( args.begin(), 1 ), args.end(), back_inserter( rhsCands ) ); 647 646 for ( const ResolvExpr::CandidateList & rhsCand : rhsCands ) { … … 649 648 ResolvExpr::CandidateList rhs; 650 649 explode( rhsCand, crntFinder.symtab, back_inserter(rhs), true ); 651 matcher.reset( 650 matcher.reset( 652 651 new MultipleAssignMatcher{ *this, expr->location, lhs, rhs } ); 653 652 match(); … … 664 663 665 664 if ( ! ( matcher->lhs.empty() && matcher->rhs.empty() ) ) { 666 // if both LHS and RHS are empty than this is the empty tuple case, wherein it's 667 // okay for newAssigns to be empty. Otherwise, return early so that no new 665 // if both LHS and RHS are empty than this is the empty tuple case, wherein it's 666 // okay for newAssigns to be empty. Otherwise, return early so that no new 668 667 // candidates are generated 669 668 if ( newAssigns.empty() ) return; … … 693 692 } 694 693 695 // extract expressions from the assignment candidates to produce a list of assignments 694 // extract expressions from the assignment candidates to produce a list of assignments 696 695 // that together form a sigle candidate 697 696 std::vector< ast::ptr< ast::Expr > > solved; … … 702 701 703 702 crntFinder.candidates.emplace_back( std::make_shared< ResolvExpr::Candidate >( 704 new ast::TupleAssignExpr{ 705 matcher->location, std::move( solved ), std::move( matcher->tmpDecls ) }, 706 std::move( matcher->env ), std::move( matcher->open ), std::move( matcher->need ), 703 new ast::TupleAssignExpr{ 704 matcher->location, std::move( solved ), std::move( matcher->tmpDecls ) }, 705 std::move( matcher->env ), std::move( matcher->open ), std::move( matcher->need ), 707 706 ResolvExpr::sumCost( crnt ) + matcher->baseCost ) ); 708 707 } … … 710 709 } // anonymous namespace 711 710 712 void handleTupleAssignment( 713 ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 711 void handleTupleAssignment( 712 ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 714 713 std::vector< ResolvExpr::CandidateFinder > & args 715 714 ) {
Note:
See TracChangeset
for help on using the changeset viewer.