Better function stuff

This commit is contained in:
2026-08-04 16:58:43 +10:00
parent 9bee06a49c
commit 5efb5d168d

View File

@@ -408,6 +408,8 @@ namespace Solstice {
auto& function = functions[*name]; auto& function = functions[*name];
node.ptype.possiblities.clear();
node.ptype.unknownType = false;
std::vector<PossibleType> args; std::vector<PossibleType> args;
// narrow types based on function // narrow types based on function
@@ -434,8 +436,8 @@ namespace Solstice {
throw std::runtime_error("no matching overload found for function " + *name); throw std::runtime_error("no matching overload found for function " + *name);
} }
child.ptype.possiblities = newTypes; child.ptype.possiblities = newTypes;
}
} variables[*id].possiblities = child.ptype.possiblities;
} }
args.push_back(child.ptype); args.push_back(child.ptype);
} }
@@ -443,19 +445,18 @@ namespace Solstice {
// get all possible combinations // get all possible combinations
auto sets = doCartesianProductOnTypeSets(args); auto sets = doCartesianProductOnTypeSets(args);
bool found = false;
for (const auto& set : sets) { for (const auto& set : sets) {
if (function.returnTypes.find(set) != function.returnTypes.end()) { if (function.returnTypes.find(set) != function.returnTypes.end()) {
if (found) { node.ptype.possiblities.insert(function.returnTypes[set]);
throw std::runtime_error("conflicting function definitions");
}
found = true;
node.ptype = {{function.returnTypes[set]}};
} }
} }
if (!found) {
if (node.ptype.possiblities.empty()) {
throw std::runtime_error("no matching overload found for function " + *name); throw std::runtime_error("no matching overload found for function " + *name);
} }
if (node.ptype.possiblities.size() > 1) {
node.ptype.unknownType = true;
}
} }
void TypeChecker::checkFunctionCallNodeType(Node& node) { void TypeChecker::checkFunctionCallNodeType(Node& node) {