aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-18 08:09:06 +0000
committer_ov4 <ov4@ov4.org>2026-10-18 08:09:06 +0000
commit30fced09675acfd2b9ab6db6be8359a70d3f0402 (patch)
tree88dc4587cb71d9dc9bdd9a57c4e2de8a98d7f06e /lib/CodeGen
parent345e3d419eafb0e234aecb4a33f37efe2afbbf53 (diff)
feat(operators): allow member assignment operator overloads
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/ConstructorGen.cc14
-rw-r--r--lib/CodeGen/FunctionGen.cc6
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/CodeGen/ConstructorGen.cc b/lib/CodeGen/ConstructorGen.cc
index 4bf5568..9fc762c 100644
--- a/lib/CodeGen/ConstructorGen.cc
+++ b/lib/CodeGen/ConstructorGen.cc
@@ -142,6 +142,20 @@ void CodeGen::emitAssignment(const LValueInfo &Target, ExprAST *Expr, const Symb
}
return;
}
+ if (Info && Info->IsClass) {
+ auto Resolution = resolveOperator(tok_assign, Info, getExprTypeInfo(Expr));
+ if (Resolution.Ambiguous) {
+ reportError("Ambiguous assignment operator");
+ return;
+ }
+ if (const FuncSig *Sig = Resolution.Signature) {
+ if (!checkOperatorAccess(*Sig)) return;
+ std::vector<Value *> Args = {Target.Addr};
+ if (marshalCallArgs(*Sig, std::vector<ExprAST *>{Expr}, DiagnosticLine, Args))
+ FuncGen->emitCall(*Sig, Args);
+ return;
+ }
+ }
Value *Val = emitCoercedExpr(Expr, Info);
if (Val) Builder->CreateStore(Val, Target.Addr);
}
diff --git a/lib/CodeGen/FunctionGen.cc b/lib/CodeGen/FunctionGen.cc
index 37df8ff..1f7bc2b 100644
--- a/lib/CodeGen/FunctionGen.cc
+++ b/lib/CodeGen/FunctionGen.cc
@@ -132,6 +132,12 @@ Function *FunctionGen::emitPrototype(PrototypeAST *Proto) {
return nullptr;
}
}
+ if (Proto->getOperator() == tok_assign &&
+ (Proto->getOwnerClass().empty() || !Proto->isOverload() ||
+ !sameIdentifier(Proto->getReturnType(), "VOID"))) {
+ reportError("Assignment operator must be an OVERLOAD member PROCEDURE");
+ return nullptr;
+ }
if (int Op = Proto->getOperator()) {
size_t Count = Proto->getParams().size() + !Proto->getOwnerClass().empty();
bool ValidCount = Op == '-' ? Count == 1 || Count == 2