From 345e3d419eafb0e234aecb4a33f37efe2afbbf53 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sun, 18 Oct 2026 08:07:50 +0000 Subject: feat(classes): add copy constructors and statement-scoped temporaries Co-Authored-By: Claude Opus 5.5 --- lib/CodeGen/OperatorGen.cc | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'lib/CodeGen/OperatorGen.cc') diff --git a/lib/CodeGen/OperatorGen.cc b/lib/CodeGen/OperatorGen.cc index d340ed7..b449ba1 100644 --- a/lib/CodeGen/OperatorGen.cc +++ b/lib/CodeGen/OperatorGen.cc @@ -45,6 +45,7 @@ Value *CodeGen::materializeOperatorReceiver(Value *Val, const TypeInfo *Type) { size_t Object = registerStackObject(Storage, Type->Name, DiagnosticLine, false, true); Builder->CreateStore(Val, Storage); activateStackObject(Object); + if (Object != size_t(-1)) StackObjects[Object].Temporary = true; return Storage; } @@ -76,8 +77,25 @@ Value *CodeGen::emitOperatorCall(const FuncSig &Signature, ExprAST *Left, ExprAS Value *CodeGen::emitOperatorValues(const FuncSig &Signature, Value *Left, const TypeInfo *LeftType, Value *Right) { if (!checkOperatorAccess(Signature)) return nullptr; - if (!Signature.Prototype->getOwnerClass().empty()) - Left = materializeOperatorReceiver(Left, LeftType); - if (!Left) return nullptr; - return FuncGen->emitCall(Signature, {Left, Right}); + bool Member = !Signature.Prototype->getOwnerClass().empty(); + std::vector Args; + std::vector Transfers; + auto Capture = [&](Value *Val, const TypeInfo *Type) -> Value * { + auto *Slot = CreateEntryBlockAlloca(Builder->GetInsertBlock()->getParent(), + Type->LLVMType, "case_operand"); + Builder->CreateStore(Val, Slot); + return Slot; + }; + if (Member) Args.push_back(Capture(Left, LeftType)); + else { + if (LeftType->IsClass) Left = copyClassValue(LeftType, Capture(Left, LeftType), Transfers); + if (!Left) return nullptr; + Args.push_back(Left); + } + const TypeInfo *RightType = resolveType(Signature.Params[Member ? 0 : 1].TypeName); + if (RightType->IsClass) Right = copyClassValue(RightType, Capture(Right, RightType), Transfers); + if (!Right) return nullptr; + Args.push_back(Right); + transferObjects(Transfers); + return FuncGen->emitCall(Signature, Args); } -- cgit v1.3.1-4-g156e