@@ -818,26 +818,26 @@ bool ConverterRefCount::VisitConditionalOperator(
818818 return false ;
819819}
820820
821- bool ConverterRefCount::VisitDeclRefExpr (clang::DeclRefExpr *expr) {
821+ void ConverterRefCount::ConvertDeclRefValue (clang::Expr *expr,
822+ clang::ValueDecl *decl) {
822823 if (isAddrOf ()) {
823824 clang::Expr *addrof_op = ToAddrOf (ctx_, expr);
824825 if (auto str = GetMappedAsString (addrof_op); !str.empty ()) {
825826 StrCat (str);
826827 SetFreshType (expr->getType ());
827- return false ;
828+ return ;
828829 }
829830 }
830831
831- if (ShouldReplaceWithMappedBody (expr )) {
832+ if (ShouldReplaceWithMappedBody (decl )) {
832833 if (auto str = GetMappedAsString (expr); !str.empty ()) {
833834 StrCat (str);
834835 SetFreshType (expr->getType ());
835- return false ;
836+ return ;
836837 }
837838 }
838839
839- auto str = ConvertDeclRefExpr (expr);
840- auto decl = expr->getDecl ();
840+ auto str = ConvertDeclRef (expr, decl);
841841
842842 if (auto fn_decl = clang::dyn_cast<clang::FunctionDecl>(decl)) {
843843 if (isAddrOf ()) {
@@ -846,18 +846,19 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
846846 StrCat (str);
847847 SetFreshType (expr->getType ());
848848 }
849- return false ;
849+ return ;
850850 }
851851
852852 if (clang::isa<clang::EnumConstantDecl>(decl)) {
853853 StrCat (str);
854854 computed_expr_type_ = ComputedExprType::FreshValue;
855- return false ;
855+ return ;
856856 }
857857
858858 const auto decl_t = decl->getType ();
859859 bool is_global_value = false , is_global_ptr = false ;
860- if (IsGlobalVar (expr)) {
860+ if (auto *var = clang::dyn_cast<clang::VarDecl>(decl);
861+ var && IsGlobalVar (var)) {
861862 if (decl_t ->isReferenceType ()) {
862863 str += " .with(Ptr::clone)" ;
863864 is_global_ptr = true ;
@@ -870,15 +871,15 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
870871 if (map_iter_decls_.contains (clang::dyn_cast<clang::VarDecl>(decl))) {
871872 StrCat (str);
872873 SetValueFreshness (expr->getType ());
873- return false ;
874+ return ;
874875 }
875876
876877 if (auto pointee = ref->getPointeeType ();
877878 isObject () && WantsElementPtr () && IsBoxedType (pointee)) {
878879 StrCat (std::format (" Ptr::<{}>::decay(&({}))" , ToString (pointee),
879880 std::move (str)));
880881 computed_expr_type_ = ComputedExprType::FreshPointer;
881- return false ;
882+ return ;
882883 }
883884
884885 // references are not boxed
@@ -891,13 +892,13 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
891892 } else {
892893 if (isLValue ()) {
893894 pending_deref_.set (str, /* fresh=*/ false );
894- return false ;
895+ return ;
895896 }
896897 StrCat (DerefPtrExpr (str, ref->getPointeeType ()));
897898 }
898899 SetValueFreshness (expr->getType ());
899900 }
900- return false ;
901+ return ;
901902 }
902903
903904 if (isAddrOf ()) {
@@ -909,7 +910,7 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
909910 StrCat (str, " .as_pointer()" );
910911 }
911912 computed_expr_type_ = ComputedExprType::FreshPointer;
912- return false ;
913+ return ;
913914 }
914915
915916 bool fresh = false ;
@@ -934,18 +935,17 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
934935 StrCat (std::format (" (*{}.borrow_mut())" , std::move (str)));
935936 }
936937
937- if (auto *decl = clang::dyn_cast<clang::VarDecl>(expr-> getDecl () )) {
938- if (decl ->getType ()->isPointerType ()) {
938+ if (auto *var = clang::dyn_cast<clang::VarDecl>(decl )) {
939+ if (var ->getType ()->isPointerType ()) {
939940 computed_expr_type_ = ComputedExprType::Pointer;
940- return false ;
941+ return ;
941942 }
942943 }
943944 if (fresh) {
944945 SetFreshType (expr->getType ());
945946 } else {
946947 SetValueFreshness (expr->getType ());
947948 }
948- return false ;
949949}
950950
951951static std::vector<const char *> printf2fmt (std::string &format) {
@@ -1727,6 +1727,10 @@ void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
17271727
17281728bool ConverterRefCount::VisitMemberExpr (clang::MemberExpr *expr) {
17291729 auto *member = expr->getMemberDecl ();
1730+ if (!member->isCXXInstanceMember ()) {
1731+ ConvertDeclRefValue (expr, member);
1732+ return false ;
1733+ }
17301734 bool known = Mapper::Contains (expr);
17311735
17321736 if (auto *method = clang::dyn_cast<clang::CXXMethodDecl>(member);
@@ -2495,7 +2499,8 @@ clang::DeclRefExpr *ConverterRefCount::GetGlobalArrayRValue(clang::Expr *base) {
24952499 auto *ref = clang::dyn_cast<clang::DeclRefExpr>(base->IgnoreImplicit ());
24962500 if (!isRValue () || !ref || !IsGlobalVar (ref) ||
24972501 ref->getDecl ()->getType ()->isReferenceType () ||
2498- (ShouldReplaceWithMappedBody (ref) && !GetMappedAsString (ref).empty ())) {
2502+ (ShouldReplaceWithMappedBody (ref->getDecl ()) &&
2503+ !GetMappedAsString (ref).empty ())) {
24992504 return nullptr ;
25002505 }
25012506 auto *arr_ty = ctx_.getAsArrayType (ref->getType ());
@@ -2551,7 +2556,7 @@ void ConverterRefCount::ConvertArraySubscript(clang::Expr *base,
25512556 // The index is evaluated first, as it may itself access the global.
25522557 StrCat (std::format (
25532558 " ({{ let __idx = ({}) as usize; {}.with(|rc| rc.borrow()[__idx]{}) }})" ,
2554- ConvertRValue (idx), ConvertDeclRefExpr (global),
2559+ ConvertRValue (idx), ConvertDeclRef (global, global-> getDecl () ),
25552560 TypeIsCopyable (type) ? " " : " .clone()" ));
25562561 SetFreshType (type);
25572562 } else {
0 commit comments