diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-18 08:07:50 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-18 08:07:50 +0000 |
| commit | 345e3d419eafb0e234aecb4a33f37efe2afbbf53 (patch) | |
| tree | 9330322103f26f15c6df91cbbd62bf5a1f6e72da /lib/CodeGen/Designator.cc | |
| parent | 927e3fc0384c941f9ad313a28768660c3cdb1777 (diff) | |
feat(classes): add copy constructors and statement-scoped temporaries
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/Designator.cc')
| -rw-r--r-- | lib/CodeGen/Designator.cc | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/CodeGen/Designator.cc b/lib/CodeGen/Designator.cc index 5fb0ed3..b9c9a1a 100644 --- a/lib/CodeGen/Designator.cc +++ b/lib/CodeGen/Designator.cc @@ -98,7 +98,17 @@ const FuncSig *CodeGen::resolveMethod(const std::string &Class, const std::strin Value *CodeGen::emitMemberCall(MemberCallExprAST *Call) { SaveAndRestore<int> Location(DiagnosticLine, Call->getLine()); LValueInfo Receiver; - if (!emitLValue(Call->getReceiver(), Receiver)) return nullptr; + if (isObjectLValue(Call->getReceiver())) { + if (!emitLValue(Call->getReceiver(), Receiver)) return nullptr; + } else { + const TypeInfo *Type = getExprTypeInfo(Call->getReceiver()); + if (!Type || !Type->IsClass) { + reportError("A temporary method receiver must be a class"); + return nullptr; + } + Receiver = {materializeOperatorReceiver(emitExpr(Call->getReceiver()), Type), Type->Name}; + if (!Receiver.Addr) return nullptr; + } return emitMethodCall(Receiver.TypeName, Receiver.Addr, Call->getMethod(), Call->getArgs(), Call->getLine()); } |
