From 4cb0d9b196008bc55dbfcdac1f9211dbbc879895 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Fri, 30 Oct 2026 14:23:32 +0000 Subject: feat(types): support implicit single-argument constructors Co-Authored-By: Claude Opus 5.5 --- lib/CodeGen/ConstructorGen.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'lib/CodeGen/ConstructorGen.cc') diff --git a/lib/CodeGen/ConstructorGen.cc b/lib/CodeGen/ConstructorGen.cc index da89f59..81c448f 100644 --- a/lib/CodeGen/ConstructorGen.cc +++ b/lib/CodeGen/ConstructorGen.cc @@ -24,9 +24,9 @@ Value *CodeGen::emitOwnedValue(ExprAST *Expr, const TypeInfo *Type, const TypeInfo *Source = getExprTypeInfo(Expr); // A CHAR argument becomes a fresh STRING temporary, owned like any other. bool FromChar = Source && Type->isString() && Source->Kind == TypeKind::Char; - if (!Source || (!Source->sameType(Type) && !FromChar)) return emitCoercedExpr(Expr, Type); + if (!Source) return emitCoercedExpr(Expr, Type); Value *Value = nullptr; - if (!FromChar && isObjectLValue(Expr)) { + if (!FromChar && Source->sameType(Type) && isObjectLValue(Expr)) { LValueInfo LV; const auto *Var = dynamic_cast(Expr); const auto *Symbol = Var ? getSymbolInfo(Var->getName()) : nullptr; @@ -241,7 +241,14 @@ void CodeGen::emitAssignment(const LValueInfo &Target, ExprAST *Expr, const Symb return; } Value *Val = emitCoercedExpr(Expr, Info); - if (Val) Builder->CreateStore(Val, Target.Addr); + if (Val && Info && Info->IsClass && ExprType && !ExprType->sameType(Info)) { + materializeOperatorReceiver(Val, Info); + std::vector Transfers; + if (typeNeedsDestruction(Info->Name)) Transfers.push_back(StackObjects.size() - 1); + if (!emitDestroy(Info->Name, Target.Addr, DiagnosticLine)) return; + Builder->CreateStore(Val, Target.Addr); + transferObjects(Transfers); + } else if (Val) Builder->CreateStore(Val, Target.Addr); } bool CodeGen::typeNeedsDestruction(const std::string &TypeName) const { -- cgit v1.3.1-4-g156e