@@ -498,23 +498,40 @@ Expr *TypecheckVisitor::transformPtr(CallExpr *expr) {
498498 expr->begin ()->value = transform (expr->begin ()->getExpr ());
499499
500500 auto head = getHeadExpr (expr->begin ()->getExpr ());
501- auto id = cast<IdExpr>(head);
502- std::string member;
503- if (auto dot = cast<DotExpr>(head)) {
504- if (((id = cast<IdExpr>(dot->getExpr ())))) {
505- member = dot->getMember ();
501+ std::vector<std::string> members;
502+ for (bool last = true ;; last = false ) {
503+ auto t = extractClassType (head);
504+ if (!t)
505+ return nullptr ;
506+ if (!t->isRecord ())
507+ E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
508+
509+ if (auto id = cast<IdExpr>(head)) {
510+ auto val = id ? ctx->find (id->getValue (), getTime ()) : nullptr ;
511+ if (!val || !val->isVar ()) {
512+ E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
513+ }
514+ break ;
515+ } else if (auto dot = cast<DotExpr>(head)) {
516+ if (last && !t->isRecord ()) {
517+ E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
518+ } else if (!t->isRecord ()) {
519+ auto tmp = getTemporaryVar (" ptr" );
520+ auto newDot = N<DotExpr>(N<IdExpr>(tmp), dot->getMember ());
521+ std::ranges::reverse (members);
522+ for (auto &m : members)
523+ newDot = N<DotExpr>(newDot, m);
524+ return transform (N<StmtExpr>(
525+ N<AssignStmt>(N<IdExpr>(tmp), dot->getExpr ()),
526+ N<CallExpr>(N<IdExpr>(getMangledFunc (" std.internal.core" , " __ptr__" )),
527+ newDot)));
528+ }
529+ head = dot->getExpr ();
506530 } else {
507- auto tmp = getTemporaryVar (" ptr" );
508- return transform (N<StmtExpr>(
509- N<AssignStmt>(N<IdExpr>(tmp), dot->getExpr ()),
510- N<CallExpr>(N<IdExpr>(getMangledFunc (" std.internal.core" , " __ptr__" )),
511- N<DotExpr>(N<IdExpr>(tmp), dot->getMember ()))));
531+ E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
532+ break ;
512533 }
513534 }
514- auto val = id ? ctx->find (id->getValue (), getTime ()) : nullptr ;
515- if (!val || !val->isVar ()) {
516- E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
517- }
518535
519536 unify (expr->getType (),
520537 instantiateType (getStdLibType (" Ptr" ), {expr->begin ()->getExpr ()->getType ()}));
0 commit comments