summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-type.cpp')
-rw-r--r--source/slang/slang-check-type.cpp59
1 files changed, 26 insertions, 33 deletions
diff --git a/source/slang/slang-check-type.cpp b/source/slang/slang-check-type.cpp
index b5f5240a5..bdf9c829a 100644
--- a/source/slang/slang-check-type.cpp
+++ b/source/slang/slang-check-type.cpp
@@ -294,7 +294,7 @@ bool SemanticsVisitor::CoerceToProperTypeImpl(
ensureDecl(genericDeclRef, DeclCheckState::CanSpecializeGeneric);
List<Val*> args;
List<Val*> witnessArgs;
- for (Decl* member : genericDeclRef.getDecl()->members)
+ for (Decl* member : genericDeclRef.getDecl()->getDirectMemberDecls())
{
if (auto typeParam = as<GenericTypeParamDecl>(member))
{
@@ -333,43 +333,36 @@ bool SemanticsVisitor::CoerceToProperTypeImpl(
}
}
- for (Decl* member : genericDeclRef.getDecl()->members)
+ for (auto constraintParam :
+ genericDeclRef.getDecl()->getDirectMemberDeclsOfType<GenericTypeConstraintDecl>())
{
- if (auto constraintParam = as<GenericTypeConstraintDecl>(member))
+ auto genericParam = as<DeclRefType>(constraintParam->sub.type)->getDeclRef();
+ if (!genericParam)
+ return false;
+ auto genericTypeParamDecl = as<GenericTypeParamDecl>(genericParam.getDecl());
+ if (!genericTypeParamDecl)
{
- auto genericParam = as<DeclRefType>(constraintParam->sub.type)->getDeclRef();
- if (!genericParam)
- return false;
- auto genericTypeParamDecl = as<GenericTypeParamDecl>(genericParam.getDecl());
- if (!genericTypeParamDecl)
- {
- diagSink->diagnose(typeExp.exp, Diagnostics::genericTypeNeedsArgs, typeExp);
- return false;
- }
- auto defaultType = CheckProperType(genericTypeParamDecl->initType);
- if (!defaultType)
- {
- diagSink->diagnose(typeExp.exp, Diagnostics::genericTypeNeedsArgs, typeExp);
- return false;
- }
- auto witness =
- tryGetSubtypeWitness(defaultType, CheckProperType(constraintParam->sup));
- if (!witness)
- {
- // diagnose
- getSink()->diagnose(
- genericTypeParamDecl->initType.exp,
- Diagnostics::typeArgumentDoesNotConformToInterface,
- defaultType,
- constraintParam->sup);
- return false;
- }
- witnessArgs.add(witness);
+ diagSink->diagnose(typeExp.exp, Diagnostics::genericTypeNeedsArgs, typeExp);
+ return false;
+ }
+ auto defaultType = CheckProperType(genericTypeParamDecl->initType);
+ if (!defaultType)
+ {
+ diagSink->diagnose(typeExp.exp, Diagnostics::genericTypeNeedsArgs, typeExp);
+ return false;
}
- else
+ auto witness = tryGetSubtypeWitness(defaultType, CheckProperType(constraintParam->sup));
+ if (!witness)
{
- // ignore non-parameter members
+ // diagnose
+ getSink()->diagnose(
+ genericTypeParamDecl->initType.exp,
+ Diagnostics::typeArgumentDoesNotConformToInterface,
+ defaultType,
+ constraintParam->sup);
+ return false;
}
+ witnessArgs.add(witness);
}
// Combine args and witnessArgs
args.addRange(witnessArgs);