aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/OperatorGen.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-28 13:36:16 +0000
committer_ov4 <ov4@ov4.org>2026-10-28 13:36:16 +0000
commitb28384fed1ce638e8b00b72dba974e9fd7e55eb4 (patch)
treeb0b342b148c1d5b33197f7a59d0a7a7edb92af1c /lib/CodeGen/OperatorGen.cc
parentcaa88a9b36d9e1dfae40ecb31aee05bc2891fa17 (diff)
feat(overload): support default return types
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/OperatorGen.cc')
-rw-r--r--lib/CodeGen/OperatorGen.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/CodeGen/OperatorGen.cc b/lib/CodeGen/OperatorGen.cc
index 560b167..7cfac00 100644
--- a/lib/CodeGen/OperatorGen.cc
+++ b/lib/CodeGen/OperatorGen.cc
@@ -38,6 +38,7 @@ CodeGen::OperatorResolution CodeGen::resolveOperator(
if (Lenient && !CanConvert) break;
const FuncSig *Selected = nullptr;
int Count = 0;
+ std::vector<const FuncSig *> Matches;
for (const FuncSig *Sig : Candidates) {
bool Member = !Sig->Prototype->getOwnerClass().empty();
if (Sig->Prototype->getOperator() != Op ||
@@ -47,8 +48,15 @@ CodeGen::OperatorResolution CodeGen::resolveOperator(
ParamMatched = true;
if (FilterReturn && !ReturnsWanted(Sig)) continue;
++Count;
+ Matches.push_back(Sig);
if (!Selected) Selected = Sig;
}
+ if (!FilterReturn && Count > 1) {
+ if (const FuncSig *Default = FunctionGen::selectDefaultReturn(Matches)) {
+ Selected = Default;
+ Count = 1;
+ }
+ }
if (Selected) {
Result.Signature = Selected;
Result.Ambiguous = Count > 1;