Changes in / [302d84c2:fce4e31]
- 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) (104 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
r302d84c2 rfce4e31 1355 1355 ast::Node * node = nullptr; 1356 1356 /// cache of nodes that might be referenced by readonly<> for de-duplication 1357 std::unordered_map< BaseSyntaxNode *, ast::Node * > cache = {};1357 std::unordered_map< const 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( Type * ty ) { return { ty->get_qualifiers().val }; }1424 static ast::CV::Qualifiers cv( const Type * ty ) { return { ty->tq.val }; } 1425 1425 1426 1426 /// returns true and sets `node` if in cache 1427 bool inCache( BaseSyntaxNode * old ) {1427 bool inCache( const 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( ObjectDecl * old ) override final {1436 virtual void visit( const 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( FunctionDecl * old ) override final {1467 virtual void visit( const 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( StructDecl * old ) override final {1500 virtual void visit( const 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( UnionDecl * old ) override final {1525 virtual void visit( const 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( EnumDecl * old ) override final {1545 virtual void visit( const 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( TraitDecl * old ) override final {1565 virtual void visit( const 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( TypeDecl * old ) override final {1585 virtual void visit( const 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( TypedefDecl * old ) override final {1605 virtual void visit( const TypedefDecl * old ) override final { 1606 1606 auto decl = new ast::TypedefDecl( 1607 1607 old->location, … … 1620 1620 } 1621 1621 1622 virtual void visit( AsmDecl * old ) override final {1622 virtual void visit( const AsmDecl * old ) override final { 1623 1623 auto decl = new ast::AsmDecl{ 1624 1624 old->location, … … 1632 1632 } 1633 1633 1634 virtual void visit( StaticAssertDecl * old ) override final {1634 virtual void visit( const StaticAssertDecl * old ) override final { 1635 1635 auto decl = new ast::StaticAssertDecl{ 1636 1636 old->location, … … 1645 1645 } 1646 1646 1647 virtual void visit( CompoundStmt * old ) override final {1647 virtual void visit( const 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( ExprStmt * old ) override final {1659 virtual void visit( const 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( AsmStmt * old ) override final {1669 virtual void visit( const 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( DirectiveStmt * old ) override final {1684 virtual void visit( const 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( IfStmt * old ) override final {1694 virtual void visit( const 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( SwitchStmt * old ) override final {1707 virtual void visit( const 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( CaseStmt * old ) override final {1718 virtual void visit( const 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( WhileStmt * old ) override final {1729 virtual void visit( const 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( ForStmt * old ) override final {1742 virtual void visit( const 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( BranchStmt * old ) override final {1755 virtual void visit( const BranchStmt * old ) override final { 1756 1756 if ( inCache( old ) ) return; 1757 1757 if (old->computedTarget) { … … 1790 1790 } 1791 1791 1792 virtual void visit( ReturnStmt * old ) override final {1792 virtual void visit( const 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( ThrowStmt * old ) override final {1802 virtual void visit( const ThrowStmt * old ) override final { 1803 1803 if ( inCache( old ) ) return; 1804 1804 ast::ExceptionKind kind; … … 1824 1824 } 1825 1825 1826 virtual void visit( TryStmt * old ) override final {1826 virtual void visit( const 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( CatchStmt * old ) override final {1838 virtual void visit( const CatchStmt * old ) override final { 1839 1839 if ( inCache( old ) ) return; 1840 1840 ast::ExceptionKind kind; … … 1861 1861 } 1862 1862 1863 virtual void visit( FinallyStmt * old ) override final {1863 virtual void visit( const 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( WaitForStmt * old ) override final {1873 virtual void visit( const 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( WithStmt * old ) override final {1905 virtual void visit( const 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( NullStmt * old ) override final {1916 virtual void visit( const 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( DeclStmt * old ) override final {1925 virtual void visit( const 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( ImplicitCtorDtorStmt * old ) override final {1935 virtual void visit( const 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( Expression * old, ast::Expr * nw) {1992 ast::Expr * visitBaseExpr_SkipResultType( const Expression * old, ast::Expr * nw) { 1993 1993 1994 1994 nw->env = convertTypeSubstitution(old->env); … … 2000 2000 } 2001 2001 2002 ast::Expr * visitBaseExpr( Expression * old, ast::Expr * nw) {2002 ast::Expr * visitBaseExpr( const Expression * old, ast::Expr * nw) { 2003 2003 2004 2004 nw->result = GET_ACCEPT_1(result, Type); … … 2006 2006 } 2007 2007 2008 virtual void visit( ApplicationExpr * old ) override final {2008 virtual void visit( const ApplicationExpr * old ) override final { 2009 2009 this->node = visitBaseExpr( old, 2010 2010 new ast::ApplicationExpr( … … 2016 2016 } 2017 2017 2018 virtual void visit( UntypedExpr * old ) override final {2018 virtual void visit( const UntypedExpr * old ) override final { 2019 2019 this->node = visitBaseExpr( old, 2020 2020 new ast::UntypedExpr( … … 2026 2026 } 2027 2027 2028 virtual void visit( NameExpr * old ) override final {2028 virtual void visit( const NameExpr * old ) override final { 2029 2029 this->node = visitBaseExpr( old, 2030 2030 new ast::NameExpr( … … 2035 2035 } 2036 2036 2037 virtual void visit( CastExpr * old ) override final {2037 virtual void visit( const CastExpr * old ) override final { 2038 2038 this->node = visitBaseExpr( old, 2039 2039 new ast::CastExpr( … … 2045 2045 } 2046 2046 2047 virtual void visit( KeywordCastExpr * old) override final {2047 virtual void visit( const 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( VirtualCastExpr * old ) override final {2072 virtual void visit( const VirtualCastExpr * old ) override final { 2073 2073 this->node = visitBaseExpr_SkipResultType( old, 2074 2074 new ast::VirtualCastExpr( … … 2080 2080 } 2081 2081 2082 virtual void visit( AddressExpr * old ) override final {2082 virtual void visit( const AddressExpr * old ) override final { 2083 2083 this->node = visitBaseExpr( old, 2084 2084 new ast::AddressExpr( … … 2089 2089 } 2090 2090 2091 virtual void visit( LabelAddressExpr * old ) override final {2091 virtual void visit( const LabelAddressExpr * old ) override final { 2092 2092 this->node = visitBaseExpr( old, 2093 2093 new ast::LabelAddressExpr( … … 2098 2098 } 2099 2099 2100 virtual void visit( UntypedMemberExpr * old ) override final {2100 virtual void visit( const UntypedMemberExpr * old ) override final { 2101 2101 this->node = visitBaseExpr( old, 2102 2102 new ast::UntypedMemberExpr( … … 2108 2108 } 2109 2109 2110 virtual void visit( MemberExpr * old ) override final {2110 virtual void visit( const MemberExpr * old ) override final { 2111 2111 this->node = visitBaseExpr( old, 2112 2112 new ast::MemberExpr( … … 2118 2118 } 2119 2119 2120 virtual void visit( VariableExpr * old ) override final {2120 virtual void visit( const VariableExpr * old ) override final { 2121 2121 auto expr = new ast::VariableExpr( 2122 2122 old->location … … 2129 2129 } 2130 2130 2131 virtual void visit( ConstantExpr * old ) override final {2131 virtual void visit( const 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. get_value(),2135 old->constant.rep, 2136 2136 old->constant.ival 2137 2137 ); 2138 rslt->underlyer = getAccept1< ast::Type, Type* >( old->constant. get_type());2138 rslt->underlyer = getAccept1< ast::Type, Type* >( old->constant.type ); 2139 2139 this->node = visitBaseExpr( old, rslt ); 2140 2140 } 2141 2141 2142 virtual void visit( SizeofExpr * old ) override final {2142 virtual void visit( const 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( AlignofExpr * old ) override final {2163 virtual void visit( const 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( UntypedOffsetofExpr * old ) override final {2184 virtual void visit( const UntypedOffsetofExpr * old ) override final { 2185 2185 this->node = visitBaseExpr( old, 2186 2186 new ast::UntypedOffsetofExpr( … … 2192 2192 } 2193 2193 2194 virtual void visit( OffsetofExpr * old ) override final {2194 virtual void visit( const OffsetofExpr * old ) override final { 2195 2195 this->node = visitBaseExpr( old, 2196 2196 new ast::OffsetofExpr( … … 2202 2202 } 2203 2203 2204 virtual void visit( OffsetPackExpr * old ) override final {2204 virtual void visit( const OffsetPackExpr * old ) override final { 2205 2205 this->node = visitBaseExpr( old, 2206 2206 new ast::OffsetPackExpr( … … 2211 2211 } 2212 2212 2213 virtual void visit( LogicalExpr * old ) override final {2213 virtual void visit( const LogicalExpr * old ) override final { 2214 2214 this->node = visitBaseExpr( old, 2215 2215 new ast::LogicalExpr( … … 2224 2224 } 2225 2225 2226 virtual void visit( ConditionalExpr * old ) override final {2226 virtual void visit( const ConditionalExpr * old ) override final { 2227 2227 this->node = visitBaseExpr( old, 2228 2228 new ast::ConditionalExpr( … … 2235 2235 } 2236 2236 2237 virtual void visit( CommaExpr * old ) override final {2237 virtual void visit( const CommaExpr * old ) override final { 2238 2238 this->node = visitBaseExpr( old, 2239 2239 new ast::CommaExpr( … … 2245 2245 } 2246 2246 2247 virtual void visit( TypeExpr * old ) override final {2247 virtual void visit( const TypeExpr * old ) override final { 2248 2248 this->node = visitBaseExpr( old, 2249 2249 new ast::TypeExpr( … … 2254 2254 } 2255 2255 2256 virtual void visit( AsmExpr * old ) override final {2256 virtual void visit( const AsmExpr * old ) override final { 2257 2257 this->node = visitBaseExpr( old, 2258 2258 new ast::AsmExpr( … … 2265 2265 } 2266 2266 2267 virtual void visit( ImplicitCopyCtorExpr * old ) override final {2267 virtual void visit( const ImplicitCopyCtorExpr * old ) override final { 2268 2268 auto rslt = new ast::ImplicitCopyCtorExpr( 2269 2269 old->location, … … 2274 2274 } 2275 2275 2276 virtual void visit( ConstructorExpr * old ) override final {2276 virtual void visit( const ConstructorExpr * old ) override final { 2277 2277 this->node = visitBaseExpr( old, 2278 2278 new ast::ConstructorExpr( … … 2283 2283 } 2284 2284 2285 virtual void visit( CompoundLiteralExpr * old ) override final {2285 virtual void visit( const CompoundLiteralExpr * old ) override final { 2286 2286 this->node = visitBaseExpr_SkipResultType( old, 2287 2287 new ast::CompoundLiteralExpr( … … 2293 2293 } 2294 2294 2295 virtual void visit( RangeExpr * old ) override final {2295 virtual void visit( const RangeExpr * old ) override final { 2296 2296 this->node = visitBaseExpr( old, 2297 2297 new ast::RangeExpr( … … 2303 2303 } 2304 2304 2305 virtual void visit( UntypedTupleExpr * old ) override final {2305 virtual void visit( const UntypedTupleExpr * old ) override final { 2306 2306 this->node = visitBaseExpr( old, 2307 2307 new ast::UntypedTupleExpr( … … 2312 2312 } 2313 2313 2314 virtual void visit( TupleExpr * old ) override final {2314 virtual void visit( const TupleExpr * old ) override final { 2315 2315 this->node = visitBaseExpr( old, 2316 2316 new ast::TupleExpr( … … 2321 2321 } 2322 2322 2323 virtual void visit( TupleIndexExpr * old ) override final {2323 virtual void visit( const TupleIndexExpr * old ) override final { 2324 2324 this->node = visitBaseExpr( old, 2325 2325 new ast::TupleIndexExpr( … … 2331 2331 } 2332 2332 2333 virtual void visit( TupleAssignExpr * old ) override final {2333 virtual void visit( const TupleAssignExpr * old ) override final { 2334 2334 this->node = visitBaseExpr_SkipResultType( old, 2335 2335 new ast::TupleAssignExpr( … … 2341 2341 } 2342 2342 2343 virtual void visit( StmtExpr * old ) override final {2343 virtual void visit( const StmtExpr * old ) override final { 2344 2344 auto rslt = new ast::StmtExpr( 2345 2345 old->location, … … 2352 2352 } 2353 2353 2354 virtual void visit( UniqueExpr * old ) override final {2354 virtual void visit( const UniqueExpr * old ) override final { 2355 2355 auto rslt = new ast::UniqueExpr( 2356 2356 old->location, … … 2364 2364 } 2365 2365 2366 virtual void visit( UntypedInitExpr * old ) override final {2366 virtual void visit( const 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( InitExpr * old ) override final {2383 virtual void visit( const InitExpr * old ) override final { 2384 2384 this->node = visitBaseExpr( old, 2385 2385 new ast::InitExpr( … … 2391 2391 } 2392 2392 2393 virtual void visit( DeletedExpr * old ) override final {2393 virtual void visit( const DeletedExpr * old ) override final { 2394 2394 this->node = visitBaseExpr( old, 2395 2395 new ast::DeletedExpr( … … 2403 2403 } 2404 2404 2405 virtual void visit( DefaultArgExpr * old ) override final {2405 virtual void visit( const DefaultArgExpr * old ) override final { 2406 2406 this->node = visitBaseExpr( old, 2407 2407 new ast::DefaultArgExpr( … … 2412 2412 } 2413 2413 2414 virtual void visit( GenericExpr * old ) override final {2414 virtual void visit( const 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( Type * old, ast::Type * type ) {2431 void visitType( const 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( VoidType * old ) override final {2439 virtual void visit( const VoidType * old ) override final { 2440 2440 visitType( old, new ast::VoidType{ cv( old ) } ); 2441 2441 } 2442 2442 2443 virtual void visit( BasicType * old ) override final {2443 virtual void visit( const 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( PointerType * old ) override final {2452 virtual void visit( const 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( ArrayType * old ) override final {2462 virtual void visit( const 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( ReferenceType * old ) override final {2472 virtual void visit( const 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( QualifiedType * old ) override final {2479 virtual void visit( const 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( FunctionType * old ) override final {2487 virtual void visit( const FunctionType * old ) override final { 2488 2488 auto ty = new ast::FunctionType { 2489 2489 (ast::ArgumentFlag)old->isVarArgs, … … 2496 2496 } 2497 2497 2498 void postvisit( ReferenceToType * old, ast::ReferenceToType * ty ) {2498 void postvisit( const 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( StructInstType * old ) override final {2505 virtual void visit( const StructInstType * old ) override final { 2506 2506 ast::StructInstType * ty; 2507 2507 if ( old->baseStruct ) { … … 2521 2521 } 2522 2522 2523 virtual void visit( UnionInstType * old ) override final {2523 virtual void visit( const UnionInstType * old ) override final { 2524 2524 ast::UnionInstType * ty; 2525 2525 if ( old->baseUnion ) { … … 2539 2539 } 2540 2540 2541 virtual void visit( EnumInstType * old ) override final {2541 virtual void visit( const EnumInstType * old ) override final { 2542 2542 ast::EnumInstType * ty; 2543 2543 if ( old->baseEnum ) { … … 2557 2557 } 2558 2558 2559 virtual void visit( TraitInstType * old ) override final {2559 virtual void visit( const TraitInstType * old ) override final { 2560 2560 ast::TraitInstType * ty; 2561 2561 if ( old->baseTrait ) { … … 2575 2575 } 2576 2576 2577 virtual void visit( TypeInstType * old ) override final {2577 virtual void visit( const TypeInstType * old ) override final { 2578 2578 ast::TypeInstType * ty; 2579 2579 if ( old->baseType ) { … … 2595 2595 } 2596 2596 2597 virtual void visit( TupleType * old ) override final {2597 virtual void visit( const 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( TypeofType * old ) override final {2605 virtual void visit( const 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( AttrType * ) override final {2613 virtual void visit( const AttrType * ) override final { 2614 2614 assertf( false, "AttrType deprecated in new AST." ); 2615 2615 } 2616 2616 2617 virtual void visit( VarArgsType * old ) override final {2617 virtual void visit( const VarArgsType * old ) override final { 2618 2618 visitType( old, new ast::VarArgsType{ cv( old ) } ); 2619 2619 } 2620 2620 2621 virtual void visit( ZeroType * old ) override final {2621 virtual void visit( const ZeroType * old ) override final { 2622 2622 visitType( old, new ast::ZeroType{ cv( old ) } ); 2623 2623 } 2624 2624 2625 virtual void visit( OneType * old ) override final {2625 virtual void visit( const OneType * old ) override final { 2626 2626 visitType( old, new ast::OneType{ cv( old ) } ); 2627 2627 } 2628 2628 2629 virtual void visit( GlobalScopeType * old ) override final {2629 virtual void visit( const GlobalScopeType * old ) override final { 2630 2630 visitType( old, new ast::GlobalScopeType{} ); 2631 2631 } 2632 2632 2633 virtual void visit( Designation * old ) override final {2633 virtual void visit( const Designation * old ) override final { 2634 2634 this->node = new ast::Designation( 2635 2635 old->location, … … 2638 2638 } 2639 2639 2640 virtual void visit( SingleInit * old ) override final {2640 virtual void visit( const SingleInit * old ) override final { 2641 2641 this->node = new ast::SingleInit( 2642 2642 old->location, … … 2646 2646 } 2647 2647 2648 virtual void visit( ListInit * old ) override final {2648 virtual void visit( const ListInit * old ) override final { 2649 2649 this->node = new ast::ListInit( 2650 2650 old->location, … … 2655 2655 } 2656 2656 2657 virtual void visit( ConstructorInit * old ) override final {2657 virtual void visit( const ConstructorInit * old ) override final { 2658 2658 this->node = new ast::ConstructorInit( 2659 2659 old->location, … … 2664 2664 } 2665 2665 2666 virtual void visit( Constant * ) override final {2666 virtual void visit( const 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( Attribute * old ) override final {2672 virtual void visit( const Attribute * old ) override final { 2673 2673 this->node = new ast::Attribute( 2674 2674 old->name, … … 2677 2677 } 2678 2678 2679 virtual void visit( AttrExpr * ) override final {2679 virtual void visit( const AttrExpr * ) override final { 2680 2680 assertf( false, "AttrExpr deprecated in new AST." ); 2681 2681 } -
src/AST/Expr.hpp
r302d84c2 rfce4e31 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 (!"Cannot return to resnSlots from Params");114 case Params: assertf(false, "Cannot return to resnSlots from Params"); abort(); 115 115 } 116 return *((ResnSlots*)nullptr);117 116 } 118 117 … … 121 120 return data.resnSlots; 122 121 } 123 assert (!"Mode was not already resnSlots");124 return *((ResnSlots*)nullptr);122 assertf(false, "Mode was not already resnSlots"); 123 abort(); 125 124 } 126 125 … … 131 130 case Params: return data.inferParams; 132 131 } 133 assert(!"unreachable"); 134 return *((InferredParams*)nullptr); 132 assertf(false, "unreachable"); 135 133 } 136 134 … … 139 137 return data.inferParams; 140 138 } 141 assert (!"Mode was not already Params");142 return *((InferredParams*)nullptr);139 assertf(false, "Mode was not already Params"); 140 abort(); 143 141 } 144 142 145 143 void set_inferParams( InferredParams && ps ) { 146 144 switch(mode) { 147 case Slots: 145 case Slots: 148 146 data.resnSlots.~ResnSlots(); 149 147 // fallthrough 150 case Empty: 148 case Empty: 151 149 new(&data.inferParams) InferredParams{ std::move( ps ) }; 152 150 mode = Params; … … 172 170 data.inferParams[p.first] = std::move(p.second); 173 171 } 174 } else assert (!"invalid mode");172 } else assertf(false, "invalid mode"); 175 173 } 176 174 }; … … 384 382 385 383 ConstantExpr( 386 const CodeLocation & loc, const Type * ty, const std::string & r, 384 const CodeLocation & loc, const Type * ty, const std::string & r, 387 385 std::optional<unsigned long long> i ) 388 386 : Expr( loc, ty ), rep( r ), ival( i ) {} -
src/Common/PassVisitor.h
r302d84c2 rfce4e31 60 60 61 61 virtual void visit( ObjectDecl * objectDecl ) override final; 62 virtual void visit( const ObjectDecl * objectDecl ) override final; 62 63 virtual void visit( FunctionDecl * functionDecl ) override final; 64 virtual void visit( const FunctionDecl * functionDecl ) override final; 63 65 virtual void visit( StructDecl * aggregateDecl ) override final; 66 virtual void visit( const StructDecl * aggregateDecl ) override final; 64 67 virtual void visit( UnionDecl * aggregateDecl ) override final; 68 virtual void visit( const UnionDecl * aggregateDecl ) override final; 65 69 virtual void visit( EnumDecl * aggregateDecl ) override final; 70 virtual void visit( const EnumDecl * aggregateDecl ) override final; 66 71 virtual void visit( TraitDecl * aggregateDecl ) override final; 72 virtual void visit( const TraitDecl * aggregateDecl ) override final; 67 73 virtual void visit( TypeDecl * typeDecl ) override final; 74 virtual void visit( const TypeDecl * typeDecl ) override final; 68 75 virtual void visit( TypedefDecl * typeDecl ) override final; 76 virtual void visit( const TypedefDecl * typeDecl ) override final; 69 77 virtual void visit( AsmDecl * asmDecl ) override final; 78 virtual void visit( const AsmDecl * asmDecl ) override final; 70 79 virtual void visit( StaticAssertDecl * assertDecl ) override final; 80 virtual void visit( const StaticAssertDecl * assertDecl ) override final; 71 81 72 82 virtual void visit( CompoundStmt * compoundStmt ) override final; 83 virtual void visit( const CompoundStmt * compoundStmt ) override final; 73 84 virtual void visit( ExprStmt * exprStmt ) override final; 85 virtual void visit( const ExprStmt * exprStmt ) override final; 74 86 virtual void visit( AsmStmt * asmStmt ) override final; 87 virtual void visit( const AsmStmt * asmStmt ) override final; 75 88 virtual void visit( DirectiveStmt * dirStmt ) override final; 89 virtual void visit( const DirectiveStmt * dirStmt ) override final; 76 90 virtual void visit( IfStmt * ifStmt ) override final; 91 virtual void visit( const IfStmt * ifStmt ) override final; 77 92 virtual void visit( WhileStmt * whileStmt ) override final; 93 virtual void visit( const WhileStmt * whileStmt ) override final; 78 94 virtual void visit( ForStmt * forStmt ) override final; 95 virtual void visit( const ForStmt * forStmt ) override final; 79 96 virtual void visit( SwitchStmt * switchStmt ) override final; 97 virtual void visit( const SwitchStmt * switchStmt ) override final; 80 98 virtual void visit( CaseStmt * caseStmt ) override final; 99 virtual void visit( const CaseStmt * caseStmt ) override final; 81 100 virtual void visit( BranchStmt * branchStmt ) override final; 101 virtual void visit( const BranchStmt * branchStmt ) override final; 82 102 virtual void visit( ReturnStmt * returnStmt ) override final; 103 virtual void visit( const ReturnStmt * returnStmt ) override final; 83 104 virtual void visit( ThrowStmt * throwStmt ) override final; 105 virtual void visit( const ThrowStmt * throwStmt ) override final; 84 106 virtual void visit( TryStmt * tryStmt ) override final; 107 virtual void visit( const TryStmt * tryStmt ) override final; 85 108 virtual void visit( CatchStmt * catchStmt ) override final; 109 virtual void visit( const CatchStmt * catchStmt ) override final; 86 110 virtual void visit( FinallyStmt * finallyStmt ) override final; 111 virtual void visit( const FinallyStmt * finallyStmt ) override final; 87 112 virtual void visit( WaitForStmt * waitforStmt ) override final; 113 virtual void visit( const WaitForStmt * waitforStmt ) override final; 88 114 virtual void visit( WithStmt * withStmt ) override final; 115 virtual void visit( const WithStmt * withStmt ) override final; 89 116 virtual void visit( NullStmt * nullStmt ) override final; 117 virtual void visit( const NullStmt * nullStmt ) override final; 90 118 virtual void visit( DeclStmt * declStmt ) override final; 119 virtual void visit( const DeclStmt * declStmt ) override final; 91 120 virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) override final; 121 virtual void visit( const ImplicitCtorDtorStmt * impCtorDtorStmt ) override final; 92 122 93 123 virtual void visit( ApplicationExpr * applicationExpr ) override final; 124 virtual void visit( const ApplicationExpr * applicationExpr ) override final; 94 125 virtual void visit( UntypedExpr * untypedExpr ) override final; 126 virtual void visit( const UntypedExpr * untypedExpr ) override final; 95 127 virtual void visit( NameExpr * nameExpr ) override final; 128 virtual void visit( const NameExpr * nameExpr ) override final; 96 129 virtual void visit( CastExpr * castExpr ) override final; 130 virtual void visit( const CastExpr * castExpr ) override final; 97 131 virtual void visit( KeywordCastExpr * castExpr ) override final; 132 virtual void visit( const KeywordCastExpr * castExpr ) override final; 98 133 virtual void visit( VirtualCastExpr * castExpr ) override final; 134 virtual void visit( const VirtualCastExpr * castExpr ) override final; 99 135 virtual void visit( AddressExpr * addressExpr ) override final; 136 virtual void visit( const AddressExpr * addressExpr ) override final; 100 137 virtual void visit( LabelAddressExpr * labAddressExpr ) override final; 138 virtual void visit( const LabelAddressExpr * labAddressExpr ) override final; 101 139 virtual void visit( UntypedMemberExpr * memberExpr ) override final; 140 virtual void visit( const UntypedMemberExpr * memberExpr ) override final; 102 141 virtual void visit( MemberExpr * memberExpr ) override final; 142 virtual void visit( const MemberExpr * memberExpr ) override final; 103 143 virtual void visit( VariableExpr * variableExpr ) override final; 144 virtual void visit( const VariableExpr * variableExpr ) override final; 104 145 virtual void visit( ConstantExpr * constantExpr ) override final; 146 virtual void visit( const ConstantExpr * constantExpr ) override final; 105 147 virtual void visit( SizeofExpr * sizeofExpr ) override final; 148 virtual void visit( const SizeofExpr * sizeofExpr ) override final; 106 149 virtual void visit( AlignofExpr * alignofExpr ) override final; 150 virtual void visit( const AlignofExpr * alignofExpr ) override final; 107 151 virtual void visit( UntypedOffsetofExpr * offsetofExpr ) override final; 152 virtual void visit( const UntypedOffsetofExpr * offsetofExpr ) override final; 108 153 virtual void visit( OffsetofExpr * offsetofExpr ) override final; 154 virtual void visit( const OffsetofExpr * offsetofExpr ) override final; 109 155 virtual void visit( OffsetPackExpr * offsetPackExpr ) override final; 156 virtual void visit( const OffsetPackExpr * offsetPackExpr ) override final; 110 157 virtual void visit( AttrExpr * attrExpr ) override final; 158 virtual void visit( const AttrExpr * attrExpr ) override final; 111 159 virtual void visit( LogicalExpr * logicalExpr ) override final; 160 virtual void visit( const LogicalExpr * logicalExpr ) override final; 112 161 virtual void visit( ConditionalExpr * conditionalExpr ) override final; 162 virtual void visit( const ConditionalExpr * conditionalExpr ) override final; 113 163 virtual void visit( CommaExpr * commaExpr ) override final; 164 virtual void visit( const CommaExpr * commaExpr ) override final; 114 165 virtual void visit( TypeExpr * typeExpr ) override final; 166 virtual void visit( const TypeExpr * typeExpr ) override final; 115 167 virtual void visit( AsmExpr * asmExpr ) override final; 168 virtual void visit( const AsmExpr * asmExpr ) override final; 116 169 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override final; 170 virtual void visit( const ImplicitCopyCtorExpr * impCpCtorExpr ) override final; 117 171 virtual void visit( ConstructorExpr * ctorExpr ) override final; 172 virtual void visit( const ConstructorExpr * ctorExpr ) override final; 118 173 virtual void visit( CompoundLiteralExpr * compLitExpr ) override final; 174 virtual void visit( const CompoundLiteralExpr * compLitExpr ) override final; 119 175 virtual void visit( RangeExpr * rangeExpr ) override final; 176 virtual void visit( const RangeExpr * rangeExpr ) override final; 120 177 virtual void visit( UntypedTupleExpr * tupleExpr ) override final; 178 virtual void visit( const UntypedTupleExpr * tupleExpr ) override final; 121 179 virtual void visit( TupleExpr * tupleExpr ) override final; 180 virtual void visit( const TupleExpr * tupleExpr ) override final; 122 181 virtual void visit( TupleIndexExpr * tupleExpr ) override final; 182 virtual void visit( const TupleIndexExpr * tupleExpr ) override final; 123 183 virtual void visit( TupleAssignExpr * assignExpr ) override final; 184 virtual void visit( const TupleAssignExpr * assignExpr ) override final; 124 185 virtual void visit( StmtExpr * stmtExpr ) override final; 186 virtual void visit( const StmtExpr * stmtExpr ) override final; 125 187 virtual void visit( UniqueExpr * uniqueExpr ) override final; 188 virtual void visit( const UniqueExpr * uniqueExpr ) override final; 126 189 virtual void visit( UntypedInitExpr * initExpr ) override final; 190 virtual void visit( const UntypedInitExpr * initExpr ) override final; 127 191 virtual void visit( InitExpr * initExpr ) override final; 192 virtual void visit( const InitExpr * initExpr ) override final; 128 193 virtual void visit( DeletedExpr * delExpr ) override final; 194 virtual void visit( const DeletedExpr * delExpr ) override final; 129 195 virtual void visit( DefaultArgExpr * argExpr ) override final; 196 virtual void visit( const DefaultArgExpr * argExpr ) override final; 130 197 virtual void visit( GenericExpr * genExpr ) override final; 198 virtual void visit( const GenericExpr * genExpr ) override final; 131 199 132 200 virtual void visit( VoidType * basicType ) override final; 201 virtual void visit( const VoidType * basicType ) override final; 133 202 virtual void visit( BasicType * basicType ) override final; 203 virtual void visit( const BasicType * basicType ) override final; 134 204 virtual void visit( PointerType * pointerType ) override final; 205 virtual void visit( const PointerType * pointerType ) override final; 135 206 virtual void visit( ArrayType * arrayType ) override final; 207 virtual void visit( const ArrayType * arrayType ) override final; 136 208 virtual void visit( ReferenceType * referenceType ) override final; 209 virtual void visit( const ReferenceType * referenceType ) override final; 137 210 virtual void visit( QualifiedType * qualType ) override final; 211 virtual void visit( const QualifiedType * qualType ) override final; 138 212 virtual void visit( FunctionType * functionType ) override final; 213 virtual void visit( const FunctionType * functionType ) override final; 139 214 virtual void visit( StructInstType * aggregateUseType ) override final; 215 virtual void visit( const StructInstType * aggregateUseType ) override final; 140 216 virtual void visit( UnionInstType * aggregateUseType ) override final; 217 virtual void visit( const UnionInstType * aggregateUseType ) override final; 141 218 virtual void visit( EnumInstType * aggregateUseType ) override final; 219 virtual void visit( const EnumInstType * aggregateUseType ) override final; 142 220 virtual void visit( TraitInstType * aggregateUseType ) override final; 221 virtual void visit( const TraitInstType * aggregateUseType ) override final; 143 222 virtual void visit( TypeInstType * aggregateUseType ) override final; 223 virtual void visit( const TypeInstType * aggregateUseType ) override final; 144 224 virtual void visit( TupleType * tupleType ) override final; 225 virtual void visit( const TupleType * tupleType ) override final; 145 226 virtual void visit( TypeofType * typeofType ) override final; 227 virtual void visit( const TypeofType * typeofType ) override final; 146 228 virtual void visit( AttrType * attrType ) override final; 229 virtual void visit( const AttrType * attrType ) override final; 147 230 virtual void visit( VarArgsType * varArgsType ) override final; 231 virtual void visit( const VarArgsType * varArgsType ) override final; 148 232 virtual void visit( ZeroType * zeroType ) override final; 233 virtual void visit( const ZeroType * zeroType ) override final; 149 234 virtual void visit( OneType * oneType ) override final; 235 virtual void visit( const OneType * oneType ) override final; 150 236 virtual void visit( GlobalScopeType * globalType ) override final; 237 virtual void visit( const GlobalScopeType * globalType ) override final; 151 238 152 239 virtual void visit( Designation * designation ) override final; 240 virtual void visit( const Designation * designation ) override final; 153 241 virtual void visit( SingleInit * singleInit ) override final; 242 virtual void visit( const SingleInit * singleInit ) override final; 154 243 virtual void visit( ListInit * listInit ) override final; 244 virtual void visit( const ListInit * listInit ) override final; 155 245 virtual void visit( ConstructorInit * ctorInit ) override final; 246 virtual void visit( const ConstructorInit * ctorInit ) override final; 156 247 157 248 virtual void visit( Constant * constant ) override final; 249 virtual void visit( const Constant * constant ) override final; 158 250 159 251 virtual void visit( Attribute * attribute ) override final; 252 virtual void visit( const Attribute * attribute ) override final; 160 253 161 254 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override final; … … 265 358 266 359 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 ); 267 361 template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 268 362 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 ); 269 364 template< typename TreeType, typename pass_t > friend void maybeMutate_impl( TreeType *& tree, PassVisitor< pass_t > & mutator ); 270 365 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 ); 271 367 template< typename Container, typename pass_t > friend void maybeMutate_impl( Container & container, PassVisitor< pass_t > & mutator ); 272 368 273 369 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 ); } 274 371 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 ); } 275 373 276 374 template<typename node_type> void call_premutate ( node_type * node ) { premutate_impl( pass, node, 0 ); } … … 286 384 void visitStatementList ( std::list< Statement* > &statements ); 287 385 void mutateStatementList( std::list< Statement* > &statements ); 386 void visitStatementList ( const std::list< Statement * > & statements ); 288 387 289 388 template< typename func_t > … … 291 390 Statement * visitStatement ( Statement * stmt ); 292 391 Statement * mutateStatement( Statement * stmt ); 392 void visitStatement ( const Statement * stmt ); 293 393 294 394 template< typename func_t > … … 296 396 Expression * visitExpression ( Expression * expr ); 297 397 Expression * mutateExpression( Expression * expr ); 398 void visitExpression ( const Expression * expr ); 298 399 299 400 -
src/Common/PassVisitor.impl.h
r302d84c2 rfce4e31 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 declaration 91 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 > 82 104 inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 83 105 DeclList_t* beforeDecls = mutator.get_beforeDecls(); … … 117 139 } 118 140 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 119 149 template< typename Container, typename pass_type > 120 150 inline void maybeAccept_impl( Container & container, PassVisitor< pass_type > & visitor ) { … … 129 159 if ( *i ) { 130 160 (*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 ); 131 184 } 132 185 } catch( SemanticErrorException &e ) { … … 227 280 228 281 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 > 229 301 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 230 302 handleStatementList( statements, [this]( Statement *& stmt) { … … 275 347 276 348 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 CompoundStmt 353 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 > 277 359 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 278 360 return handleStatement( stmt, [this]( Statement * stmt ) { … … 306 388 307 389 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 > 308 403 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 309 404 return handleExpression(expr, [this]( Expression * expr ) { … … 315 410 template< typename TreeType, typename VisitorType > 316 411 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 ) { 317 422 if ( ! visitor.get_visit_children() ) return; 318 423 auto guard = makeFuncGuard( … … 372 477 373 478 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 ); 374 491 375 492 VISIT_END( node ); … … 428 545 429 546 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.2 553 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 nullptr 557 ); 558 maybeAccept_impl( node->type, *this ); 559 // function body needs to have the same scope as parameters - CompoundStmt will not enter 560 // a new scope if inFunction is true 561 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 > 430 571 DeclarationWithType * PassVisitor< pass_type >::mutate( FunctionDecl * node ) { 431 572 MUTATE_START( node ); … … 484 625 485 626 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 > 486 637 Declaration * PassVisitor< pass_type >::mutate( StructDecl * node ) { 487 638 MUTATE_START( node ); … … 522 673 VISIT_END( node ); 523 674 } 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 } 524 684 525 685 template< typename pass_type > … … 557 717 558 718 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 scope 723 maybeAccept_impl( node->parameters, *this ); 724 maybeAccept_impl( node->members , *this ); 725 726 VISIT_END( node ); 727 } 728 729 template< typename pass_type > 559 730 Declaration * PassVisitor< pass_type >::mutate( EnumDecl * node ) { 560 731 MUTATE_START( node ); … … 587 758 588 759 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 > 589 770 Declaration * PassVisitor< pass_type >::mutate( TraitDecl * node ) { 590 771 MUTATE_START( node ); … … 625 806 } 626 807 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 627 820 template< typename pass_type > 628 821 Declaration * PassVisitor< pass_type >::mutate( TypeDecl * node ) { … … 667 860 668 861 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 > 669 873 Declaration * PassVisitor< pass_type >::mutate( TypedefDecl * node ) { 670 874 MUTATE_START( node ); … … 695 899 696 900 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 > 697 910 AsmDecl * PassVisitor< pass_type >::mutate( AsmDecl * node ) { 698 911 MUTATE_START( node ); … … 710 923 711 924 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 ); 712 935 maybeAccept_impl( node->message, *this ); 713 936 … … 742 965 743 966 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 assignment 971 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 > 744 981 CompoundStmt * PassVisitor< pass_type >::mutate( CompoundStmt * node ) { 745 982 MUTATE_START( node ); … … 767 1004 768 1005 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 > 769 1015 Statement * PassVisitor< pass_type >::mutate( ExprStmt * node ) { 770 1016 MUTATE_START( node ); … … 790 1036 791 1037 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 > 792 1050 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 793 1051 MUTATE_START( node ); … … 811 1069 812 1070 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 > 813 1078 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) { 814 1079 MUTATE_START( node ); … … 825 1090 // if statements introduce a level of scope (for the initialization) 826 1091 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 827 maybeAccept_impl( node-> get_initialization(), *this );1092 maybeAccept_impl( node->initialization, *this ); 828 1093 visitExpression ( node->condition ); 829 1094 node->thenPart = visitStatement( node->thenPart ); … … 834 1099 835 1100 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 > 836 1113 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) { 837 1114 MUTATE_START( node ); … … 839 1116 // if statements introduce a level of scope (for the initialization) 840 1117 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 841 maybeMutate_impl( node-> get_initialization(), *this );1118 maybeMutate_impl( node->initialization, *this ); 842 1119 node->condition = mutateExpression( node->condition ); 843 1120 node->thenPart = mutateStatement ( node->thenPart ); … … 860 1137 node->body = visitStatement( node->body ); 861 1138 } 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 ); 862 1150 863 1151 VISIT_END( node ); … … 897 1185 898 1186 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 > 899 1199 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) { 900 1200 MUTATE_START( node ); … … 923 1223 924 1224 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 > 925 1235 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) { 926 1236 MUTATE_START( node ); … … 945 1255 946 1256 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 > 947 1267 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) { 948 1268 MUTATE_START( node ); … … 963 1283 964 1284 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 > 965 1291 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 966 1292 MUTATE_START( node ); … … 980 1306 981 1307 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 > 982 1317 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 983 1318 MUTATE_START( node ); … … 990 1325 //-------------------------------------------------------------------------- 991 1326 // ThrowStmt 992 993 1327 template< typename pass_type > 994 1328 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { … … 1002 1336 1003 1337 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 > 1004 1348 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 1005 1349 MUTATE_START( node ); … … 1015 1359 template< typename pass_type > 1016 1360 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 ) { 1017 1372 VISIT_START( node ); 1018 1373 … … 1051 1406 1052 1407 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 > 1053 1419 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) { 1054 1420 MUTATE_START( node ); … … 1075 1441 1076 1442 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 > 1077 1452 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 1078 1453 MUTATE_START( node ); … … 1107 1482 1108 1483 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 > 1109 1505 Statement * PassVisitor< pass_type >::mutate( WaitForStmt * node ) { 1110 1506 MUTATE_START( node ); … … 1130 1526 1131 1527 //-------------------------------------------------------------------------- 1132 // NullStmt1528 // WithStmt 1133 1529 template< typename pass_type > 1134 1530 void PassVisitor< pass_type >::visit( WithStmt * node ) { … … 1145 1541 1146 1542 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 > 1147 1553 Statement * PassVisitor< pass_type >::mutate( WithStmt * node ) { 1148 1554 MUTATE_START( node ); … … 1166 1572 1167 1573 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 > 1168 1580 NullStmt * PassVisitor< pass_type >::mutate( NullStmt * node ) { 1169 1581 MUTATE_START( node ); … … 1183 1595 1184 1596 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 > 1185 1606 Statement * PassVisitor< pass_type >::mutate( DeclStmt * node ) { 1186 1607 MUTATE_START( node ); … … 1195 1616 template< typename pass_type > 1196 1617 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 ) { 1197 1627 VISIT_START( node ); 1198 1628 … … 1220 1650 maybeAccept_impl ( node->function, *this ); 1221 1651 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 ); 1222 1663 1223 1664 VISIT_END( node ); … … 1253 1694 1254 1695 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 > 1255 1709 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 1256 1710 MUTATE_START( node ); … … 1278 1732 1279 1733 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 > 1280 1743 Expression * PassVisitor< pass_type >::mutate( NameExpr * node ) { 1281 1744 MUTATE_START( node ); … … 1295 1758 indexerScopedAccept( node->result, *this ); 1296 1759 maybeAccept_impl ( node->arg , *this ); 1760 1761 VISIT_END( node ); 1762 } 1763 1764 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 ); 1297 1770 1298 1771 VISIT_END( node ); … … 1323 1796 1324 1797 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 > 1325 1808 Expression * PassVisitor< pass_type >::mutate( KeywordCastExpr * node ) { 1326 1809 MUTATE_START( node ); … … 1346 1829 1347 1830 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 > 1348 1841 Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) { 1349 1842 MUTATE_START( node ); … … 1369 1862 1370 1863 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 > 1371 1874 Expression * PassVisitor< pass_type >::mutate( AddressExpr * node ) { 1372 1875 MUTATE_START( node ); … … 1391 1894 1392 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 1901 VISIT_END( node ); 1902 } 1903 1904 template< typename pass_type > 1393 1905 Expression * PassVisitor< pass_type >::mutate( LabelAddressExpr * node ) { 1394 1906 MUTATE_START( node ); … … 1409 1921 maybeAccept_impl ( node->aggregate, *this ); 1410 1922 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 ); 1411 1934 1412 1935 VISIT_END( node ); … … 1438 1961 1439 1962 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 > 1440 1973 Expression * PassVisitor< pass_type >::mutate( MemberExpr * node ) { 1441 1974 MUTATE_START( node ); … … 1460 1993 1461 1994 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 > 1462 2004 Expression * PassVisitor< pass_type >::mutate( VariableExpr * node ) { 1463 2005 MUTATE_START( node ); … … 1477 2019 indexerScopedAccept( node->result , *this ); 1478 2020 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 ); 1479 2031 1480 2032 VISIT_END( node ); … … 1501 2053 1502 2054 indexerScopedAccept( node->result, *this ); 2055 if ( node->get_isType() ) { 2056 maybeAccept_impl( node->type, *this ); 2057 } else { 2058 maybeAccept_impl( node->expr, *this ); 2059 } 2060 2061 VISIT_END( node ); 2062 } 2063 2064 template< typename pass_type > 2065 void PassVisitor< pass_type >::visit( const SizeofExpr * node ) { 2066 VISIT_START( node ); 2067 2068 maybeAccept_impl( node->result, *this ); 1503 2069 if ( node->get_isType() ) { 1504 2070 maybeAccept_impl( node->type, *this ); … … 1542 2108 1543 2109 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 > 1544 2124 Expression * PassVisitor< pass_type >::mutate( AlignofExpr * node ) { 1545 2125 MUTATE_START( node ); … … 1569 2149 1570 2150 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 > 1571 2161 Expression * PassVisitor< pass_type >::mutate( UntypedOffsetofExpr * node ) { 1572 2162 MUTATE_START( node ); … … 1592 2182 1593 2183 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 > 1594 2194 Expression * PassVisitor< pass_type >::mutate( OffsetofExpr * node ) { 1595 2195 MUTATE_START( node ); … … 1615 2215 1616 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 2223 VISIT_END( node ); 2224 } 2225 2226 template< typename pass_type > 1617 2227 Expression * PassVisitor< pass_type >::mutate( OffsetPackExpr * node ) { 1618 2228 MUTATE_START( node ); … … 1632 2242 1633 2243 indexerScopedAccept( node->result, *this ); 2244 if ( node->get_isType() ) { 2245 maybeAccept_impl( node->type, *this ); 2246 } else { 2247 maybeAccept_impl( node->expr, *this ); 2248 } 2249 2250 VISIT_END( node ); 2251 } 2252 2253 template< typename pass_type > 2254 void PassVisitor< pass_type >::visit( const AttrExpr * node ) { 2255 VISIT_START( node ); 2256 2257 maybeAccept_impl( node->result, *this ); 1634 2258 if ( node->get_isType() ) { 1635 2259 maybeAccept_impl( node->type, *this ); … … 1670 2294 1671 2295 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 > 1672 2307 Expression * PassVisitor< pass_type >::mutate( LogicalExpr * node ) { 1673 2308 MUTATE_START( node ); … … 1691 2326 maybeAccept_impl ( node->arg2 , *this ); 1692 2327 maybeAccept_impl ( node->arg3 , *this ); 2328 2329 VISIT_END( node ); 2330 } 2331 2332 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 ); 1693 2340 1694 2341 VISIT_END( node ); … … 1722 2369 1723 2370 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 > 1724 2382 Expression * PassVisitor< pass_type >::mutate( CommaExpr * node ) { 1725 2383 MUTATE_START( node ); … … 1746 2404 1747 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 2412 VISIT_END( node ); 2413 } 2414 2415 template< typename pass_type > 1748 2416 Expression * PassVisitor< pass_type >::mutate( TypeExpr * node ) { 1749 2417 MUTATE_START( node ); … … 1766 2434 maybeAccept_impl ( node->constraint, *this ); 1767 2435 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 ); 1768 2448 1769 2449 VISIT_END( node ); … … 1796 2476 1797 2477 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 > 1798 2488 Expression * PassVisitor< pass_type >::mutate( ImplicitCopyCtorExpr * node ) { 1799 2489 MUTATE_START( node ); … … 1819 2509 1820 2510 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 > 1821 2521 Expression * PassVisitor< pass_type >::mutate( ConstructorExpr * node ) { 1822 2522 MUTATE_START( node ); … … 1842 2542 1843 2543 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 > 1844 2554 Expression * PassVisitor< pass_type >::mutate( CompoundLiteralExpr * node ) { 1845 2555 MUTATE_START( node ); … … 1861 2571 maybeAccept_impl ( node->low , *this ); 1862 2572 maybeAccept_impl ( node->high , *this ); 2573 2574 VISIT_END( node ); 2575 } 2576 2577 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 ); 1863 2584 1864 2585 VISIT_END( node ); … … 1890 2611 1891 2612 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 > 1892 2623 Expression * PassVisitor< pass_type >::mutate( UntypedTupleExpr * node ) { 1893 2624 MUTATE_START( node ); … … 1913 2644 1914 2645 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 > 1915 2656 Expression * PassVisitor< pass_type >::mutate( TupleExpr * node ) { 1916 2657 MUTATE_START( node ); … … 1936 2677 1937 2678 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 > 1938 2689 Expression * PassVisitor< pass_type >::mutate( TupleIndexExpr * node ) { 1939 2690 MUTATE_START( node ); … … 1954 2705 indexerScopedAccept( node->result , *this ); 1955 2706 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 ); 1956 2717 1957 2718 VISIT_END( node ); … … 1989 2750 1990 2751 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 > 1991 2764 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) { 1992 2765 MUTATE_START( node ); … … 2018 2791 2019 2792 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 > 2020 2803 Expression * PassVisitor< pass_type >::mutate( UniqueExpr * node ) { 2021 2804 MUTATE_START( node ); … … 2036 2819 indexerScopedAccept( node->result, *this ); 2037 2820 maybeAccept_impl ( node->expr , *this ); 2821 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2822 2823 VISIT_END( node ); 2824 } 2825 2826 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 ); 2038 2832 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 2039 2833 … … 2067 2861 2068 2862 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 > 2069 2874 Expression * PassVisitor< pass_type >::mutate( InitExpr * node ) { 2070 2875 MUTATE_START( node ); … … 2092 2897 2093 2898 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 > 2094 2910 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2095 2911 MUTATE_START( node ); … … 2109 2925 2110 2926 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 ); 2111 2937 maybeAccept_impl( node->expr, *this ); 2112 2938 … … 2135 2961 for ( GenericExpr::Association & assoc : node->associations ) { 2136 2962 indexerScopedAccept( assoc.type, *this ); 2963 maybeAccept_impl( assoc.expr, *this ); 2964 } 2965 2966 VISIT_END( node ); 2967 } 2968 2969 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 ); 2137 2977 maybeAccept_impl( assoc.expr, *this ); 2138 2978 } … … 2168 3008 2169 3009 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 > 2170 3019 Type * PassVisitor< pass_type >::mutate( VoidType * node ) { 2171 3020 MUTATE_START( node ); … … 2180 3029 template< typename pass_type > 2181 3030 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 ) { 2182 3040 VISIT_START( node ); 2183 3041 … … 2210 3068 2211 3069 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 > 2212 3081 Type * PassVisitor< pass_type >::mutate( PointerType * node ) { 2213 3082 MUTATE_START( node ); … … 2234 3103 2235 3104 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 > 2236 3116 Type * PassVisitor< pass_type >::mutate( ArrayType * node ) { 2237 3117 MUTATE_START( node ); … … 2257 3137 2258 3138 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 > 2259 3149 Type * PassVisitor< pass_type >::mutate( ReferenceType * node ) { 2260 3150 MUTATE_START( node ); … … 2280 3170 2281 3171 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 > 2282 3183 Type * PassVisitor< pass_type >::mutate( QualifiedType * node ) { 2283 3184 MUTATE_START( node ); … … 2294 3195 template< typename pass_type > 2295 3196 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 ) { 2296 3208 VISIT_START( node ); 2297 3209 … … 2332 3244 2333 3245 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 > 2334 3256 Type * PassVisitor< pass_type >::mutate( StructInstType * node ) { 2335 3257 MUTATE_START( node ); … … 2364 3286 2365 3287 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 > 2366 3298 Type * PassVisitor< pass_type >::mutate( UnionInstType * node ) { 2367 3299 MUTATE_START( node ); … … 2391 3323 2392 3324 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 > 2393 3335 Type * PassVisitor< pass_type >::mutate( EnumInstType * node ) { 2394 3336 MUTATE_START( node ); … … 2413 3355 2414 3356 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 > 2415 3367 Type * PassVisitor< pass_type >::mutate( TraitInstType * node ) { 2416 3368 MUTATE_START( node ); … … 2426 3378 template< typename pass_type > 2427 3379 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 ) { 2428 3390 VISIT_START( node ); 2429 3391 … … 2458 3420 2459 3421 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 > 2460 3433 Type * PassVisitor< pass_type >::mutate( TupleType * node ) { 2461 3434 MUTATE_START( node ); … … 2472 3445 template< typename pass_type > 2473 3446 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 ) { 2474 3457 VISIT_START( node ); 2475 3458 … … 2508 3491 2509 3492 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 } // if 3503 3504 VISIT_END( node ); 3505 } 3506 3507 template< typename pass_type > 2510 3508 Type * PassVisitor< pass_type >::mutate( AttrType * node ) { 2511 3509 MUTATE_START( node ); … … 2534 3532 2535 3533 template< typename pass_type > 3534 void PassVisitor< pass_type >::visit( const VarArgsType * node ) { 3535 VISIT_START( node ); 3536 3537 maybeAccept_impl( node->forall, *this ); 3538 3539 VISIT_END( node ); 3540 } 3541 3542 template< typename pass_type > 2536 3543 Type * PassVisitor< pass_type >::mutate( VarArgsType * node ) { 2537 3544 MUTATE_START( node ); … … 2554 3561 2555 3562 template< typename pass_type > 3563 void PassVisitor< pass_type >::visit( const ZeroType * node ) { 3564 VISIT_START( node ); 3565 3566 maybeAccept_impl( node->forall, *this ); 3567 3568 VISIT_END( node ); 3569 } 3570 3571 template< typename pass_type > 2556 3572 Type * PassVisitor< pass_type >::mutate( ZeroType * node ) { 2557 3573 MUTATE_START( node ); … … 2574 3590 2575 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 > 2576 3601 Type * PassVisitor< pass_type >::mutate( OneType * node ) { 2577 3602 MUTATE_START( node ); … … 2594 3619 2595 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 > 2596 3630 Type * PassVisitor< pass_type >::mutate( GlobalScopeType * node ) { 2597 3631 MUTATE_START( node ); … … 2614 3648 2615 3649 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 > 2616 3659 Designation * PassVisitor< pass_type >::mutate( Designation * node ) { 2617 3660 MUTATE_START( node ); … … 2634 3677 2635 3678 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 > 2636 3688 Initializer * PassVisitor< pass_type >::mutate( SingleInit * node ) { 2637 3689 MUTATE_START( node ); … … 2646 3698 template< typename pass_type > 2647 3699 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 ) { 2648 3710 VISIT_START( node ); 2649 3711 … … 2678 3740 2679 3741 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 > 2680 3753 Initializer * PassVisitor< pass_type >::mutate( ConstructorInit * node ) { 2681 3754 MUTATE_START( node ); … … 2698 3771 2699 3772 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 > 2700 3780 Constant * PassVisitor< pass_type >::mutate( Constant * node ) { 2701 3781 MUTATE_START( node ); … … 2708 3788 template< typename pass_type > 2709 3789 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 ) { 2710 3799 VISIT_START( node ); 2711 3800 -
src/Common/PassVisitor.proto.h
r302d84c2 rfce4e31 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 120 137 //--------------------------------------------------------- 121 138 // Mutate … … 200 217 pass.indexer.func( arg ); \ 201 218 } \ 202 \ 203 template<typename pass_type> \ 204 static inline void indexer_impl_##func ( pass_type &, long, type ) { } \ 219 template<typename pass_type> \ 220 static inline void indexer_impl_##func ( pass_type &, long, type ) { } 205 221 206 222 #define INDEXER_FUNC2( func, type1, type2 ) \ … … 209 225 pass.indexer.func( arg1, arg2 ); \ 210 226 } \ 211 \212 227 template<typename pass_type> \ 213 228 static inline void indexer_impl_##func ( pass_type &, long, type1, type2 ) { } … … 233 248 234 249 template<typename pass_type> 235 static inline auto indexer_impl_addStructFwd( pass_type &, long, StructDecl * ) {}250 static inline auto indexer_impl_addStructFwd( pass_type &, long, const StructDecl * ) {} 236 251 237 252 template<typename pass_type> … … 243 258 244 259 template<typename pass_type> 245 static inline auto indexer_impl_addUnionFwd( pass_type &, long, UnionDecl * ) {}260 static inline auto indexer_impl_addUnionFwd( pass_type &, long, const UnionDecl * ) {} 246 261 247 262 template<typename pass_type> -
src/ResolvExpr/AdjustExprType.cc
r302d84c2 rfce4e31 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 ( NamedTypeDecl *ntDecl = indexer.lookupType( typeInst->get_name() ) ) {79 if ( TypeDecl *tyDecl = dynamic_cast< TypeDecl* >( ntDecl ) ) {78 } else if ( const NamedTypeDecl * ntDecl = indexer.lookupType( typeInst->get_name() ) ) { 79 if ( const TypeDecl * tyDecl = dynamic_cast< const 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
r302d84c2 rfce4e31 37 37 struct CastCost_old : public ConversionCost { 38 38 public: 39 CastCost_old( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc );39 CastCost_old( const 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( BasicType * basicType );44 void postvisit( PointerType * pointerType );43 void postvisit( const BasicType * basicType ); 44 void postvisit( const PointerType * pointerType ); 45 45 }; 46 46 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()) ) {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 ) ) { 50 50 if ( eqvClass->type ) { 51 51 return castCost( src, eqvClass->type, indexer, env ); … … 53 53 return Cost::infinity; 54 54 } 55 } else if ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->get_name()) ) {55 } else if ( const NamedTypeDecl * namedType = indexer.lookupType( destAsTypeInst->name ) ) { 56 56 // all typedefs should be gone by this point 57 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( namedType );57 const TypeDecl * type = strict_dynamic_cast< const 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< VoidType* >( dest ) ) {76 } else if ( dynamic_cast< const VoidType * >( dest ) ) { 77 77 return Cost::safe; 78 } else if ( ReferenceType * refType = dynamic_cast<ReferenceType * > ( dest ) ) {78 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 79 79 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 80 return convertToReferenceCost( src, refType, indexer, env, []( Type * t1,Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {80 return convertToReferenceCost( src, refType, indexer, env, [](const Type * t1, const 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 (*)( Type *,Type *, const SymTab::Indexer &, const TypeEnvironment & ))84 PassVisitor<CastCost_old> converter( 85 dest, indexer, env, 86 (Cost (*)( const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment & )) 87 87 castCost ); 88 88 src->accept( converter ); … … 96 96 } 97 97 98 CastCost_old::CastCost_old( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )98 CastCost_old::CastCost_old( const 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( BasicType *basicType ) {103 PointerType *destAsPointer = dynamic_cast< PointerType* >( dest );102 void CastCost_old::postvisit( const BasicType * basicType ) { 103 const PointerType * destAsPointer = dynamic_cast< const 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( 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 ) ) {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 ) ) { 115 115 cost = Cost::safe; 116 116 } else { … … 125 125 } // if 126 126 } // if 127 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {127 } else if ( const BasicType * destAsBasic = dynamic_cast< const 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
r302d84c2 rfce4e31 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-> get_qualifiers() <= t1->get_qualifiers()) && (widenSecond || t1->get_qualifiers() <= t2->get_qualifiers()) ) {82 if ( (widenFirst || t2->tq <= t1->tq) && (widenSecond || t1->tq <= t2->tq) ) { 83 83 PRINT( 84 84 std::cerr << "widen okay" << std::endl; 85 85 ) 86 common-> get_qualifiers() |= t1->get_qualifiers();87 common-> get_qualifiers() |= t2->get_qualifiers();86 common->tq |= t1->tq; 87 common->tq |= t2->tq; 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-> get_qualifiers(), result );129 result = new ReferenceType( ref1->tq, 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 ( TypeInstType *inst = dynamic_cast< TypeInstType* >( type2 ) ) {145 if ( NamedTypeDecl *nt = indexer.lookupType( inst->get_name() ) ) {146 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( nt );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 ); 147 147 if ( type->get_base() ) { 148 Type::Qualifiers tq1 = type1-> get_qualifiers(), tq2 = type2->get_qualifiers();148 Type::Qualifiers tq1 = type1->tq, tq2 = type2->tq; 149 149 AssertionSet have, need; 150 150 OpenVarSet newOpen( openVars ); 151 type1-> get_qualifiers()= Type::Qualifiers();152 type->get_base()-> get_qualifiers()= tq1;151 type1->tq = Type::Qualifiers(); 152 type->get_base()->tq = tq1; 153 153 if ( unifyExact( type1, type->get_base(), env, have, need, newOpen, indexer ) ) { 154 154 result = type1->clone(); 155 result-> get_qualifiers()= tq1 | tq2;155 result->tq = tq1 | tq2; 156 156 } // if 157 type1-> get_qualifiers()= tq1;158 type->get_base()-> get_qualifiers()= Type::Qualifiers();157 type1->tq = tq1; 158 type->get_base()->tq = 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-> 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 );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 ); 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-> 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 );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 ); 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-> get_qualifiers() |= otherPointer->get_qualifiers();520 } 521 522 void CommonType_old::postvisit( PointerType * pointerType ) {523 if ( PointerType * otherPointer = dynamic_cast< PointerType* >( type2 ) ) {519 result->tq |= otherPointer->tq; 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()-> get_qualifiers() >= otherPointer->get_base()->get_qualifiers()|| widenFirst )530 && ( pointerType->get_base()-> get_qualifiers() <= otherPointer->get_base()->get_qualifiers()|| widenSecond ) ) {529 } else if ( ( pointerType->get_base()->tq >= otherPointer->get_base()->tq || widenFirst ) 530 && ( pointerType->get_base()->tq <= otherPointer->get_base()->tq || widenSecond ) ) { 531 531 // std::cerr << "middle case" << std::endl; 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();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(); 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->get_qualifiers()= tq1 | tq2;544 strict_dynamic_cast<PointerType *>(result)->base->tq = tq1 | tq2; 545 545 } else { 546 546 /// std::cerr << "place for ptr-to-type" << std::endl; 547 547 } // if 548 pointerType->get_base()-> get_qualifiers()= tq1;549 otherPointer->get_base()-> get_qualifiers()= tq2;548 pointerType->get_base()->tq = tq1; 549 otherPointer->get_base()->tq = 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-> get_qualifiers() |= type2->get_qualifiers();553 result->tq |= type2->tq; 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()-> 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()) ) {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()) ) { 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()-> get_qualifiers() >= otherRef->get_base()->get_qualifiers()|| widenFirst )568 && ( refType->get_base()-> get_qualifiers() <= otherRef->get_base()->get_qualifiers()|| widenSecond ) ) {567 } else if ( ( refType->get_base()->tq >= otherRef->get_base()->tq || widenFirst ) 568 && ( refType->get_base()->tq <= otherRef->get_base()->tq || widenSecond ) ) { 569 569 // std::cerr << "middle case" << std::endl; 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();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(); 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->get_qualifiers()= tq1 | tq2;581 strict_dynamic_cast<ReferenceType *>(result)->base->tq = tq1 | tq2; 582 582 } else { 583 583 /// std::cerr << "place for ptr-to-type" << std::endl; 584 584 } // if 585 refType->get_base()-> get_qualifiers()= tq1;586 otherRef->get_base()-> get_qualifiers()= tq2;585 refType->get_base()->tq = tq1; 586 otherRef->get_base()->tq = 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-> get_qualifiers() |= type2->get_qualifiers();590 result->tq |= type2->tq; 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 NamedTypeDecl *nt = indexer.lookupType( inst->get_name() );610 const NamedTypeDecl * nt = indexer.lookupType( inst->get_name() ); 611 611 if ( nt ) { 612 TypeDecl *type = strict_dynamic_cast< TypeDecl* >( nt );612 const TypeDecl * type = strict_dynamic_cast< const TypeDecl * >( nt ); 613 613 if ( type->get_base() ) { 614 Type::Qualifiers tq1 = inst-> get_qualifiers(), tq2 = type2->get_qualifiers();614 Type::Qualifiers tq1 = inst->tq, tq2 = type2->tq; 615 615 AssertionSet have, need; 616 616 OpenVarSet newOpen( openVars ); 617 type2-> get_qualifiers()= Type::Qualifiers();618 type->get_base()-> get_qualifiers()= tq1;617 type2->tq = Type::Qualifiers(); 618 type->get_base()->tq = tq1; 619 619 if ( unifyExact( type->get_base(), type2, env, have, need, newOpen, indexer ) ) { 620 620 result = type2->clone(); 621 result-> get_qualifiers()= tq1 | tq2;621 result->tq = tq1 | tq2; 622 622 } // if 623 type2-> get_qualifiers()= tq2;624 type->get_base()-> get_qualifiers()= Type::Qualifiers();623 type2->tq = tq2; 624 type->get_base()->tq = 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-> get_qualifiers() <= type2->get_qualifiers()) {635 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< PointerType * >( type2 ) || dynamic_cast< EnumInstType * >( type2 ) ) { 636 if ( widenSecond || zeroType->tq <= type2->tq ) { 637 637 result = type2->clone(); 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 ) {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 ) { 648 648 if ( widenFirst ) { 649 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) {650 if ( widenSecond || oneType-> get_qualifiers() <= type2->get_qualifiers()) {649 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< EnumInstType * >( type2 ) ) { 650 if ( widenSecond || oneType->tq <= type2->tq ) { 651 651 result = type2->clone(); 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();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; 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
r302d84c2 rfce4e31 46 46 #endif 47 47 48 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {49 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) {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 ) ) { 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 ( NamedTypeDecl *namedType = indexer.lookupType( destAsTypeInst->name ) ) {57 } else if ( const NamedTypeDecl * namedType = indexer.lookupType( destAsTypeInst->name ) ) { 58 58 PRINT( std::cerr << " found" << std::endl; ) 59 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType );59 const TypeDecl * type = dynamic_cast< const 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< VoidType* >( dest ) ) {79 } else if ( dynamic_cast< const VoidType * >( dest ) ) { 80 80 return Cost::safe; 81 } else if ( ReferenceType * refType = dynamic_cast<ReferenceType * > ( dest ) ) {81 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 82 82 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 83 return convertToReferenceCost( src, refType, indexer, env, []( Type * t1,Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){83 return convertToReferenceCost( src, refType, indexer, env, [](const Type * const t1, const 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 (*)( Type*, Type*, const SymTab::Indexer&, const TypeEnvironment&))87 PassVisitor<ConversionCost> converter( 88 dest, indexer, env, 89 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 90 90 conversionCost ); 91 91 src->accept( converter ); … … 98 98 } 99 99 100 Cost convertToReferenceCost( Type * src,Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {100 Cost convertToReferenceCost( const Type * src, const 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< ReferenceType * >( src )->base, dest, diff-1, indexer, env, func );104 Cost cost = convertToReferenceCost( strict_dynamic_cast< const 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< ReferenceType * >( dest )->base, diff+1, indexer, env, func );109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< const ReferenceType * >( dest )->base, diff+1, indexer, env, func ); 110 110 cost.incReference(); 111 111 return cost; 112 112 } else if ( diff == 0 ) { 113 ReferenceType * srcAsRef = dynamic_cast<ReferenceType * >( src );114 ReferenceType * destAsRef = dynamic_cast<ReferenceType * >( dest );113 const ReferenceType * srcAsRef = dynamic_cast< const ReferenceType * >( src ); 114 const ReferenceType * destAsRef = dynamic_cast< const 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-> get_qualifiers();118 Type::Qualifiers tq2 = destAsRef->base-> get_qualifiers();117 Type::Qualifiers tq1 = srcAsRef->base->tq; 118 Type::Qualifiers tq2 = destAsRef->base->tq; 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 (*)( Type*, Type*, const SymTab::Indexer&, const TypeEnvironment&))139 PassVisitor<ConversionCost> converter( 140 dest, indexer, env, 141 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 142 142 conversionCost ); 143 143 src->accept( converter ); … … 145 145 } // if 146 146 } else { 147 ReferenceType * destAsRef = dynamic_cast<ReferenceType * >( dest );147 const ReferenceType * destAsRef = dynamic_cast< const 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-> get_qualifiers() == destAsRef->base->get_qualifiers()) {158 if ( src->tq == destAsRef->base->tq ) { 159 159 return Cost::reference; // cost needs to be non-zero to add cast 160 } if ( src-> get_qualifiers() < destAsRef->base->get_qualifiers()) {160 } if ( src->tq < destAsRef->base->tq ) { 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( Type * src,ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) {180 Cost convertToReferenceCost( const Type * src, const 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( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )187 ConversionCost::ConversionCost( const 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( VoidType * ) {311 void ConversionCost::postvisit( const VoidType * ) { 312 312 cost = Cost::infinity; 313 313 } 314 314 315 void ConversionCost::postvisit( BasicType *basicType) {316 if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) {317 int tableResult = costMatrix[ basicType-> get_kind() ][ destAsBasic->get_kind()];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 ]; 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-> get_kind() ][ destAsBasic->get_kind()] );324 } // if 325 } else if ( dynamic_cast< EnumInstType *>( dest ) ) {323 cost.incSign( signMatrix[ basicType->kind ][ destAsBasic->kind ] ); 324 } // if 325 } else if ( dynamic_cast< const 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( PointerType * pointerType ) {333 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) {332 void ConversionCost::postvisit( const PointerType * pointerType ) { 333 if ( const PointerType * destAsPtr = dynamic_cast< const PointerType * >( dest ) ) { 334 334 PRINT( std::cerr << pointerType << " ===> " << destAsPtr << std::endl; ) 335 Type::Qualifiers tq1 = pointerType->base-> get_qualifiers();336 Type::Qualifiers tq2 = destAsPtr->base-> get_qualifiers();335 Type::Qualifiers tq1 = pointerType->base->tq; 336 Type::Qualifiers tq2 = destAsPtr->base->tq; 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( ArrayType * ) {}366 367 void ConversionCost::postvisit( ReferenceType * refType ) {365 void ConversionCost::postvisit( const ArrayType * ) {} 366 367 void ConversionCost::postvisit( const 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< ReferenceType * >( dest ) );369 assert( ! dynamic_cast< const 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-> get_qualifiers() == dest->get_qualifiers()) {374 if ( refType->base->tq == dest->tq ) { 375 375 cost.incReference(); // prefer exact qualifiers 376 } else if ( refType->base-> get_qualifiers() < dest->get_qualifiers()) {376 } else if ( refType->base->tq < dest->tq ) { 377 377 cost.incSafe(); // then gaining qualifiers 378 378 } else { … … 382 382 } 383 383 384 void ConversionCost::postvisit( FunctionType * ) {}385 386 void ConversionCost::postvisit( StructInstType * inst ) {387 if ( StructInstType *destAsInst = dynamic_cast< StructInstType* >( dest ) ) {384 void ConversionCost::postvisit( const FunctionType * ) {} 385 386 void ConversionCost::postvisit( const StructInstType * inst ) { 387 if ( const StructInstType * destAsInst = dynamic_cast< const StructInstType * >( dest ) ) { 388 388 if ( inst->name == destAsInst->name ) { 389 389 cost = Cost::zero; … … 392 392 } 393 393 394 void ConversionCost::postvisit( UnionInstType * inst ) {395 if ( UnionInstType *destAsInst = dynamic_cast< UnionInstType* >( dest ) ) {394 void ConversionCost::postvisit( const UnionInstType * inst ) { 395 if ( const UnionInstType * destAsInst = dynamic_cast< const UnionInstType * >( dest ) ) { 396 396 if ( inst->name == destAsInst->name ) { 397 397 cost = Cost::zero; … … 400 400 } 401 401 402 void ConversionCost::postvisit( EnumInstType * ) {402 void ConversionCost::postvisit( const EnumInstType * ) { 403 403 static Type::Qualifiers q; 404 404 static BasicType integer( q, BasicType::SignedInt ); … … 409 409 } 410 410 411 void ConversionCost::postvisit( TraitInstType * ) {}412 413 void ConversionCost::postvisit( TypeInstType *inst ) {414 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) {411 void ConversionCost::postvisit( const TraitInstType * ) {} 412 413 void ConversionCost::postvisit( const TypeInstType * inst ) { 414 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) { 415 415 cost = costFunc( eqvClass->type, dest, indexer, env ); 416 } else if ( TypeInstType *destAsInst = dynamic_cast< TypeInstType* >( dest ) ) {416 } else if ( const TypeInstType * destAsInst = dynamic_cast< const TypeInstType * >( dest ) ) { 417 417 if ( inst->name == destAsInst->name ) { 418 418 cost = Cost::zero; 419 419 } 420 } else if ( NamedTypeDecl *namedType = indexer.lookupType( inst->name ) ) {421 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType );420 } else if ( const NamedTypeDecl * namedType = indexer.lookupType( inst->name ) ) { 421 const TypeDecl * type = dynamic_cast< const TypeDecl * >( namedType ); 422 422 // all typedefs should be gone by this point 423 423 assert( type ); … … 428 428 } 429 429 430 void ConversionCost::postvisit( TupleType * tupleType ) {430 void ConversionCost::postvisit( const TupleType * tupleType ) { 431 431 Cost c = Cost::zero; 432 if ( TupleType * destAsTuple = dynamic_cast<TupleType * >( dest ) ) {432 if ( const TupleType * destAsTuple = dynamic_cast< const 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( 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 conversions461 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic-> get_kind()];450 void ConversionCost::postvisit( const VarArgsType * ) { 451 if ( dynamic_cast< const VarArgsType * >( dest ) ) { 452 cost = Cost::zero; 453 } 454 } 455 456 void ConversionCost::postvisit( const ZeroType * ) { 457 if ( dynamic_cast< const ZeroType * >( 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 conversions 461 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->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-> get_kind()] );468 } // if 469 } else if ( dynamic_cast< PointerType* >( dest ) ) {467 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->kind ] ); 468 } // if 469 } else if ( dynamic_cast< const 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( 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 conversions480 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic-> get_kind()];475 void ConversionCost::postvisit( const OneType * ) { 476 if ( dynamic_cast< const OneType * >( 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 conversions 480 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->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-> get_kind()] );486 cost.incSign( signMatrix[ BasicType::SignedInt ][ destAsBasic->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
r302d84c2 rfce4e31 33 33 class TypeEnvironment; 34 34 35 typedef std::function<Cost( Type *,Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction;35 typedef std::function<Cost(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 36 36 struct ConversionCost : public WithShortCircuiting { 37 37 public: 38 ConversionCost( Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction );38 ConversionCost( const 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( BaseSyntaxNode * ) { visit_children = false; }42 void previsit( const BaseSyntaxNode * ) { visit_children = false; } 43 43 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 );44 void postvisit( const VoidType * voidType ); 45 void postvisit( const BasicType * basicType ); 46 void postvisit( const PointerType * pointerType ); 47 void postvisit( const ArrayType * arrayType ); 48 void postvisit( const ReferenceType * refType ); 49 void postvisit( const FunctionType * functionType ); 50 void postvisit( const StructInstType * aggregateUseType ); 51 void postvisit( const UnionInstType * aggregateUseType ); 52 void postvisit( const EnumInstType * aggregateUseType ); 53 void postvisit( const TraitInstType * aggregateUseType ); 54 void postvisit( const TypeInstType * aggregateUseType ); 55 void postvisit( const TupleType * tupleType ); 56 void postvisit( const VarArgsType * varArgsType ); 57 void postvisit( const ZeroType * zeroType ); 58 void postvisit( const OneType * oneType ); 59 59 protected: 60 Type *dest;60 const Type * dest; 61 61 const SymTab::Indexer &indexer; 62 62 Cost cost; … … 65 65 }; 66 66 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 );67 typedef std::function<int(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction; 68 Cost convertToReferenceCost( const Type * src, const 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
r302d84c2 rfce4e31 27 27 namespace ResolvExpr { 28 28 struct PtrsAssignable : public WithShortCircuiting { 29 PtrsAssignable( Type *dest, const TypeEnvironment &env );29 PtrsAssignable( const Type * dest, const TypeEnvironment &env ); 30 30 31 31 int get_result() const { return result; } 32 32 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 );33 void previsit( const Type * ) { visit_children = false; } 34 35 void postvisit( const VoidType * voidType ); 36 void postvisit( const BasicType * basicType ); 37 void postvisit( const PointerType * pointerType ); 38 void postvisit( const ArrayType * arrayType ); 39 void postvisit( const FunctionType * functionType ); 40 void postvisit( const StructInstType * inst ); 41 void postvisit( const UnionInstType * inst ); 42 void postvisit( const EnumInstType * inst ); 43 void postvisit( const TraitInstType * inst ); 44 void postvisit( const TypeInstType * inst ); 45 void postvisit( const TupleType * tupleType ); 46 void postvisit( const VarArgsType * varArgsType ); 47 void postvisit( const ZeroType * zeroType ); 48 void postvisit( const OneType * oneType ); 49 49 private: 50 Type *dest;50 const Type * dest; 51 51 int result; 52 52 const TypeEnvironment &env; 53 53 }; 54 54 55 int ptrsAssignable( Type *src, Type *dest, const TypeEnvironment &env ) {55 int ptrsAssignable( const Type *src, const Type * dest, const TypeEnvironment &env ) { 56 56 // std::cerr << "assignable: " << src << " | " << dest << std::endl; 57 if ( TypeInstType *destAsTypeInst = dynamic_cast<TypeInstType* >( dest ) ) {58 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->get_name() ) ) {57 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const 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< VoidType* >( dest ) ) {62 if ( dynamic_cast< const 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( Type *dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {}74 75 void PtrsAssignable::postvisit( VoidType * ) {73 PtrsAssignable::PtrsAssignable( const Type * dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {} 74 75 void PtrsAssignable::postvisit( const 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( __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 ) ) {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( const EnumInstType * ) { 89 if ( dynamic_cast< const 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( __attribute__((unused)) TraitInstType *inst) {}100 void PtrsAssignable::postvisit( TypeInstType *inst ) {101 if ( const EqvClass * eqvClass = env.lookup( inst->get_name()) ) {99 void PtrsAssignable::postvisit( const TraitInstType * ) {} 100 void PtrsAssignable::postvisit( const TypeInstType * inst ) { 101 if ( const EqvClass * eqvClass = env.lookup( inst->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( __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) {}109 void PtrsAssignable::postvisit( const TupleType * ) {} 110 void PtrsAssignable::postvisit( const VarArgsType * ) {} 111 void PtrsAssignable::postvisit( const ZeroType * ) {} 112 void PtrsAssignable::postvisit( const OneType * ) {} 113 113 114 114 // TODO: Get rid of the `_new` suffix when the old version is removed. -
src/ResolvExpr/PtrsCastable.cc
r302d84c2 rfce4e31 29 29 struct PtrsCastable_old : public WithShortCircuiting { 30 30 public: 31 PtrsCastable_old( Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer );31 PtrsCastable_old( const Type * dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ); 32 32 33 33 int get_result() const { return result; } 34 34 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 );35 void previsit( const Type * ) { visit_children = false; } 36 37 void postvisit( const VoidType * voidType ); 38 void postvisit( const BasicType * basicType ); 39 void postvisit( const PointerType * pointerType ); 40 void postvisit( const ArrayType * arrayType ); 41 void postvisit( const FunctionType * functionType ); 42 void postvisit( const StructInstType * inst ); 43 void postvisit( const UnionInstType * inst ); 44 void postvisit( const EnumInstType * inst ); 45 void postvisit( const TraitInstType * inst ); 46 void postvisit( const TypeInstType * inst ); 47 void postvisit( const TupleType * tupleType ); 48 void postvisit( const VarArgsType * varArgsType ); 49 void postvisit( const ZeroType * zeroType ); 50 void postvisit( const OneType * oneType ); 51 51 private: 52 Type *dest;52 const Type * dest; 53 53 int result; 54 54 const TypeEnvironment &env; … … 57 57 58 58 namespace { 59 int objectCast( Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {60 if ( dynamic_cast< FunctionType* >( src ) ) {59 int objectCast( const Type * src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 60 if ( dynamic_cast< const FunctionType* >( src ) ) { 61 61 return -1; 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 ) {62 } else if ( const TypeInstType * typeInst = dynamic_cast< const TypeInstType* >( src ) ) { 63 if ( const NamedTypeDecl * ntDecl = indexer.lookupType( typeInst->name ) ) { 64 if ( const TypeDecl * tyDecl = dynamic_cast< const TypeDecl* >( ntDecl ) ) { 65 if ( tyDecl->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( Type *src, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {77 int functionCast( const 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( 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() ) ) {82 int ptrsCastable( const Type * src, const Type * dest, const TypeEnvironment &env, const SymTab::Indexer &indexer ) { 83 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const 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< VoidType* >( dest ) ) {89 if ( dynamic_cast< const VoidType* >( dest ) ) { 90 90 return objectCast( src, env, indexer ); 91 91 } else { … … 96 96 } 97 97 98 PtrsCastable_old::PtrsCastable_old( Type *dest, const TypeEnvironment &env, const SymTab::Indexer &indexer )98 PtrsCastable_old::PtrsCastable_old( const 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( 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 * ) {102 void PtrsCastable_old::postvisit( const VoidType * ) { 103 result = objectCast( dest, env, indexer ); 104 } 105 106 void PtrsCastable_old::postvisit( const BasicType * ) { 107 result = objectCast( dest, env, indexer ); 108 } 109 110 void PtrsCastable_old::postvisit( const PointerType * ) { 111 result = objectCast( dest, env, indexer ); 112 } 113 114 void PtrsCastable_old::postvisit( const ArrayType * ) { 115 result = objectCast( dest, env, indexer ); 116 } 117 118 void PtrsCastable_old::postvisit( const FunctionType * ) { 119 119 // result = -1; 120 120 result = functionCast( dest, env, indexer ); 121 121 } 122 122 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 ) ) {123 void PtrsCastable_old::postvisit( const StructInstType * ) { 124 result = objectCast( dest, env, indexer ); 125 } 126 127 void PtrsCastable_old::postvisit( const UnionInstType * ) { 128 result = objectCast( dest, env, indexer ); 129 } 130 131 void PtrsCastable_old::postvisit( const EnumInstType * ) { 132 if ( dynamic_cast< const EnumInstType * >( dest ) ) { 133 133 result = 1; 134 } else if ( BasicType *bt = dynamic_cast< BasicType* >( dest ) ) {135 if ( bt-> get_kind()== BasicType::SignedInt ) {134 } else if ( const BasicType * bt = dynamic_cast< const BasicType * >( dest ) ) { 135 if ( bt->kind == BasicType::SignedInt ) { 136 136 result = 0; 137 137 } else { … … 143 143 } 144 144 145 void PtrsCastable_old::postvisit( TraitInstType * ) {}146 147 void PtrsCastable_old::postvisit( TypeInstType *inst ) {145 void PtrsCastable_old::postvisit( const TraitInstType * ) {} 146 147 void PtrsCastable_old::postvisit( const 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( 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 * ) {152 void PtrsCastable_old::postvisit( const TupleType * ) { 153 result = objectCast( dest, env, indexer ); 154 } 155 156 void PtrsCastable_old::postvisit( const VarArgsType * ) { 157 result = objectCast( dest, env, indexer ); 158 } 159 160 void PtrsCastable_old::postvisit( const ZeroType * ) { 161 result = objectCast( dest, env, indexer ); 162 } 163 164 void PtrsCastable_old::postvisit( const 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
r302d84c2 rfce4e31 562 562 // TODO: Replace *exception type with &exception type. 563 563 if ( throwStmt->get_expr() ) { 564 StructDecl * exception_decl = 565 indexer.lookupStruct( "__cfaabi_ehm__base_exception_t" ); 564 StructDecl * exception_decl = indexer.lookupMutableStruct( "__cfaabi_ehm__base_exception_t" ); 566 565 assert( exception_decl ); 567 566 Type * exceptType = new PointerType( noQualifiers, new StructInstType( noQualifiers, exception_decl ) ); … … 972 971 /// Calls the CandidateFinder and finds the single best candidate 973 972 CandidateRef findUnfinishedKindExpression( 974 const ast::Expr * untyped, const ast::SymbolTable & symtab, const std::string & kind, 973 const ast::Expr * untyped, const ast::SymbolTable & symtab, const std::string & kind, 975 974 std::function<bool(const Candidate &)> pred = anyCandidate, ResolvMode mode = {} 976 975 ) { … … 994 993 // produce invalid error if no candidates 995 994 if ( candidates.empty() ) { 996 SemanticError( untyped, 997 toString( "No reasonable alternatives for ", kind, (kind != "" ? " " : ""), 995 SemanticError( untyped, 996 toString( "No reasonable alternatives for ", kind, (kind != "" ? " " : ""), 998 997 "expression: ") ); 999 998 } … … 1031 1030 if ( winners.size() != 1 ) { 1032 1031 std::ostringstream stream; 1033 stream << "Cannot choose between " << winners.size() << " alternatives for " 1032 stream << "Cannot choose between " << winners.size() << " alternatives for " 1034 1033 << kind << (kind != "" ? " " : "") << "expression\n"; 1035 1034 ast::print( stream, untyped ); … … 1054 1053 struct StripCasts_new final { 1055 1054 const ast::Expr * postmutate( const ast::CastExpr * castExpr ) { 1056 if ( 1057 castExpr->isGenerated 1058 && typesCompatible( castExpr->arg->result, castExpr->result ) 1055 if ( 1056 castExpr->isGenerated 1057 && typesCompatible( castExpr->arg->result, castExpr->result ) 1059 1058 ) { 1060 1059 // generated cast is the same type as its argument, remove it after keeping env 1061 return ast::mutate_field( 1060 return ast::mutate_field( 1062 1061 castExpr->arg.get(), &ast::Expr::env, castExpr->env ); 1063 1062 } … … 1088 1087 1089 1088 /// Establish post-resolver invariants for expressions 1090 void finishExpr( 1091 ast::ptr< ast::Expr > & expr, const ast::TypeEnvironment & env, 1089 void finishExpr( 1090 ast::ptr< ast::Expr > & expr, const ast::TypeEnvironment & env, 1092 1091 const ast::TypeSubstitution * oldenv = nullptr 1093 1092 ) { 1094 1093 // set up new type substitution for expression 1095 ast::ptr< ast::TypeSubstitution > newenv = 1094 ast::ptr< ast::TypeSubstitution > newenv = 1096 1095 oldenv ? oldenv : new ast::TypeSubstitution{}; 1097 1096 env.writeToSubstitution( *newenv.get_and_mutate() ); … … 1102 1101 } // anonymous namespace 1103 1102 1104 1103 1105 1104 ast::ptr< ast::Expr > resolveInVoidContext( 1106 1105 const ast::Expr * expr, const ast::SymbolTable & symtab, ast::TypeEnvironment & env 1107 1106 ) { 1108 1107 assertf( expr, "expected a non-null expression" ); 1109 1108 1110 1109 // set up and resolve expression cast to void 1111 1110 ast::CastExpr * untyped = new ast::CastExpr{ expr }; 1112 CandidateRef choice = findUnfinishedKindExpression( 1111 CandidateRef choice = findUnfinishedKindExpression( 1113 1112 untyped, symtab, "", anyCandidate, ResolvMode::withAdjustment() ); 1114 1113 1115 1114 // a cast expression has either 0 or 1 interpretations (by language rules); 1116 1115 // if 0, an exception has already been thrown, and this code will not run … … 1122 1121 1123 1122 namespace { 1124 /// Resolve `untyped` to the expression whose candidate is the best match for a `void` 1123 /// Resolve `untyped` to the expression whose candidate is the best match for a `void` 1125 1124 /// context. 1126 ast::ptr< ast::Expr > findVoidExpression( 1125 ast::ptr< ast::Expr > findVoidExpression( 1127 1126 const ast::Expr * untyped, const ast::SymbolTable & symtab 1128 1127 ) { … … 1134 1133 } 1135 1134 1136 /// resolve `untyped` to the expression whose candidate satisfies `pred` with the 1135 /// resolve `untyped` to the expression whose candidate satisfies `pred` with the 1137 1136 /// lowest cost, returning the resolved version 1138 1137 ast::ptr< ast::Expr > findKindExpression( 1139 const ast::Expr * untyped, const ast::SymbolTable & symtab, 1140 std::function<bool(const Candidate &)> pred = anyCandidate, 1138 const ast::Expr * untyped, const ast::SymbolTable & symtab, 1139 std::function<bool(const Candidate &)> pred = anyCandidate, 1141 1140 const std::string & kind = "", ResolvMode mode = {} 1142 1141 ) { 1143 1142 if ( ! untyped ) return {}; 1144 CandidateRef choice = 1143 CandidateRef choice = 1145 1144 findUnfinishedKindExpression( untyped, symtab, kind, pred, mode ); 1146 1145 finishExpr( choice->expr, choice->env, untyped->env ); … … 1149 1148 1150 1149 /// Resolve `untyped` to the single expression whose candidate is the best match 1151 ast::ptr< ast::Expr > findSingleExpression( 1152 const ast::Expr * untyped, const ast::SymbolTable & symtab 1150 ast::ptr< ast::Expr > findSingleExpression( 1151 const ast::Expr * untyped, const ast::SymbolTable & symtab 1153 1152 ) { 1154 1153 return findKindExpression( untyped, symtab ); … … 1170 1169 bool hasIntegralType( const Candidate & i ) { 1171 1170 const ast::Type * type = i.expr->result; 1172 1171 1173 1172 if ( auto bt = dynamic_cast< const ast::BasicType * >( type ) ) { 1174 1173 return bt->isInteger(); 1175 } else if ( 1176 dynamic_cast< const ast::EnumInstType * >( type ) 1174 } else if ( 1175 dynamic_cast< const ast::EnumInstType * >( type ) 1177 1176 || dynamic_cast< const ast::ZeroType * >( type ) 1178 1177 || dynamic_cast< const ast::OneType * >( type ) … … 1183 1182 1184 1183 /// Resolve `untyped` as an integral expression, returning the resolved version 1185 ast::ptr< ast::Expr > findIntegralExpression( 1186 const ast::Expr * untyped, const ast::SymbolTable & symtab 1184 ast::ptr< ast::Expr > findIntegralExpression( 1185 const ast::Expr * untyped, const ast::SymbolTable & symtab 1187 1186 ) { 1188 1187 return findKindExpression( untyped, symtab, hasIntegralType, "condition" ); … … 1192 1191 bool isCharType( const ast::Type * t ) { 1193 1192 if ( auto bt = dynamic_cast< const ast::BasicType * >( t ) ) { 1194 return bt->kind == ast::BasicType::Char 1195 || bt->kind == ast::BasicType::SignedChar 1193 return bt->kind == ast::BasicType::Char 1194 || bt->kind == ast::BasicType::SignedChar 1196 1195 || bt->kind == ast::BasicType::UnsignedChar; 1197 1196 } … … 1253 1252 } 1254 1253 1255 ast::ptr< ast::Init > resolveCtorInit( 1256 const ast::ConstructorInit * ctorInit, const ast::SymbolTable & symtab 1254 ast::ptr< ast::Init > resolveCtorInit( 1255 const ast::ConstructorInit * ctorInit, const ast::SymbolTable & symtab 1257 1256 ) { 1258 1257 assert( ctorInit ); … … 1261 1260 } 1262 1261 1263 ast::ptr< ast::Expr > resolveStmtExpr( 1264 const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab 1262 ast::ptr< ast::Expr > resolveStmtExpr( 1263 const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab 1265 1264 ) { 1266 1265 assert( stmtExpr ); … … 1303 1302 1304 1303 void Resolver_new::previsit( const ast::ObjectDecl * objectDecl ) { 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 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 1310 1309 // selecting the RHS. 1311 1310 GuardValue( currentObject ); 1312 1311 currentObject = ast::CurrentObject{ objectDecl->location, objectDecl->get_type() }; 1313 1312 if ( inEnumDecl && dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() ) ) { 1314 // enumerator initializers should not use the enum type to initialize, since the 1313 // enumerator initializers should not use the enum type to initialize, since the 1315 1314 // enum type is still incomplete at this point. Use `int` instead. 1316 currentObject = ast::CurrentObject{ 1315 currentObject = ast::CurrentObject{ 1317 1316 objectDecl->location, new ast::BasicType{ ast::BasicType::SignedInt } }; 1318 1317 } … … 1325 1324 } 1326 1325 1327 const ast::StaticAssertDecl * Resolver_new::previsit( 1328 const ast::StaticAssertDecl * assertDecl 1326 const ast::StaticAssertDecl * Resolver_new::previsit( 1327 const ast::StaticAssertDecl * assertDecl 1329 1328 ) { 1330 return ast::mutate_field( 1331 assertDecl, &ast::StaticAssertDecl::cond, 1329 return ast::mutate_field( 1330 assertDecl, &ast::StaticAssertDecl::cond, 1332 1331 findIntegralExpression( assertDecl->cond, symtab ) ); 1333 1332 } … … 1338 1337 #warning should use new equivalent to Validate::SizeType rather than sizeType here 1339 1338 ast::ptr< ast::Type > sizeType = new ast::BasicType{ ast::BasicType::LongUnsignedInt }; 1340 ast::mutate_field( 1341 type, &PtrType::dimension, 1339 ast::mutate_field( 1340 type, &PtrType::dimension, 1342 1341 findSingleExpression( type->dimension, sizeType, symtab ) ); 1343 1342 } … … 1356 1355 visit_children = false; 1357 1356 assertf( exprStmt->expr, "ExprStmt has null expression in resolver" ); 1358 1359 return ast::mutate_field( 1357 1358 return ast::mutate_field( 1360 1359 exprStmt, &ast::ExprStmt::expr, findVoidExpression( exprStmt->expr, symtab ) ); 1361 1360 } … … 1364 1363 visit_children = false; 1365 1364 1366 asmExpr = ast::mutate_field( 1365 asmExpr = ast::mutate_field( 1367 1366 asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) ); 1368 1367 1369 1368 if ( asmExpr->inout ) { 1370 1369 asmExpr = ast::mutate_field( 1371 1370 asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) ); 1372 1371 } 1373 1372 1374 1373 return asmExpr; 1375 1374 } … … 1388 1387 1389 1388 const ast::WhileStmt * Resolver_new::previsit( const ast::WhileStmt * whileStmt ) { 1390 return ast::mutate_field( 1389 return ast::mutate_field( 1391 1390 whileStmt, &ast::WhileStmt::cond, findIntegralExpression( whileStmt->cond, symtab ) ); 1392 1391 } … … 1409 1408 GuardValue( currentObject ); 1410 1409 switchStmt = ast::mutate_field( 1411 switchStmt, &ast::SwitchStmt::cond, 1410 switchStmt, &ast::SwitchStmt::cond, 1412 1411 findIntegralExpression( switchStmt->cond, symtab ) ); 1413 1412 currentObject = ast::CurrentObject{ switchStmt->location, switchStmt->cond->result }; … … 1420 1419 assertf( initAlts.size() == 1, "SwitchStmt did not correctly resolve an integral " 1421 1420 "expression." ); 1422 1423 ast::ptr< ast::Expr > untyped = 1421 1422 ast::ptr< ast::Expr > untyped = 1424 1423 new ast::CastExpr{ caseStmt->location, caseStmt->cond, initAlts.front().type }; 1425 1424 ast::ptr< ast::Expr > newExpr = findSingleExpression( untyped, symtab ); 1426 1427 // case condition cannot have a cast in C, so it must be removed here, regardless of 1425 1426 // case condition cannot have a cast in C, so it must be removed here, regardless of 1428 1427 // whether it would perform a conversion. 1429 1428 if ( const ast::CastExpr * castExpr = newExpr.as< ast::CastExpr >() ) { 1430 1429 swap_and_save_env( newExpr, castExpr->arg ); 1431 1430 } 1432 1431 1433 1432 caseStmt = ast::mutate_field( caseStmt, &ast::CaseStmt::cond, newExpr ); 1434 1433 } … … 1443 1442 ast::ptr< ast::Type > target = new ast::PointerType{ new ast::VoidType{} }; 1444 1443 branchStmt = ast::mutate_field( 1445 branchStmt, &ast::BranchStmt::computedTarget, 1444 branchStmt, &ast::BranchStmt::computedTarget, 1446 1445 findSingleExpression( branchStmt->computedTarget, target, symtab ) ); 1447 1446 } … … 1453 1452 if ( returnStmt->expr ) { 1454 1453 returnStmt = ast::mutate_field( 1455 returnStmt, &ast::ReturnStmt::expr, 1454 returnStmt, &ast::ReturnStmt::expr, 1456 1455 findSingleExpression( returnStmt->expr, functionReturn, symtab ) ); 1457 1456 } … … 1462 1461 visit_children = false; 1463 1462 if ( throwStmt->expr ) { 1464 const ast::StructDecl * exceptionDecl = 1463 const ast::StructDecl * exceptionDecl = 1465 1464 symtab.lookupStruct( "__cfaabi_ehm__base_exception_t" ); 1466 1465 assert( exceptionDecl ); 1467 ast::ptr< ast::Type > exceptType = 1466 ast::ptr< ast::Type > exceptType = 1468 1467 new ast::PointerType{ new ast::StructInstType{ exceptionDecl } }; 1469 1468 throwStmt = ast::mutate_field( 1470 throwStmt, &ast::ThrowStmt::expr, 1469 throwStmt, &ast::ThrowStmt::expr, 1471 1470 findSingleExpression( throwStmt->expr, exceptType, symtab ) ); 1472 1471 } … … 1477 1476 if ( catchStmt->cond ) { 1478 1477 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; 1479 catchStmt = ast::mutate_field( 1480 catchStmt, &ast::CatchStmt::cond, 1478 catchStmt = ast::mutate_field( 1479 catchStmt, &ast::CatchStmt::cond, 1481 1480 findSingleExpression( catchStmt->cond, boolType, symtab ) ); 1482 1481 } … … 1506 1505 1507 1506 if ( clause.target.args.empty() ) { 1508 SemanticError( stmt->location, 1507 SemanticError( stmt->location, 1509 1508 "Waitfor clause must have at least one mutex parameter"); 1510 1509 } 1511 1510 1512 1511 // Find all alternatives for all arguments in canonical form 1513 std::vector< CandidateFinder > argFinders = 1512 std::vector< CandidateFinder > argFinders = 1514 1513 funcFinder.findSubExprs( clause.target.args ); 1515 1514 1516 1515 // List all combinations of arguments 1517 1516 std::vector< CandidateList > possibilities; … … 1519 1518 1520 1519 // For every possible function: 1521 // * try matching the arguments to the parameters, not the other way around because 1520 // * try matching the arguments to the parameters, not the other way around because 1522 1521 // more arguments than parameters 1523 1522 CandidateList funcCandidates; … … 1526 1525 for ( CandidateRef & func : funcFinder.candidates ) { 1527 1526 try { 1528 auto pointerType = dynamic_cast< const ast::PointerType * >( 1527 auto pointerType = dynamic_cast< const ast::PointerType * >( 1529 1528 func->expr->result->stripReferences() ); 1530 1529 if ( ! pointerType ) { 1531 SemanticError( stmt->location, func->expr->result.get(), 1530 SemanticError( stmt->location, func->expr->result.get(), 1532 1531 "candidate not viable: not a pointer type\n" ); 1533 1532 } … … 1535 1534 auto funcType = pointerType->base.as< ast::FunctionType >(); 1536 1535 if ( ! funcType ) { 1537 SemanticError( stmt->location, func->expr->result.get(), 1536 SemanticError( stmt->location, func->expr->result.get(), 1538 1537 "candidate not viable: not a function type\n" ); 1539 1538 } … … 1544 1543 1545 1544 if( ! nextMutex( param, paramEnd ) ) { 1546 SemanticError( stmt->location, funcType, 1545 SemanticError( stmt->location, funcType, 1547 1546 "candidate function not viable: no mutex parameters\n"); 1548 1547 } … … 1560 1559 ast::AssertionSet need, have; 1561 1560 ast::TypeEnvironment resultEnv{ func->env }; 1562 // Add all type variables as open so that those not used in the 1561 // Add all type variables as open so that those not used in the 1563 1562 // parameter list are still considered open 1564 1563 resultEnv.add( funcType->forall ); … … 1580 1579 unsigned n_mutex_param = 0; 1581 1580 1582 // For every argument of its set, check if it matches one of the 1581 // For every argument of its set, check if it matches one of the 1583 1582 // parameters. The order is important 1584 1583 for ( auto & arg : argsList ) { … … 1587 1586 // We ran out of parameters but still have arguments. 1588 1587 // This function doesn't match 1589 SemanticError( stmt->location, funcType, 1588 SemanticError( stmt->location, funcType, 1590 1589 toString("candidate function not viable: too many mutex " 1591 1590 "arguments, expected ", n_mutex_param, "\n" ) ); … … 1594 1593 ++n_mutex_param; 1595 1594 1596 // Check if the argument matches the parameter type in the current 1595 // Check if the argument matches the parameter type in the current 1597 1596 // scope 1598 1597 ast::ptr< ast::Type > paramType = (*param)->get_type(); 1599 if ( 1600 ! unify( 1601 arg->expr->result, paramType, resultEnv, need, have, open, 1602 symtab ) 1598 if ( 1599 ! unify( 1600 arg->expr->result, paramType, resultEnv, need, have, open, 1601 symtab ) 1603 1602 ) { 1604 1603 // Type doesn't match … … 1627 1626 } while ( nextMutex( param, paramEnd ) ); 1628 1627 1629 // We ran out of arguments but still have parameters left; this 1628 // We ran out of arguments but still have parameters left; this 1630 1629 // function doesn't match 1631 SemanticError( stmt->location, funcType, 1630 SemanticError( stmt->location, funcType, 1632 1631 toString( "candidate function not viable: too few mutex " 1633 1632 "arguments, expected ", n_mutex_param, "\n" ) ); … … 1657 1656 // Make sure correct number of arguments 1658 1657 if( funcCandidates.empty() ) { 1659 SemanticErrorException top( stmt->location, 1658 SemanticErrorException top( stmt->location, 1660 1659 "No alternatives for function in call to waitfor" ); 1661 1660 top.append( errors ); … … 1664 1663 1665 1664 if( argsCandidates.empty() ) { 1666 SemanticErrorException top( stmt->location, 1667 "No alternatives for arguments in call to waitfor" ); 1665 SemanticErrorException top( stmt->location, 1666 "No alternatives for arguments in call to waitfor" ); 1668 1667 top.append( errors ); 1669 1668 throw top; … … 1671 1670 1672 1671 if( funcCandidates.size() > 1 ) { 1673 SemanticErrorException top( stmt->location, 1672 SemanticErrorException top( stmt->location, 1674 1673 "Ambiguous function in call to waitfor" ); 1675 1674 top.append( errors ); … … 1686 1685 // build new clause 1687 1686 ast::WaitForStmt::Clause clause2; 1688 1687 1689 1688 clause2.target.func = funcCandidates.front()->expr; 1690 1689 1691 1690 clause2.target.args.reserve( clause.target.args.size() ); 1692 1691 for ( auto arg : argsCandidates.front() ) { … … 1708 1707 ast::WaitForStmt::Timeout timeout2; 1709 1708 1710 ast::ptr< ast::Type > target = 1709 ast::ptr< ast::Type > target = 1711 1710 new ast::BasicType{ ast::BasicType::LongLongUnsignedInt }; 1712 1711 timeout2.time = findSingleExpression( stmt->timeout.time, target, symtab ); … … 1740 1739 const ast::SingleInit * Resolver_new::previsit( const ast::SingleInit * singleInit ) { 1741 1740 visit_children = false; 1742 // resolve initialization using the possibilities as determined by the `currentObject` 1741 // resolve initialization using the possibilities as determined by the `currentObject` 1743 1742 // cursor. 1744 ast::ptr< ast::Expr > untyped = new ast::UntypedInitExpr{ 1743 ast::ptr< ast::Expr > untyped = new ast::UntypedInitExpr{ 1745 1744 singleInit->location, singleInit->value, currentObject.getOptions() }; 1746 1745 ast::ptr<ast::Expr> newExpr = findSingleExpression( untyped, symtab ); … … 1751 1750 1752 1751 // discard InitExpr wrapper and retain relevant pieces. 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 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 1755 1754 // swap is not sufficient 1756 1755 ast::Expr::InferUnion inferred = initExpr->inferred; … … 1758 1757 newExpr.get_and_mutate()->inferred.splice( std::move(inferred) ); 1759 1758 1760 // get the actual object's type (may not exactly match what comes back from the resolver 1759 // get the actual object's type (may not exactly match what comes back from the resolver 1761 1760 // due to conversions) 1762 1761 const ast::Type * initContext = currentObject.getCurrentType(); … … 1770 1769 if ( auto pt = newExpr->result.as< ast::PointerType >() ) { 1771 1770 if ( isCharType( pt->base ) ) { 1772 // strip cast if we're initializing a char[] with a char* 1771 // strip cast if we're initializing a char[] with a char* 1773 1772 // e.g. char x[] = "hello" 1774 1773 if ( auto ce = newExpr.as< ast::CastExpr >() ) { … … 1793 1792 assert( listInit->designations.size() == listInit->initializers.size() ); 1794 1793 for ( unsigned i = 0; i < listInit->designations.size(); ++i ) { 1795 // iterate designations and initializers in pairs, moving the cursor to the current 1794 // iterate designations and initializers in pairs, moving the cursor to the current 1796 1795 // designated object and resolving the initializer against that object 1797 1796 listInit = ast::mutate_field_index( 1798 listInit, &ast::ListInit::designations, i, 1797 listInit, &ast::ListInit::designations, i, 1799 1798 currentObject.findNext( listInit->designations[i] ) ); 1800 1799 listInit = ast::mutate_field_index( … … 1818 1817 ctorInit = ast::mutate_field( ctorInit, &ast::ConstructorInit::init, nullptr ); 1819 1818 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 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 1822 1821 // clean up generated code 1823 1822 if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->ctor ) ) { -
src/ResolvExpr/Unify.cc
r302d84c2 rfce4e31 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( Type *first, Type *second, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {141 bool typesCompatibleIgnoreQualifiers( const Type * first, const 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
r302d84c2 rfce4e31 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( 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, 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, 82 82 const ast::TypeEnvironment & env ); 83 83 84 84 // in ConversionCost.cc 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, 85 Cost conversionCost( const Type *src, const 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( Type *src, Type *dest, const TypeEnvironment &env );95 int ptrsAssignable( const Type * src, const 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( 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, 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, 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( Type *,Type *, const SymTab::Indexer &indexer, const TypeEnvironment &env );107 bool typesCompatibleIgnoreQualifiers( const Type *, const 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( Type *t1, Type *t2, const SymTab::Indexer &indexer ) {114 inline bool typesCompatibleIgnoreQualifiers( const Type * t1, const 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
r302d84c2 rfce4e31 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 NamedTypeDecl *Indexer::lookupType( const std::string &id ) const { 125 ++*stats().lookup_calls; 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; 126 127 if ( ! typeTable ) return nullptr; 127 ++* stats().map_lookups;128 ++* stats().map_lookups; 128 129 auto it = typeTable->find( id ); 129 130 return it == typeTable->end() ? nullptr : it->second.decl; 130 131 } 131 132 132 StructDecl *Indexer::lookupStruct( const std::string &id ) const { 133 ++*stats().lookup_calls; 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; 134 136 if ( ! structTable ) return nullptr; 135 ++* stats().map_lookups;137 ++* stats().map_lookups; 136 138 auto it = structTable->find( id ); 137 139 return it == structTable->end() ? nullptr : it->second.decl; 138 140 } 139 141 140 EnumDecl *Indexer::lookupEnum( const std::string &id ) const { 141 ++*stats().lookup_calls; 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; 142 145 if ( ! enumTable ) return nullptr; 143 ++* stats().map_lookups;146 ++* stats().map_lookups; 144 147 auto it = enumTable->find( id ); 145 148 return it == enumTable->end() ? nullptr : it->second.decl; 146 149 } 147 150 148 UnionDecl *Indexer::lookupUnion( const std::string &id ) const { 149 ++*stats().lookup_calls; 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; 150 154 if ( ! unionTable ) return nullptr; 151 ++* stats().map_lookups;155 ++* stats().map_lookups; 152 156 auto it = unionTable->find( id ); 153 157 return it == unionTable->end() ? nullptr : it->second.decl; 154 158 } 155 159 156 TraitDecl *Indexer::lookupTrait( const std::string &id ) const { 157 ++*stats().lookup_calls; 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; 158 163 if ( ! traitTable ) return nullptr; 159 ++* stats().map_lookups;164 ++* stats().map_lookups; 160 165 auto it = traitTable->find( id ); 161 166 return it == traitTable->end() ? nullptr : it->second.decl; 162 167 } 163 168 164 const Indexer * Indexer::atScope( unsigned long target ) const {169 const Indexer * Indexer::atScope( unsigned long target ) const { 165 170 // by lazy construction, final indexer in list has repScope 0, cannot be > target 166 171 // otherwise, will find first scope representing the target 167 const Indexer * indexer = this;172 const Indexer * indexer = this; 168 173 while ( indexer->repScope > target ) { 169 174 indexer = indexer->prevScope.get(); … … 172 177 } 173 178 174 NamedTypeDecl *Indexer::globalLookupType( const std::string &id ) const {179 const NamedTypeDecl * Indexer::globalLookupType( const std::string & id ) const { 175 180 return atScope( 0 )->lookupType( id ); 176 181 } 177 182 178 StructDecl *Indexer::globalLookupStruct( const std::string &id ) const {183 const StructDecl * Indexer::globalLookupStruct( const std::string & id ) const { 179 184 return atScope( 0 )->lookupStruct( id ); 180 185 } 181 186 182 UnionDecl *Indexer::globalLookupUnion( const std::string &id ) const {187 const UnionDecl * Indexer::globalLookupUnion( const std::string & id ) const { 183 188 return atScope( 0 )->lookupUnion( id ); 184 189 } 185 190 186 EnumDecl *Indexer::globalLookupEnum( const std::string &id ) const {191 const EnumDecl * Indexer::globalLookupEnum( const std::string & id ) const { 187 192 return atScope( 0 )->lookupEnum( id ); 188 193 } … … 207 212 } 208 213 209 210 bool Indexer::addedIdConflicts( 211 const Indexer::IdData & existing, DeclarationWithType * added,214 215 bool Indexer::addedIdConflicts( 216 const Indexer::IdData & existing, DeclarationWithType * added, 212 217 Indexer::OnConflict handleConflicts, BaseSyntaxNode * deleteStmt ) { 213 // if we're giving the same name mangling to things of different types then there is 218 // if we're giving the same name mangling to things of different types then there is 214 219 // something wrong 215 220 assert( (isObject( added ) && isObject( existing.id ) ) … … 219 224 // new definition shadows the autogenerated one, even at the same scope 220 225 return false; 221 } else if ( LinkageSpec::isMangled( added->linkage ) 222 || ResolvExpr::typesCompatible( 226 } else if ( LinkageSpec::isMangled( added->linkage ) 227 || ResolvExpr::typesCompatible( 223 228 added->get_type(), existing.id->get_type(), Indexer() ) ) { 224 229 … … 238 243 if ( isDefinition( added ) && isDefinition( existing.id ) ) { 239 244 if ( handleConflicts.mode == OnConflict::Error ) { 240 SemanticError( added, 241 isFunction( added ) ? 242 "duplicate function definition for " : 245 SemanticError( added, 246 isFunction( added ) ? 247 "duplicate function definition for " : 243 248 "duplicate object definition for " ); 244 249 } … … 255 260 } 256 261 257 bool Indexer::hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const {262 bool Indexer::hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const { 258 263 if ( ! idTable ) return false; 259 264 260 ++* stats().map_lookups;265 ++* stats().map_lookups; 261 266 auto decls = idTable->find( id ); 262 267 if ( decls == idTable->end() ) return false; … … 270 275 } 271 276 } 272 277 273 278 return false; 274 279 } 275 280 276 bool Indexer::hasIncompatibleCDecl( 277 const std::string & id, const std::string &mangleName ) const {281 bool Indexer::hasIncompatibleCDecl( 282 const std::string & id, const std::string &mangleName ) const { 278 283 if ( ! idTable ) return false; 279 284 280 ++* stats().map_lookups;285 ++* stats().map_lookups; 281 286 auto decls = idTable->find( id ); 282 287 if ( decls == idTable->end() ) return false; … … 295 300 296 301 /// gets the base type of the first parameter; decl must be a ctor/dtor/assignment function 297 std::string getOtypeKey( FunctionDecl * function ) {302 std::string getOtypeKey( FunctionDecl * function ) { 298 303 auto& params = function->type->parameters; 299 304 assert( ! params.empty() ); 300 305 // use base type of pointer, so that qualifiers on the pointer type aren't considered. 301 Type * base = InitTweak::getPointerBase( params.front()->get_type() );306 Type * base = InitTweak::getPointerBase( params.front()->get_type() ); 302 307 assert( base ); 303 308 return Mangler::mangle( base ); 304 309 } 305 310 306 /// gets the declaration for the function acting on a type specified by otype key, 311 /// gets the declaration for the function acting on a type specified by otype key, 307 312 /// nullptr if none such 308 313 FunctionDecl * getFunctionForOtype( DeclarationWithType * decl, const std::string& otypeKey ) { … … 312 317 } 313 318 314 bool Indexer::removeSpecialOverrides( 319 bool Indexer::removeSpecialOverrides( 315 320 Indexer::IdData& data, Indexer::MangleTable::Ptr& mangleTable ) { 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 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 323 328 // unavailable, and likewise for the assignment operator. 324 329 … … 340 345 std::vector< MangleTable::value_type > deleted; 341 346 bool alreadyUserDefinedFunc = false; 342 343 for ( const auto& entry : * mangleTable ) {347 348 for ( const auto& entry : * mangleTable ) { 344 349 // skip decls that aren't functions or are for the wrong type 345 350 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 368 373 // perform removals from mangle table, and deletions if necessary 369 374 for ( const auto& key : removed ) { 370 ++* stats().map_mutations;375 ++* stats().map_mutations; 371 376 mangleTable = mangleTable->erase( key ); 372 377 } 373 378 if ( ! alreadyUserDefinedFunc ) for ( const auto& entry : deleted ) { 374 ++* stats().map_mutations;379 ++* stats().map_mutations; 375 380 mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } ); 376 381 } … … 379 384 // if this is the first user-defined function, delete non-user-defined overloads 380 385 std::vector< MangleTable::value_type > deleted; 381 382 for ( const auto& entry : * mangleTable ) {386 387 for ( const auto& entry : * mangleTable ) { 383 388 // skip decls that aren't functions or are for the wrong type 384 389 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 402 407 // this needs to be a separate loop because of iterator invalidation 403 408 for ( const auto& entry : deleted ) { 404 ++* stats().map_mutations;409 ++* stats().map_mutations; 405 410 mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } ); 406 411 } … … 408 413 // this is an overridable generated function 409 414 // if there already exists a matching user-defined function, delete this appropriately 410 for ( const auto& entry : * mangleTable ) {415 for ( const auto& entry : * mangleTable ) { 411 416 // skip decls that aren't functions or are for the wrong type 412 417 FunctionDecl * decl = getFunctionForOtype( entry.second.id, dataOtypeKey ); … … 418 423 if ( dataIsCopyFunc ) { 419 424 // remove current function if exists a user-defined copy function 420 // since the signatures for copy functions don't need to match exactly, using 425 // since the signatures for copy functions don't need to match exactly, using 421 426 // a delete statement is the wrong approach 422 427 if ( InitTweak::isCopyFunction( decl, decl->name ) ) return false; … … 428 433 } 429 434 } 430 435 431 436 // nothing (more) to fix, return true 432 437 return true; 433 438 } 434 439 435 void Indexer::addId( 436 DeclarationWithType * decl, OnConflict handleConflicts, Expression * baseExpr,440 void Indexer::addId( 441 DeclarationWithType * decl, OnConflict handleConflicts, Expression * baseExpr, 437 442 BaseSyntaxNode * deleteStmt ) { 438 ++* stats().add_calls;443 ++* stats().add_calls; 439 444 const std::string &name = decl->name; 440 445 if ( name == "" ) return; 441 446 442 447 std::string mangleName; 443 448 if ( LinkageSpec::isOverridable( decl->linkage ) ) { 444 // mangle the name without including the appropriate suffix, so overridable routines 449 // mangle the name without including the appropriate suffix, so overridable routines 445 450 // are placed into the same "bucket" as their user defined versions. 446 451 mangleName = Mangler::mangle( decl, false ); … … 449 454 } // if 450 455 451 // this ensures that no two declarations with the same unmangled name at the same scope 456 // this ensures that no two declarations with the same unmangled name at the same scope 452 457 // both have C linkage 453 458 if ( LinkageSpec::isMangled( decl->linkage ) ) { … … 457 462 } 458 463 } else { 459 // NOTE: only correct if name mangling is completely isomorphic to C 464 // NOTE: only correct if name mangling is completely isomorphic to C 460 465 // type-compatibility, which it may not be. 461 466 if ( hasIncompatibleCDecl( name, mangleName ) ) { … … 470 475 mangleTable = MangleTable::new_ptr(); 471 476 } else { 472 ++* stats().map_lookups;477 ++* stats().map_lookups; 473 478 auto decls = idTable->find( name ); 474 479 if ( decls == idTable->end() ) { … … 477 482 mangleTable = decls->second; 478 483 // skip in-scope repeat declarations of same identifier 479 ++* stats().map_lookups;484 ++* stats().map_lookups; 480 485 auto existing = mangleTable->find( mangleName ); 481 486 if ( existing != mangleTable->end() … … 486 491 // set delete expression for conflicting identifier 487 492 lazyInitScope(); 488 * stats().map_mutations += 2;493 * stats().map_mutations += 2; 489 494 idTable = idTable->set( 490 495 name, 491 mangleTable->set( 492 mangleName, 496 mangleTable->set( 497 mangleName, 493 498 IdData{ existing->second, handleConflicts.deleteStmt } ) ); 494 499 } … … 504 509 // Ensure that auto-generated ctor/dtor/assignment are deleted if necessary 505 510 if ( ! removeSpecialOverrides( data, mangleTable ) ) return; 506 * stats().map_mutations += 2;511 * stats().map_mutations += 2; 507 512 idTable = idTable->set( name, mangleTable->set( mangleName, std::move(data) ) ); 508 513 } … … 518 523 } 519 524 520 bool addedTypeConflicts( NamedTypeDecl * existing, NamedTypeDecl *added ) {525 bool addedTypeConflicts( NamedTypeDecl * existing, NamedTypeDecl * added ) { 521 526 if ( existing->base == nullptr ) { 522 527 return false; … … 530 535 } 531 536 } 532 // does not need to be added to the table if both existing and added have a base that are 537 // does not need to be added to the table if both existing and added have a base that are 533 538 // the same 534 539 return true; 535 540 } 536 541 537 void Indexer::addType( NamedTypeDecl * decl ) {538 ++* stats().add_calls;539 const std::string & id = decl->name;540 541 if ( ! typeTable ) { 542 void Indexer::addType( NamedTypeDecl * decl ) { 543 ++* stats().add_calls; 544 const std::string & id = decl->name; 545 546 if ( ! typeTable ) { 542 547 typeTable = TypeTable::new_ptr(); 543 548 } else { 544 ++* stats().map_lookups;549 ++* stats().map_lookups; 545 550 auto existing = typeTable->find( id ); 546 if ( existing != typeTable->end() 547 && existing->second.scope == scope 551 if ( existing != typeTable->end() 552 && existing->second.scope == scope 548 553 && addedTypeConflicts( existing->second.decl, decl ) ) return; 549 554 } 550 555 551 556 lazyInitScope(); 552 ++* stats().map_mutations;557 ++* stats().map_mutations; 553 558 typeTable = typeTable->set( id, Scoped<NamedTypeDecl>{ decl, scope } ); 554 559 } 555 560 556 bool addedDeclConflicts( AggregateDecl * existing, AggregateDecl *added ) {561 bool addedDeclConflicts( AggregateDecl * existing, AggregateDecl * added ) { 557 562 if ( ! existing->body ) { 558 563 return false; … … 563 568 } 564 569 565 void Indexer::addStruct( const std::string & id ) {570 void Indexer::addStruct( const std::string & id ) { 566 571 addStruct( new StructDecl( id ) ); 567 572 } 568 573 569 void Indexer::addStruct( StructDecl * decl ) {570 ++* stats().add_calls;571 const std::string & id = decl->name;574 void Indexer::addStruct( StructDecl * decl ) { 575 ++* stats().add_calls; 576 const std::string & id = decl->name; 572 577 573 578 if ( ! structTable ) { 574 579 structTable = StructTable::new_ptr(); 575 580 } else { 576 ++* stats().map_lookups;581 ++* stats().map_lookups; 577 582 auto existing = structTable->find( id ); 578 if ( existing != structTable->end() 579 && existing->second.scope == scope 583 if ( existing != structTable->end() 584 && existing->second.scope == scope 580 585 && addedDeclConflicts( existing->second.decl, decl ) ) return; 581 586 } 582 587 583 588 lazyInitScope(); 584 ++* stats().map_mutations;589 ++* stats().map_mutations; 585 590 structTable = structTable->set( id, Scoped<StructDecl>{ decl, scope } ); 586 591 } 587 592 588 void Indexer::addEnum( EnumDecl * decl ) {589 ++* stats().add_calls;590 const std::string & id = decl->name;593 void Indexer::addEnum( EnumDecl * decl ) { 594 ++* stats().add_calls; 595 const std::string & id = decl->name; 591 596 592 597 if ( ! enumTable ) { 593 598 enumTable = EnumTable::new_ptr(); 594 599 } else { 595 ++* stats().map_lookups;600 ++* stats().map_lookups; 596 601 auto existing = enumTable->find( id ); 597 if ( existing != enumTable->end() 598 && existing->second.scope == scope 602 if ( existing != enumTable->end() 603 && existing->second.scope == scope 599 604 && addedDeclConflicts( existing->second.decl, decl ) ) return; 600 605 } 601 606 602 607 lazyInitScope(); 603 ++* stats().map_mutations;608 ++* stats().map_mutations; 604 609 enumTable = enumTable->set( id, Scoped<EnumDecl>{ decl, scope } ); 605 610 } 606 611 607 void Indexer::addUnion( const std::string & id ) {612 void Indexer::addUnion( const std::string & id ) { 608 613 addUnion( new UnionDecl( id ) ); 609 614 } 610 615 611 void Indexer::addUnion( UnionDecl * decl ) {612 ++* stats().add_calls;613 const std::string & id = decl->name;616 void Indexer::addUnion( UnionDecl * decl ) { 617 ++* stats().add_calls; 618 const std::string & id = decl->name; 614 619 615 620 if ( ! unionTable ) { 616 621 unionTable = UnionTable::new_ptr(); 617 622 } else { 618 ++* stats().map_lookups;623 ++* stats().map_lookups; 619 624 auto existing = unionTable->find( id ); 620 if ( existing != unionTable->end() 621 && existing->second.scope == scope 625 if ( existing != unionTable->end() 626 && existing->second.scope == scope 622 627 && addedDeclConflicts( existing->second.decl, decl ) ) return; 623 628 } 624 629 625 630 lazyInitScope(); 626 ++* stats().map_mutations;631 ++* stats().map_mutations; 627 632 unionTable = unionTable->set( id, Scoped<UnionDecl>{ decl, scope } ); 628 633 } 629 634 630 void Indexer::addTrait( TraitDecl * decl ) {631 ++* stats().add_calls;632 const std::string & id = decl->name;635 void Indexer::addTrait( TraitDecl * decl ) { 636 ++* stats().add_calls; 637 const std::string & id = decl->name; 633 638 634 639 if ( ! traitTable ) { 635 640 traitTable = TraitTable::new_ptr(); 636 641 } else { 637 ++* stats().map_lookups;642 ++* stats().map_lookups; 638 643 auto existing = traitTable->find( id ); 639 if ( existing != traitTable->end() 640 && existing->second.scope == scope 644 if ( existing != traitTable->end() 645 && existing->second.scope == scope 641 646 && addedDeclConflicts( existing->second.decl, decl ) ) return; 642 647 } 643 648 644 649 lazyInitScope(); 645 ++* stats().map_mutations;650 ++* stats().map_mutations; 646 651 traitTable = traitTable->set( id, Scoped<TraitDecl>{ decl, scope } ); 647 652 } 648 653 649 void Indexer::addMembers( AggregateDecl * aggr, Expression * expr, 654 void Indexer::addMembers( AggregateDecl * aggr, Expression * expr, 650 655 OnConflict handleConflicts ) { 651 656 for ( Declaration * decl : aggr->members ) { … … 654 659 if ( dwt->name == "" ) { 655 660 Type * t = dwt->get_type()->stripReferences(); 656 if ( dynamic_cast<StructInstType *>( t ) || dynamic_cast<UnionInstType*>( t ) ) {661 if ( dynamic_cast<StructInstType *>( t ) || dynamic_cast<UnionInstType *>( t ) ) { 657 662 Expression * base = expr->clone(); 658 663 ResolvExpr::Cost cost = ResolvExpr::Cost::zero; // xxx - carry this cost into the indexer as a base cost? -
src/SymTab/Indexer.h
r302d84c2 rfce4e31 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 NamedTypeDecl *lookupType( const std::string &id ) const; 65 const NamedTypeDecl * lookupType( const std::string & id ) const; 66 NamedTypeDecl * lookupMutableType( const std::string & id ) const; 66 67 /// Gets the top-most struct declaration with the given ID 67 StructDecl *lookupStruct( const std::string &id ) const; 68 const StructDecl * lookupStruct( const std::string & id ) const; 69 StructDecl * lookupMutableStruct( const std::string & id ) const; 68 70 /// Gets the top-most enum declaration with the given ID 69 EnumDecl *lookupEnum( const std::string &id ) const; 71 const EnumDecl * lookupEnum( const std::string & id ) const; 72 EnumDecl * lookupMutableEnum( const std::string & id ) const; 70 73 /// Gets the top-most union declaration with the given ID 71 UnionDecl *lookupUnion( const std::string &id ) const; 74 const UnionDecl * lookupUnion( const std::string & id ) const; 75 UnionDecl * lookupMutableUnion( const std::string & id ) const; 72 76 /// Gets the top-most trait declaration with the given ID 73 TraitDecl *lookupTrait( const std::string &id ) const; 77 const TraitDecl * lookupTrait( const std::string & id ) const; 78 TraitDecl * lookupMutableTrait( const std::string & id ) const; 74 79 75 80 /// Gets the type declaration with the given ID at global scope 76 NamedTypeDecl *globalLookupType( const std::string &id ) const;81 const NamedTypeDecl * globalLookupType( const std::string & id ) const; 77 82 /// Gets the struct declaration with the given ID at global scope 78 StructDecl *globalLookupStruct( const std::string &id ) const;83 const StructDecl * globalLookupStruct( const std::string & id ) const; 79 84 /// Gets the union declaration with the given ID at global scope 80 UnionDecl *globalLookupUnion( const std::string &id ) const;85 const UnionDecl * globalLookupUnion( const std::string & id ) const; 81 86 /// Gets the enum declaration with the given ID at global scope 82 EnumDecl *globalLookupEnum( const std::string &id ) const;87 const EnumDecl * globalLookupEnum( const std::string & id ) const; 83 88 84 89 void addId( DeclarationWithType * decl, Expression * baseExpr = nullptr ); 85 90 void addDeletedId( DeclarationWithType * decl, BaseSyntaxNode * deleteStmt ); 86 91 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 );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 ); 94 99 95 100 /// adds all of the IDs from WithStmt exprs … … 106 111 107 112 private: 108 /// Wraps a Decl * with a scope113 /// Wraps a Decl * with a scope 109 114 template<typename Decl> 110 115 struct Scoped { 111 Decl * decl; ///< declaration116 Decl * decl; ///< declaration 112 117 unsigned long scope; ///< scope of this declaration 113 118 114 Scoped(Decl * d, unsigned long s) : decl(d), scope(s) {}119 Scoped(Decl * d, unsigned long s) : decl(d), scope(s) {} 115 120 }; 116 121 … … 140 145 141 146 /// Gets the indexer at the given scope 142 const Indexer * atScope( unsigned long scope ) const;147 const Indexer * atScope( unsigned long scope ) const; 143 148 144 /// Removes matching autogenerated constructors and destructors so that they will not be 149 /// Removes matching autogenerated constructors and destructors so that they will not be 145 150 /// selected. If returns false, passed decl should not be added. 146 151 bool removeSpecialOverrides( IdData& decl, MangleTable::Ptr& mangleTable ); … … 166 171 /// true if the existing identifier conflicts with the added identifier 167 172 bool addedIdConflicts( 168 const IdData& existing, DeclarationWithType * added, OnConflict handleConflicts, 173 const IdData& existing, DeclarationWithType * added, OnConflict handleConflicts, 169 174 BaseSyntaxNode * deleteStmt ); 170 175 171 176 /// common code for addId, addDeletedId, etc. 172 void addId( 173 DeclarationWithType * decl, OnConflict handleConflicts, 177 void addId( 178 DeclarationWithType * decl, OnConflict handleConflicts, 174 179 Expression * baseExpr = nullptr, BaseSyntaxNode * deleteStmt = nullptr ); 175 180 … … 178 183 179 184 /// returns true if there exists a declaration with C linkage and the given name with the same mangled name 180 bool hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const;185 bool hasCompatibleCDecl( const std::string & id, const std::string &mangleName ) const; 181 186 /// returns true if there exists a declaration with C linkage and the given name with a different mangled name 182 bool hasIncompatibleCDecl( const std::string & id, const std::string &mangleName ) const;187 bool hasIncompatibleCDecl( const std::string & id, const std::string &mangleName ) const; 183 188 }; 184 189 } // namespace SymTab -
src/SymTab/Validate.cc
r302d84c2 rfce4e31 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->lookupEnum( enumInst->name );643 void LinkReferenceToTypes_old::postvisit( EnumInstType * enumInst ) { 644 EnumDecl * st = local_indexer->lookupMutableEnum( 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->lookupStruct( structInst->name );663 void LinkReferenceToTypes_old::postvisit( StructInstType * structInst ) { 664 StructDecl * st = local_indexer->lookupMutableStruct( 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->lookupUnion( unionInst->name );676 void LinkReferenceToTypes_old::postvisit( UnionInstType * unionInst ) { 677 UnionDecl * un = local_indexer->lookupMutableUnion( 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->lookupTrait( traitInst->name );764 TraitDecl * traitDecl = local_indexer->lookupMutableTrait( 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 ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->name ) ) {866 if ( TypeDecl *typeDecl = dynamic_cast<TypeDecl * >( namedTypeDecl ) ) {867 typeInst->set_isFtype( typeDecl-> get_kind()== TypeDecl::Ftype );865 if ( const NamedTypeDecl * namedTypeDecl = local_indexer->lookupType( typeInst->name ) ) { 866 if ( const TypeDecl * typeDecl = dynamic_cast< const TypeDecl * >( namedTypeDecl ) ) { 867 typeInst->set_isFtype( typeDecl->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
r302d84c2 rfce4e31 19 19 #include <list> // for list 20 20 21 classCodeLocation;22 class Declaration;23 class Type;21 struct 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
r302d84c2 rfce4e31 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 ); } 52 53 virtual Attribute * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 53 54 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/BaseSyntaxNode.h
r302d84c2 rfce4e31 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; 39 40 virtual BaseSyntaxNode * acceptMutator( Mutator & m ) = 0; 40 41 /// Notes: -
src/SynTree/Constant.h
r302d84c2 rfce4e31 33 33 virtual ~Constant(); 34 34 35 virtual Constant * clone() const { return new Constant( *this ); }35 virtual Constant * clone() const override { 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 ) { 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: 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 57 58 Type * type; 58 59 std::string rep; 59 60 std::optional<unsigned long long> ival; 60 61 friend class ConverterOldToNew;62 61 }; 63 62 -
src/SynTree/Declaration.h
r302d84c2 rfce4e31 63 63 void fixUniqueId( void ); 64 64 virtual Declaration *clone() const override = 0; 65 virtual void accept( Visitor &v ) override = 0; 65 virtual void accept( Visitor & v ) override = 0; 66 virtual void accept( Visitor & v ) const override = 0; 66 67 virtual Declaration *acceptMutator( Mutator &m ) override = 0; 67 68 virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0; … … 139 140 140 141 virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); } 141 virtual void accept( Visitor &v ) override { v.visit( this ); } 142 virtual void accept( Visitor & v ) override { v.visit( this ); } 143 virtual void accept( Visitor & v ) const override { v.visit( this ); } 142 144 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 143 145 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 169 171 170 172 virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); } 171 virtual void accept( Visitor &v ) override { v.visit( this ); } 173 virtual void accept( Visitor & v ) override { v.visit( this ); } 174 virtual void accept( Visitor & v ) const override { v.visit( this ); } 172 175 virtual DeclarationWithType *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 173 176 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 238 241 239 242 virtual TypeDecl *clone() const override { return new TypeDecl( *this ); } 240 virtual void accept( Visitor &v ) override { v.visit( this ); } 243 virtual void accept( Visitor & v ) override { v.visit( this ); } 244 virtual void accept( Visitor & v ) const override { v.visit( this ); } 241 245 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 242 246 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 256 260 257 261 virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); } 258 virtual void accept( Visitor &v ) override { v.visit( this ); } 262 virtual void accept( Visitor & v ) override { v.visit( this ); } 263 virtual void accept( Visitor & v ) const override { v.visit( this ); } 259 264 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 260 265 private: … … 300 305 301 306 virtual StructDecl *clone() const override { return new StructDecl( *this ); } 302 virtual void accept( Visitor &v ) override { v.visit( this ); } 307 virtual void accept( Visitor & v ) override { v.visit( this ); } 308 virtual void accept( Visitor & v ) const override { v.visit( this ); } 303 309 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 304 310 DeclarationNode::Aggregate kind; … … 314 320 315 321 virtual UnionDecl *clone() const override { return new UnionDecl( *this ); } 316 virtual void accept( Visitor &v ) override { v.visit( this ); } 322 virtual void accept( Visitor & v ) override { v.visit( this ); } 323 virtual void accept( Visitor & v ) const override { v.visit( this ); } 317 324 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 318 325 private: … … 329 336 330 337 virtual EnumDecl *clone() const override { return new EnumDecl( *this ); } 331 virtual void accept( Visitor &v ) override { v.visit( this ); } 338 virtual void accept( Visitor & v ) override { v.visit( this ); } 339 virtual void accept( Visitor & v ) const override { v.visit( this ); } 332 340 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 333 341 private: … … 345 353 346 354 virtual TraitDecl *clone() const override { return new TraitDecl( *this ); } 347 virtual void accept( Visitor &v ) override { v.visit( this ); } 355 virtual void accept( Visitor & v ) override { v.visit( this ); } 356 virtual void accept( Visitor & v ) const override { v.visit( this ); } 348 357 virtual Declaration *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 349 358 private: … … 363 372 364 373 virtual AsmDecl *clone() const override { return new AsmDecl( *this ); } 365 virtual void accept( Visitor &v ) override { v.visit( this ); } 374 virtual void accept( Visitor & v ) override { v.visit( this ); } 375 virtual void accept( Visitor & v ) const override { v.visit( this ); } 366 376 virtual AsmDecl *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 367 377 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 379 389 380 390 virtual StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); } 381 virtual void accept( Visitor &v ) override { v.visit( this ); } 391 virtual void accept( Visitor & v ) override { v.visit( this ); } 392 virtual void accept( Visitor & v ) const override { v.visit( this ); } 382 393 virtual StaticAssertDecl * acceptMutator( Mutator &m ) override { return m.mutate( this ); } 383 394 virtual void print( std::ostream &os, Indenter indent = {} ) const override; -
src/SynTree/Expression.h
r302d84c2 rfce4e31 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; 84 85 virtual Expression * acceptMutator( Mutator & m ) override = 0; 85 86 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 101 102 std::list<Expression *>& get_args() { return args; } 102 103 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; 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; 107 109 }; 108 110 … … 129 131 static UntypedExpr * createAssign( Expression * arg1, Expression * arg2 ); 130 132 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; 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; 135 138 }; 136 139 … … 147 150 void set_name( std::string newValue ) { name = newValue; } 148 151 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; 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; 153 157 }; 154 158 … … 168 172 void set_arg(Expression * newValue ) { arg = newValue; } 169 173 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; 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; 174 179 }; 175 180 … … 184 189 virtual ~LabelAddressExpr(); 185 190 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; 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; 190 196 }; 191 197 … … 205 211 void set_arg( Expression * newValue ) { arg = newValue; } 206 212 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; 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; 211 218 }; 212 219 … … 225 232 const std::string & targetString() const; 226 233 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; 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; 231 239 }; 232 240 … … 243 251 void set_arg( Expression * newValue ) { arg = newValue; } 244 252 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; 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; 249 258 }; 250 259 … … 264 273 void set_aggregate( Expression * newValue ) { aggregate = newValue; } 265 274 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; 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; 270 280 }; 271 281 … … 286 296 void set_aggregate( Expression * newValue ) { aggregate = newValue; } 287 297 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; 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; 292 303 }; 293 304 … … 308 319 static VariableExpr * functionPointer( FunctionDecl * decl ); 309 320 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; 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; 314 326 }; 315 327 … … 329 341 long long int intValue() const; 330 342 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; 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; 335 348 }; 336 349 … … 354 367 void set_isType( bool newValue ) { isType = newValue; } 355 368 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; 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; 360 374 }; 361 375 … … 379 393 void set_isType( bool newValue ) { isType = newValue; } 380 394 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; 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; 385 400 }; 386 401 … … 400 415 void set_type( Type * newValue ) { type = newValue; } 401 416 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; 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; 406 422 }; 407 423 … … 421 437 void set_member( DeclarationWithType * newValue ) { member = newValue; } 422 438 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; 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; 427 444 }; 428 445 … … 439 456 void set_type( StructInstType * newValue ) { type = newValue; } 440 457 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; 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; 445 463 }; 446 464 … … 467 485 void set_isType( bool newValue ) { isType = newValue; } 468 486 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; 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; 473 492 }; 474 493 … … 489 508 void set_arg2( Expression * newValue ) { arg2 = newValue; } 490 509 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; 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; 495 515 496 516 private: … … 516 536 void set_arg3( Expression * newValue ) { arg3 = newValue; } 517 537 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; 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; 522 543 }; 523 544 … … 537 558 void set_arg2( Expression * newValue ) { arg2 = newValue; } 538 559 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; 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; 543 565 }; 544 566 … … 555 577 void set_type( Type * newValue ) { type = newValue; } 556 578 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; 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; 561 584 }; 562 585 … … 581 604 void set_operand( Expression * newValue ) { operand = newValue; } 582 605 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; 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; 587 611 588 612 // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints … … 599 623 virtual ~ImplicitCopyCtorExpr(); 600 624 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; 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; 605 630 }; 606 631 … … 617 642 void set_callExpr( Expression * newValue ) { callExpr = newValue; } 618 643 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; 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; 623 649 }; 624 650 … … 635 661 void set_initializer( Initializer * i ) { initializer = i; } 636 662 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; 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; 641 668 }; 642 669 … … 654 681 RangeExpr * set_high( Expression * high ) { RangeExpr::high = high; return this; } 655 682 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; 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; 660 688 }; 661 689 … … 671 699 std::list<Expression*>& get_exprs() { return exprs; } 672 700 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; 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; 677 706 }; 678 707 … … 688 717 std::list<Expression*>& get_exprs() { return exprs; } 689 718 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; 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; 694 724 }; 695 725 … … 709 739 TupleIndexExpr * set_index( unsigned int newValue ) { index = newValue; return this; } 710 740 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; 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; 715 746 }; 716 747 … … 727 758 StmtExpr * get_stmtExpr() const { return stmtExpr; } 728 759 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; 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; 733 765 734 766 friend class ConverterNewToOld; … … 760 792 std::list< Expression * > & get_dtors() { return dtors; } 761 793 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; 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; 766 799 }; 767 800 … … 787 820 int get_id() const { return id; } 788 821 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; 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; 793 827 794 828 private: … … 821 855 std::list<InitAlternative> & get_initAlts() { return initAlts; } 822 856 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; 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; 827 862 }; 828 863 … … 842 877 InitExpr * set_designation( Designation * newValue ) { designation = newValue; return this; } 843 878 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; 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; 848 884 }; 849 885 … … 858 894 ~DeletedExpr(); 859 895 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; 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; 864 901 }; 865 902 … … 873 910 ~DefaultArgExpr(); 874 911 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; 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; 879 917 }; 880 918 … … 901 939 virtual ~GenericExpr(); 902 940 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; 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; 907 946 }; 908 947 -
src/SynTree/Initializer.h
r302d84c2 rfce4e31 38 38 39 39 virtual Designation * clone() const override { return new Designation( *this ); }; 40 virtual void accept( Visitor &v ) override { v.visit( this ); } 40 virtual void accept( Visitor & v ) override { v.visit( this ); } 41 virtual void accept( Visitor & v ) const override { v.visit( this ); } 41 42 virtual Designation * acceptMutator( Mutator &m ) override { return m.mutate( this ); } 42 43 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 52 53 virtual ~Initializer(); 53 54 54 bool get_maybeConstructed() { return maybeConstructed; }55 bool get_maybeConstructed() const { return maybeConstructed; } 55 56 56 57 virtual Initializer *clone() const override = 0; 57 virtual void accept( Visitor &v ) override = 0; 58 virtual void accept( Visitor & v ) override = 0; 59 virtual void accept( Visitor & v ) const override = 0; 58 60 virtual Initializer *acceptMutator( Mutator &m ) override = 0; 59 61 virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0; … … 76 78 77 79 virtual SingleInit *clone() const override { return new SingleInit( *this); } 78 virtual void accept( Visitor &v ) override { v.visit( this ); } 80 virtual void accept( Visitor & v ) override { v.visit( this ); } 81 virtual void accept( Visitor & v ) const override { v.visit( this ); } 79 82 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 80 83 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 104 107 105 108 virtual ListInit *clone() const override { return new ListInit( *this ); } 106 virtual void accept( Visitor &v ) override { v.visit( this ); } 109 virtual void accept( Visitor & v ) override { v.visit( this ); } 110 virtual void accept( Visitor & v ) const override { v.visit( this ); } 107 111 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 108 112 virtual void print( std::ostream &os, Indenter indent = {} ) const override; … … 133 137 134 138 ConstructorInit *clone() const override { return new ConstructorInit( *this ); } 135 virtual void accept( Visitor &v ) override { v.visit( this ); } 139 virtual void accept( Visitor & v ) override { v.visit( this ); } 140 virtual void accept( Visitor & v ) const override { v.visit( this ); } 136 141 virtual Initializer *acceptMutator( Mutator &m ) override { return m.mutate( this ); } 137 142 virtual void print( std::ostream &os, Indenter indent = {} ) const override; -
src/SynTree/Statement.h
r302d84c2 rfce4e31 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; 47 48 virtual Statement * acceptMutator( Mutator & m ) override = 0; 48 49 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 64 65 virtual CompoundStmt * clone() const override { return new CompoundStmt( *this ); } 65 66 virtual void accept( Visitor & v ) override { v.visit( this ); } 67 virtual void accept( Visitor & v ) const override { v.visit( this ); } 66 68 virtual CompoundStmt * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 67 69 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 74 76 virtual NullStmt * clone() const override { return new NullStmt( *this ); } 75 77 virtual void accept( Visitor & v ) override { v.visit( this ); } 78 virtual void accept( Visitor & v ) const override { v.visit( this ); } 76 79 virtual NullStmt * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 77 80 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 91 94 virtual ExprStmt * clone() const override { return new ExprStmt( *this ); } 92 95 virtual void accept( Visitor & v ) override { v.visit( this ); } 96 virtual void accept( Visitor & v ) const override { v.visit( this ); } 93 97 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 94 98 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 120 124 void set_gotolabels( const std::list<Label> & newValue ) { gotolabels = newValue; } 121 125 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; 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; 126 131 }; 127 132 … … 133 138 virtual ~DirectiveStmt(){} 134 139 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; 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; 139 145 }; 140 146 … … 161 167 virtual IfStmt * clone() const override { return new IfStmt( *this ); } 162 168 virtual void accept( Visitor & v ) override { v.visit( this ); } 169 virtual void accept( Visitor & v ) const override { v.visit( this ); } 163 170 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 164 171 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 180 187 181 188 virtual void accept( Visitor & v ) override { v.visit( this ); } 189 virtual void accept( Visitor & v ) const override { v.visit( this ); } 182 190 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 183 191 … … 208 216 209 217 virtual void accept( Visitor & v ) override { v.visit( this ); } 218 virtual void accept( Visitor & v ) const override { v.visit( this ); } 210 219 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 211 220 … … 236 245 virtual WhileStmt * clone() const override { return new WhileStmt( *this ); } 237 246 virtual void accept( Visitor & v ) override { v.visit( this ); } 247 virtual void accept( Visitor & v ) const override { v.visit( this ); } 238 248 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 239 249 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 261 271 virtual ForStmt * clone() const override { return new ForStmt( *this ); } 262 272 virtual void accept( Visitor & v ) override { v.visit( this ); } 273 virtual void accept( Visitor & v ) const override { v.visit( this ); } 263 274 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 264 275 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 290 301 virtual BranchStmt * clone() const override { return new BranchStmt( *this ); } 291 302 virtual void accept( Visitor & v ) override { v.visit( this ); } 303 virtual void accept( Visitor & v ) const override { v.visit( this ); } 292 304 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 293 305 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 309 321 virtual ReturnStmt * clone() const override { return new ReturnStmt( *this ); } 310 322 virtual void accept( Visitor & v ) override { v.visit( this ); } 323 virtual void accept( Visitor & v ) const override { v.visit( this ); } 311 324 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 312 325 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 333 346 virtual ThrowStmt * clone() const override { return new ThrowStmt( *this ); } 334 347 virtual void accept( Visitor & v ) override { v.visit( this ); } 348 virtual void accept( Visitor & v ) const override { v.visit( this ); } 335 349 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 336 350 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 356 370 virtual TryStmt * clone() const override { return new TryStmt( *this ); } 357 371 virtual void accept( Visitor & v ) override { v.visit( this ); } 372 virtual void accept( Visitor & v ) const override { v.visit( this ); } 358 373 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 359 374 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 384 399 virtual CatchStmt * clone() const override { return new CatchStmt( *this ); } 385 400 virtual void accept( Visitor & v ) override { v.visit( this ); } 401 virtual void accept( Visitor & v ) const override { v.visit( this ); } 386 402 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 387 403 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 401 417 virtual FinallyStmt * clone() const override { return new FinallyStmt( *this ); } 402 418 virtual void accept( Visitor & v ) override { v.visit( this ); } 419 virtual void accept( Visitor & v ) const override { v.visit( this ); } 403 420 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 404 421 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 438 455 virtual WaitForStmt * clone() const override { return new WaitForStmt( *this ); } 439 456 virtual void accept( Visitor & v ) override { v.visit( this ); } 457 virtual void accept( Visitor & v ) const override { v.visit( this ); } 440 458 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 441 459 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 454 472 virtual WithStmt * clone() const override { return new WithStmt( *this ); } 455 473 virtual void accept( Visitor & v ) override { v.visit( this ); } 474 virtual void accept( Visitor & v ) const override { v.visit( this ); } 456 475 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 457 476 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 473 492 virtual DeclStmt * clone() const override { return new DeclStmt( *this ); } 474 493 virtual void accept( Visitor & v ) override { v.visit( this ); } 494 virtual void accept( Visitor & v ) const override { v.visit( this ); } 475 495 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 476 496 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 494 514 virtual ImplicitCtorDtorStmt * clone() const override { return new ImplicitCtorDtorStmt( *this ); } 495 515 virtual void accept( Visitor & v ) override { v.visit( this ); } 516 virtual void accept( Visitor & v ) const override { v.visit( this ); } 496 517 virtual Statement * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 497 518 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/Type.h
r302d84c2 rfce4e31 144 144 145 145 Qualifiers & get_qualifiers() { return tq; } 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; }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; } 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; 186 187 virtual Type *acceptMutator( Mutator & m ) = 0; 187 188 virtual void print( std::ostream & os, Indenter indent = {} ) const; … … 201 202 virtual VoidType *clone() const override { return new VoidType( *this ); } 202 203 virtual void accept( Visitor & v ) override { v.visit( this ); } 204 virtual void accept( Visitor & v ) const override { v.visit( this ); } 203 205 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 204 206 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 259 261 virtual BasicType *clone() const override { return new BasicType( *this ); } 260 262 virtual void accept( Visitor & v ) override { v.visit( this ); } 263 virtual void accept( Visitor & v ) const override { v.visit( this ); } 261 264 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 262 265 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 294 297 virtual PointerType *clone() const override { return new PointerType( *this ); } 295 298 virtual void accept( Visitor & v ) override { v.visit( this ); } 299 virtual void accept( Visitor & v ) const override { v.visit( this ); } 296 300 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 297 301 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 325 329 virtual ArrayType *clone() const override { return new ArrayType( *this ); } 326 330 virtual void accept( Visitor & v ) override { v.visit( this ); } 331 virtual void accept( Visitor & v ) const override { v.visit( this ); } 327 332 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 328 333 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 340 345 virtual QualifiedType *clone() const override { return new QualifiedType( *this ); } 341 346 virtual void accept( Visitor & v ) override { v.visit( this ); } 347 virtual void accept( Visitor & v ) const override { v.visit( this ); } 342 348 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 343 349 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 366 372 virtual ReferenceType *clone() const override { return new ReferenceType( *this ); } 367 373 virtual void accept( Visitor & v ) override { v.visit( this ); } 374 virtual void accept( Visitor & v ) const override { v.visit( this ); } 368 375 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 369 376 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 395 402 virtual FunctionType *clone() const override { return new FunctionType( *this ); } 396 403 virtual void accept( Visitor & v ) override { v.visit( this ); } 404 virtual void accept( Visitor & v ) const override { v.visit( this ); } 397 405 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 398 406 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 455 463 virtual StructInstType *clone() const override { return new StructInstType( *this ); } 456 464 virtual void accept( Visitor & v ) override { v.visit( this ); } 465 virtual void accept( Visitor & v ) const override { v.visit( this ); } 457 466 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 458 467 … … 492 501 virtual UnionInstType *clone() const override { return new UnionInstType( *this ); } 493 502 virtual void accept( Visitor & v ) override { v.visit( this ); } 503 virtual void accept( Visitor & v ) const override { v.visit( this ); } 494 504 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 495 505 … … 519 529 virtual EnumInstType *clone() const override { return new EnumInstType( *this ); } 520 530 virtual void accept( Visitor & v ) override { v.visit( this ); } 531 virtual void accept( Visitor & v ) const override { v.visit( this ); } 521 532 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 522 533 … … 542 553 virtual TraitInstType *clone() const override { return new TraitInstType( *this ); } 543 554 virtual void accept( Visitor & v ) override { v.visit( this ); } 555 virtual void accept( Visitor & v ) const override { v.visit( this ); } 544 556 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 545 557 private: … … 569 581 virtual TypeInstType *clone() const override { return new TypeInstType( *this ); } 570 582 virtual void accept( Visitor & v ) override { v.visit( this ); } 583 virtual void accept( Visitor & v ) const override { v.visit( this ); } 571 584 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 572 585 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 606 619 virtual TupleType *clone() const override { return new TupleType( *this ); } 607 620 virtual void accept( Visitor & v ) override { v.visit( this ); } 621 virtual void accept( Visitor & v ) const override { v.visit( this ); } 608 622 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 609 623 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 616 630 617 631 TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 618 TypeofType( const Type::Qualifiers & tq, Expression *expr, bool is_basetypeof, 632 TypeofType( const Type::Qualifiers & tq, Expression *expr, bool is_basetypeof, 619 633 const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 620 634 TypeofType( const TypeofType& ); … … 628 642 virtual TypeofType *clone() const override { return new TypeofType( *this ); } 629 643 virtual void accept( Visitor & v ) override { v.visit( this ); } 644 virtual void accept( Visitor & v ) const override { v.visit( this ); } 630 645 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 631 646 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 657 672 virtual AttrType *clone() const override { return new AttrType( *this ); } 658 673 virtual void accept( Visitor & v ) override { v.visit( this ); } 674 virtual void accept( Visitor & v ) const override { v.visit( this ); } 659 675 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 660 676 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 671 687 virtual VarArgsType *clone() const override { return new VarArgsType( *this ); } 672 688 virtual void accept( Visitor & v ) override { v.visit( this ); } 689 virtual void accept( Visitor & v ) const override { v.visit( this ); } 673 690 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 674 691 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 683 700 virtual ZeroType *clone() const override { return new ZeroType( *this ); } 684 701 virtual void accept( Visitor & v ) override { v.visit( this ); } 702 virtual void accept( Visitor & v ) const override { v.visit( this ); } 685 703 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 686 704 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 695 713 virtual OneType *clone() const override { return new OneType( *this ); } 696 714 virtual void accept( Visitor & v ) override { v.visit( this ); } 715 virtual void accept( Visitor & v ) const override { v.visit( this ); } 697 716 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 698 717 virtual void print( std::ostream & os, Indenter indent = {} ) const override; … … 705 724 virtual GlobalScopeType *clone() const override { return new GlobalScopeType( *this ); } 706 725 virtual void accept( Visitor & v ) override { v.visit( this ); } 726 virtual void accept( Visitor & v ) const override { v.visit( this ); } 707 727 virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); } 708 728 virtual void print( std::ostream & os, Indenter indent = {} ) const override; -
src/SynTree/Visitor.h
r302d84c2 rfce4e31 27 27 // of the given syntax node, but performs no other action. 28 28 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; 39 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; 60 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; 99 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; 119 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; 124 125 virtual void visit( Constant * constant ) = 0; 126 127 virtual void visit( Attribute * attribute ) = 0; 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; 49 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; 90 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; 167 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; 206 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; 215 216 virtual void visit( Constant * node ) { visit( const_cast<const Constant *>(node) ); } 217 virtual void visit( const Constant * constant ) = 0; 218 219 virtual void visit( Attribute * node ) { visit( const_cast<const Attribute *>(node) ); } 220 virtual void visit( const Attribute * attribute ) = 0; 128 221 }; 129 222 -
src/Tuples/Explode.h
r302d84c2 rfce4e31 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 * expr, const ResolvExpr::Candidate & arg,177 const ast::SymbolTable & symtab, Output && out176 const ast::CastExpr *, const ResolvExpr::Candidate &, 177 const ast::SymbolTable &, Output && 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
r302d84c2 rfce4e31 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; 432 433 433 434 virtual std::vector< ast::ptr< ast::Expr > > match() = 0; 434 435 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 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 437 438 /// bindings to the env 438 439 struct EnvRemover { … … 455 456 ast::ObjectDecl * newObject( UniqueName & namer, const ast::Expr * expr ) { 456 457 assert( expr->result && ! expr->result->isVoid() ); 457 458 ast::ObjectDecl * ret = new ast::ObjectDecl{ 459 location, namer.newName(), expr->result, new ast::SingleInit{ location, expr }, 458 459 ast::ObjectDecl * ret = new ast::ObjectDecl{ 460 location, namer.newName(), expr->result, new ast::SingleInit{ location, expr }, 460 461 ast::Storage::Classes{}, ast::Linkage::Cforall }; 461 462 462 463 // if expression type is a reference, just need an initializer, otherwise construct 463 464 if ( ! expr->result.as< ast::ReferenceType >() ) { 464 465 // resolve ctor/dtor for the new object 465 ast::ptr< ast::Init > ctorInit = ResolvExpr::resolveCtorInit( 466 ast::ptr< ast::Init > ctorInit = ResolvExpr::resolveCtorInit( 466 467 InitTweak::genCtorInit( location, ret ), spotter.crntFinder.symtab ); 467 468 // remove environments from subexpressions of stmtExpr … … 474 475 } 475 476 476 ast::UntypedExpr * createFunc( 477 const std::string & fname, const ast::ObjectDecl * left, 478 const ast::ObjectDecl * right 477 ast::UntypedExpr * createFunc( 478 const std::string & fname, const ast::ObjectDecl * left, 479 const ast::ObjectDecl * right 479 480 ) { 480 481 assert( left ); … … 486 487 args.front() = new ast::AddressExpr{ location, args.front() }; 487 488 if ( right ) { args.back() = new ast::AddressExpr{ location, args.back() }; } 488 return new ast::UntypedExpr{ 489 return new ast::UntypedExpr{ 489 490 location, new ast::NameExpr{ location, "?=?" }, std::move(args) }; 490 491 } else { 491 return new ast::UntypedExpr{ 492 return new ast::UntypedExpr{ 492 493 location, new ast::NameExpr{ location, fname }, std::move(args) }; 493 494 } … … 498 499 struct MassAssignMatcher final : public Matcher { 499 500 MassAssignMatcher( 500 TupleAssignSpotter_new & s, const CodeLocation & loc, 501 TupleAssignSpotter_new & s, const CodeLocation & loc, 501 502 const ResolvExpr::CandidateList & l, const ResolvExpr::CandidateList & r ) 502 503 : Matcher( s, loc, l, r ) {} … … 508 509 assert( lhs.empty() ? rhs.empty() : rhs.size() <= 1 ); 509 510 510 ast::ptr< ast::ObjectDecl > rtmp = 511 ast::ptr< ast::ObjectDecl > rtmp = 511 512 rhs.size() == 1 ? newObject( rhsNamer, rhs.front()->expr ) : nullptr; 512 513 513 514 std::vector< ast::ptr< ast::Expr > > out; 514 515 for ( ResolvExpr::CandidateRef & lhsCand : lhs ) { 515 // create a temporary object for each value in the LHS and create a call 516 // create a temporary object for each value in the LHS and create a call 516 517 // involving the RHS 517 518 ast::ptr< ast::ObjectDecl > ltmp = newObject( lhsNamer, lhsCand->expr ); … … 528 529 struct MultipleAssignMatcher final : public Matcher { 529 530 MultipleAssignMatcher( 530 TupleAssignSpotter_new & s, const CodeLocation & loc, 531 TupleAssignSpotter_new & s, const CodeLocation & loc, 531 532 const ResolvExpr::CandidateList & l, const ResolvExpr::CandidateList & r ) 532 533 : Matcher( s, loc, l, r ) {} … … 538 539 if ( lhs.size() != rhs.size() ) return {}; 539 540 540 // produce a new temporary object for each value in the LHS and RHS and pairwise 541 // produce a new temporary object for each value in the LHS and RHS and pairwise 541 542 // create the calls 542 543 std::vector< ast::ptr< ast::ObjectDecl > > ltmp, rtmp; … … 547 548 ResolvExpr::CandidateRef & rhsCand = rhs[i]; 548 549 549 // convert RHS to LHS type minus one reference -- important for case where LHS 550 // convert RHS to LHS type minus one reference -- important for case where LHS 550 551 // is && and RHS is lvalue 551 552 auto lhsType = lhsCand->expr->result.strict_as< ast::ReferenceType >(); … … 557 558 rtmp.emplace_back( std::move( robj ) ); 558 559 559 // resolve the cast expression so that rhsCand return type is bound by the cast 560 // resolve the cast expression so that rhsCand return type is bound by the cast 560 561 // type as needed, and transfer the resulting environment 561 562 ResolvExpr::CandidateFinder finder{ spotter.crntFinder.symtab, env }; … … 564 565 env = std::move( finder.candidates.front()->env ); 565 566 } 566 567 567 568 splice( tmpDecls, ltmp ); 568 569 splice( tmpDecls, rtmp ); 569 570 570 571 return out; 571 572 } … … 575 576 std::string fname; 576 577 std::unique_ptr< Matcher > matcher; 577 578 578 579 public: 579 TupleAssignSpotter_new( ResolvExpr::CandidateFinder & f ) 580 TupleAssignSpotter_new( ResolvExpr::CandidateFinder & f ) 580 581 : crntFinder( f ), fname(), matcher() {} 581 582 582 583 // find left- and right-hand-sides for mass or multiple assignment 583 void spot( 584 const ast::UntypedExpr * expr, std::vector< ResolvExpr::CandidateFinder > & args 584 void spot( 585 const ast::UntypedExpr * expr, std::vector< ResolvExpr::CandidateFinder > & args 585 586 ) { 586 587 if ( auto op = expr->func.as< ast::NameExpr >() ) { … … 599 600 if ( ! refToTuple( lhsCand->expr ) ) continue; 600 601 601 // explode is aware of casts - ensure every LHS is sent into explode with a 602 // explode is aware of casts - ensure every LHS is sent into explode with a 602 603 // reference cast 603 604 if ( ! lhsCand->expr.as< ast::CastExpr >() ) { 604 lhsCand->expr = new ast::CastExpr{ 605 lhsCand->expr = new ast::CastExpr{ 605 606 lhsCand->expr, new ast::ReferenceType{ lhsCand->expr->result } }; 606 607 } … … 610 611 explode( *lhsCand, crntFinder.symtab, back_inserter(lhs), true ); 611 612 for ( ResolvExpr::CandidateRef & cand : lhs ) { 612 // each LHS value must be a reference - some come in with a cast, if not 613 // each LHS value must be a reference - some come in with a cast, if not 613 614 // just cast to reference here 614 615 if ( ! cand->expr->result.as< ast::ReferenceType >() ) { … … 629 630 // multiple assignment 630 631 explode( *rhsCand, crntFinder.symtab, back_inserter(rhs), true ); 631 matcher.reset( 632 matcher.reset( 632 633 new MultipleAssignMatcher{ *this, expr->location, lhs, rhs } ); 633 634 } else { 634 635 // mass assignment 635 636 rhs.emplace_back( rhsCand ); 636 matcher.reset( 637 matcher.reset( 637 638 new MassAssignMatcher{ *this, expr->location, lhs, rhs } ); 638 639 } … … 642 643 // expand all possible RHS possibilities 643 644 std::vector< ResolvExpr::CandidateList > rhsCands; 644 combos( 645 combos( 645 646 std::next( args.begin(), 1 ), args.end(), back_inserter( rhsCands ) ); 646 647 for ( const ResolvExpr::CandidateList & rhsCand : rhsCands ) { … … 648 649 ResolvExpr::CandidateList rhs; 649 650 explode( rhsCand, crntFinder.symtab, back_inserter(rhs), true ); 650 matcher.reset( 651 matcher.reset( 651 652 new MultipleAssignMatcher{ *this, expr->location, lhs, rhs } ); 652 653 match(); … … 663 664 664 665 if ( ! ( matcher->lhs.empty() && matcher->rhs.empty() ) ) { 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 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 667 668 // candidates are generated 668 669 if ( newAssigns.empty() ) return; … … 692 693 } 693 694 694 // extract expressions from the assignment candidates to produce a list of assignments 695 // extract expressions from the assignment candidates to produce a list of assignments 695 696 // that together form a sigle candidate 696 697 std::vector< ast::ptr< ast::Expr > > solved; … … 701 702 702 703 crntFinder.candidates.emplace_back( std::make_shared< ResolvExpr::Candidate >( 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 ), 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 ), 706 707 ResolvExpr::sumCost( crnt ) + matcher->baseCost ) ); 707 708 } … … 709 710 } // anonymous namespace 710 711 711 void handleTupleAssignment( 712 ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 712 void handleTupleAssignment( 713 ResolvExpr::CandidateFinder & finder, const ast::UntypedExpr * assign, 713 714 std::vector< ResolvExpr::CandidateFinder > & args 714 715 ) {
Note:
See TracChangeset
for help on using the changeset viewer.