aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/OperatorGen.cc
blob: 83c515b4f5c241a75673fb7f2a5bd758cf0403c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#include "cps/CodeGen.h"
#include "cps/Operator.h"

using namespace cps;

// Probing candidates must not evaluate operands or diagnose absent overloads:
// both static typing and emission use this same selection.
CodeGen::OperatorResolution CodeGen::resolveOperator(
    int Op, const TypeInfo *Left, const TypeInfo *Right) {
    OperatorResolution Result;
    if (!Left) return Result;
    for (const FuncSig *Sig : FuncGen->getOverloads(operatorName(Op))) {
        if (Sig->Prototype->getOperator() != Op || Sig->Params.size() != (Right ? 2u : 1u)) continue;
        if (!Left->sameType(resolveType(Sig->Params[0].TypeName))) continue;
        if (Right && !Right->sameType(resolveType(Sig->Params[1].TypeName))) continue;
        if (Result.Signature) Result.Ambiguous = true;
        else Result.Signature = Sig;
    }
    return Result;
}