@@ -1372,6 +1372,9 @@ bool Converter::VisitDeclStmt(clang::DeclStmt *stmt) {
13721372 hoisted_records_ += std::move (buf).str ();
13731373 continue ;
13741374 }
1375+ if (var && IsAliasOfInit (ctx_, var)) {
1376+ continue ;
1377+ }
13751378 if (var && var->isImplicit ()) {
13761379 VisitVarDecl (var);
13771380 } else {
@@ -1487,112 +1490,25 @@ bool Converter::VisitForStmt(clang::ForStmt *stmt) {
14871490 return false ;
14881491}
14891492
1490- void Converter::ConvertLoopVariable (clang::VarDecl *decl,
1491- clang::Expr *range_init) {
1492- auto loop_var_type = decl->getType ();
1493- auto loop_var_name = GetNamedDeclAsString (decl);
1494-
1495- if (loop_var_type->isReferenceType ()) {
1496- auto pointee_type = loop_var_type->getPointeeType ();
1497- Convert (range_init);
1498- if (pointee_type.isConstQualified ()) {
1499- StrCat (std::format (" .as_ptr().add({})" , loop_var_name));
1500- } else {
1501- StrCat (std::format (" .as_mut_ptr().add({})" , loop_var_name));
1502- }
1503- } else {
1504- {
1505- PushExplicitAutoref autoref (*this , /* is_mut=*/ false );
1506- Convert (range_init);
1507- }
1508- StrCat (std::format (" [{}]" , loop_var_name));
1509- StrCat (" .clone()" );
1510- }
1511- }
1512-
1513- void Converter::ConvertForRangeBody (clang::CXXForRangeStmt *stmt) {
1514- PushBreakTarget push (break_target_, BreakTarget::Loop);
1515- curr_for_inc_.emplace_back (nullptr );
1516- ConvertBodyStmts (stmt->getBody ());
1517- curr_for_inc_.pop_back ();
1518- }
1519-
15201493bool Converter::VisitCXXForRangeStmt (clang::CXXForRangeStmt *stmt) {
1521- auto range_init_type = stmt->getRangeInit ()->getType ();
1522-
1523- if (!Mapper::Contains (ctx_, range_init_type.getUnqualifiedType ())) {
1524- // FIXME: improve error handling
1525- log () << " for range stmts only for types in std namespace\n " ;
1526- }
1527-
1528- log () << " GetClassName: " << GetClassName (range_init_type) << ' \n ' ;
1529-
1530- if (GetClassName (range_init_type) == " std::map" ) {
1531- return VisitCXXForRangeStmtMap (stmt);
1532- }
1533- if (GetClassName (range_init_type) == " std::basic_string" ) {
1534- return VisitCXXForRangeStmtString (stmt);
1535- }
1536- return VisitCXXForRangeStmtVector (stmt);
1537- }
1538-
1539- bool Converter::VisitCXXForRangeStmtMap (clang::CXXForRangeStmt *stmt) {
1540- auto begin =
1541- llvm::cast<clang::VarDecl>(stmt->getBeginStmt ()->getSingleDecl ());
1542-
1494+ PushBreakTarget push (break_target_, BreakTarget::Loop);
1495+ Convert (stmt->getInit ());
1496+ Convert (stmt->getRangeStmt ());
1497+ auto *begin =
1498+ clang::cast<clang::VarDecl>(stmt->getBeginStmt ()->getSingleDecl ());
1499+ auto *end = clang::cast<clang::VarDecl>(stmt->getEndStmt ()->getSingleDecl ());
1500+ begin->setDeclName (stmt->getLoopVariable ()->getDeclName ());
15431501 StrCat (" 'loop_:" );
1544- auto map_type = Mapper::Map (*this , stmt->getRangeInit ()->getType ());
15451502 StrCat (keyword::kFor , GetNamedDeclAsString (begin), keyword::kIn ,
1546- " UnsafeMap::range(&" );
1547- Convert (stmt->getRangeInit ());
1548- StrCat (std::format (" as *const {})" , map_type));
1503+ " IterRange::new(" , ConvertFreshRValue (begin->getInit ()), token::kComma ,
1504+ ConvertFreshRValue (end->getInit ()), ' )' );
15491505 {
15501506 PushBrace brace (*this );
1507+ curr_for_inc_.emplace_back (nullptr );
15511508 Convert (stmt->getLoopVarStmt ());
1552- ConvertForRangeBody (stmt);
1553- }
1554-
1555- return false ;
1556- }
1557-
1558- bool Converter::VisitCXXForRangeStmtString (clang::CXXForRangeStmt *stmt) {
1559- return VisitCXXForRangeStmtIndexBased (stmt, " len()-1" );
1560- }
1561-
1562- bool Converter::VisitCXXForRangeStmtVector (clang::CXXForRangeStmt *stmt) {
1563- return VisitCXXForRangeStmtIndexBased (stmt, " len()" );
1564- }
1565-
1566- bool Converter::VisitCXXForRangeStmtIndexBased (clang::CXXForRangeStmt *stmt,
1567- const char *len_suffix) {
1568- auto *loop_var = stmt->getLoopVariable ();
1569- auto loop_var_name = GetNamedDeclAsString (loop_var);
1570-
1571- StrCat (" 'loop_:" );
1572- StrCat (keyword::kFor , loop_var_name, keyword::kIn , " 0.." );
1573- {
1574- PushParen range (*this );
1575- Convert (stmt->getRangeInit ());
1576- StrCat (token::kDot , len_suffix);
1577- }
1578- {
1579- PushBrace body (*this );
1580- StrCat (keyword::kLet );
1581-
1582- auto loop_var_type = loop_var->getType ();
1583- if (!loop_var_type.isConstQualified ()) {
1584- StrCat (keyword_mut_);
1585- }
1586-
1587- StrCat (loop_var_name);
1588- StrCat (token::kAssign );
1589-
1590- ConvertLoopVariable (loop_var, stmt->getRangeInit ());
1591-
1592- StrCat (token::kSemiColon );
1593- ConvertForRangeBody (stmt);
1509+ ConvertBodyStmts (stmt->getBody ());
1510+ curr_for_inc_.pop_back ();
15941511 }
1595-
15961512 return false ;
15971513}
15981514
@@ -3268,6 +3184,11 @@ bool Converter::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
32683184 Convert (init);
32693185 return false ;
32703186 }
3187+ if (auto var = clang::dyn_cast<clang::VarDecl>(expr->getDecl ());
3188+ var && IsAliasOfInit (ctx_, var)) {
3189+ Convert (var->getInit ());
3190+ return false ;
3191+ }
32713192 ConvertDeclRefValue (expr, expr->getDecl ());
32723193 return false ;
32733194}
0 commit comments