diff options
Diffstat (limited to 'source/slang/slang-check-type.cpp')
| -rw-r--r-- | source/slang/slang-check-type.cpp | 59 |
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); |
