diff options
Diffstat (limited to 'lib/CodeGen/OperatorGen.cc')
| -rw-r--r-- | lib/CodeGen/OperatorGen.cc | 8 |
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; |
