summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-overload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-overload.cpp')
-rw-r--r--source/slang/slang-check-overload.cpp95
1 files changed, 81 insertions, 14 deletions
diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp
index f4a1de3d5..bd27c7df2 100644
--- a/source/slang/slang-check-overload.cpp
+++ b/source/slang/slang-check-overload.cpp
@@ -76,6 +76,14 @@ namespace Slang
paramCounts = CountParameters(candidate.item.declRef.as<GenericDecl>());
break;
+ case OverloadCandidate::Flavor::Expr:
+ {
+ auto paramCount = candidate.funcType->getParamCount();
+ paramCounts.allowed = paramCount;
+ paramCounts.required = paramCount;
+ }
+ break;
+
default:
SLANG_UNEXPECTED("unknown flavor of overload candidate");
break;
@@ -312,11 +320,34 @@ namespace Slang
{
Index argCount = context.getArgCount();
- List<DeclRef<ParamDecl>> params;
+ List<Type*> paramTypes;
+// List<DeclRef<ParamDecl>> params;
switch (candidate.flavor)
{
case OverloadCandidate::Flavor::Func:
- params = getParameters(candidate.item.declRef.as<CallableDecl>()).toArray();
+ for (auto param : getParameters(candidate.item.declRef.as<CallableDecl>()))
+ {
+ auto paramType = getType(m_astBuilder, param);
+ paramTypes.add(paramType);
+ }
+ break;
+
+ case OverloadCandidate::Flavor::Expr:
+ {
+ auto funcType = candidate.funcType;
+ Count paramCount = funcType->getParamCount();
+ for (Index i = 0; i < paramCount; ++i)
+ {
+ auto paramType = funcType->getParamType(i);
+
+ if(auto paramDirectionType = as<ParamDirectionType>(paramType))
+ {
+ paramType = paramDirectionType->getValueType();
+ }
+
+ paramTypes.add(paramType);
+ }
+ }
break;
case OverloadCandidate::Flavor::Generic:
@@ -329,13 +360,13 @@ namespace Slang
// Note(tfoley): We might have fewer arguments than parameters in the
// case where one or more parameters had defaults.
- SLANG_RELEASE_ASSERT(argCount <= params.getCount());
+ SLANG_RELEASE_ASSERT(argCount <= paramTypes.getCount());
for (Index ii = 0; ii < argCount; ++ii)
{
auto& arg = context.getArg(ii);
auto argType = context.getArgType(ii);
- auto param = params[ii];
+ auto paramType = paramTypes[ii];
if (context.mode == OverloadResolveContext::Mode::JustTrying)
{
@@ -343,10 +374,10 @@ namespace Slang
if( context.disallowNestedConversions )
{
// We need an exact match in this case.
- if(!getType(m_astBuilder, param)->equals(argType))
+ if(!paramType->equals(argType))
return false;
}
- else if (!canCoerce(getType(m_astBuilder, param), argType, arg, &cost))
+ else if (!canCoerce(paramType, argType, arg, &cost))
{
return false;
}
@@ -354,7 +385,7 @@ namespace Slang
}
else
{
- arg = coerce(getType(m_astBuilder, param), arg);
+ arg = coerce(paramType, arg);
}
}
return true;
@@ -558,11 +589,24 @@ namespace Slang
{
auto originalAppExpr = as<AppExprBase>(context.originalExpr);
- auto baseExpr = ConstructLookupResultExpr(
- candidate.item,
- context.baseExpr,
- context.funcLoc,
- originalAppExpr ? originalAppExpr->functionExpr : nullptr);
+
+
+ Expr* baseExpr;
+ switch(candidate.flavor)
+ {
+ case OverloadCandidate::Flavor::Func:
+ case OverloadCandidate::Flavor::Generic:
+ baseExpr = ConstructLookupResultExpr(
+ candidate.item,
+ context.baseExpr,
+ context.funcLoc,
+ originalAppExpr ? originalAppExpr->functionExpr : nullptr);
+ break;
+ case OverloadCandidate::Flavor::Expr:
+ default:
+ baseExpr = nullptr;
+ break;
+ }
switch(candidate.flavor)
{
@@ -598,6 +642,25 @@ namespace Slang
break;
+ case OverloadCandidate::Flavor::Expr:
+ {
+ AppExprBase* callExpr = as<InvokeExpr>(context.originalExpr);
+ if (!callExpr)
+ {
+ callExpr = m_astBuilder->create<InvokeExpr>();
+ callExpr->loc = context.loc;
+ for (Index aa = 0; aa < context.argCount; ++aa)
+ callExpr->arguments.add(context.getArg(aa));
+ }
+
+ callExpr->originalFunctionExpr = callExpr->functionExpr;
+ callExpr->type = QualType(candidate.resultType);
+
+ return callExpr;
+
+ }
+ break;
+
case OverloadCandidate::Flavor::Generic:
return createGenericDeclRef(
baseExpr,
@@ -996,8 +1059,12 @@ namespace Slang
FuncType* funcType,
OverloadResolveContext& context)
{
- SLANG_UNUSED(funcType);
- getSink()->diagnose(context.loc, Diagnostics::unimplemented, "call on expression of function type");
+ OverloadCandidate candidate;
+ candidate.flavor = OverloadCandidate::Flavor::Expr;
+ candidate.funcType = funcType;
+ candidate.resultType = funcType->getResultType();
+
+ AddOverloadCandidate(context, candidate);
}
void SemanticsVisitor::AddCtorOverloadCandidate(