@@ -503,29 +503,15 @@ Expr *TypecheckVisitor::transformPtr(CallExpr *expr) {
503503 auto t = extractClassType (head);
504504 if (!t)
505505 return nullptr ;
506- if (!t->isRecord ())
506+ if (!last && ! t->isRecord ())
507507 E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
508508
509509 if (auto id = cast<IdExpr>(head)) {
510510 auto val = id ? ctx->find (id->getValue (), getTime ()) : nullptr ;
511- if (!val || !val->isVar ()) {
511+ if (!val || !val->isVar ())
512512 E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
513- }
514513 break ;
515514 } 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- }
529515 head = dot->getExpr ();
530516 } else {
531517 E (Error::CALL_PTR_VAR, expr->begin ()->getExpr ());
0 commit comments