@@ -2620,6 +2620,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
26202620
26212621 void visitSubscriptDecl (SubscriptDecl *SD) {
26222622 TC.validateDecl (SD);
2623+
2624+ if (!SD->isInvalid ()) {
2625+ TC.checkReferencedGenericParams (SD);
2626+ TC.checkProtocolSelfRequirements (SD);
2627+ }
2628+
26232629 TC.checkDeclAttributes (SD);
26242630
26252631 AccessControlChecker::checkAccessControl (TC, SD);
@@ -3121,6 +3127,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
31213127 void visitFuncDecl (FuncDecl *FD) {
31223128 TC.validateDecl (FD);
31233129
3130+ // We get bogus errors here with generic subscript materializeForSet.
3131+ if (!FD->isInvalid ()) {
3132+ if (!isa<AccessorDecl>(FD) ||
3133+ !cast<AccessorDecl>(FD)->isMaterializeForSet ()) {
3134+ TC.checkReferencedGenericParams (FD);
3135+ TC.checkProtocolSelfRequirements (FD);
3136+ }
3137+ }
3138+
31243139 AccessControlChecker::checkAccessControl (TC, FD);
31253140 UsableFromInlineChecker::checkUsableFromInline (TC, FD);
31263141
@@ -3265,6 +3280,11 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
32653280 void visitConstructorDecl (ConstructorDecl *CD) {
32663281 TC.validateDecl (CD);
32673282
3283+ if (!CD->isInvalid ()) {
3284+ TC.checkReferencedGenericParams (CD);
3285+ TC.checkProtocolSelfRequirements (CD);
3286+ }
3287+
32683288 // Check whether this initializer overrides an initializer in its
32693289 // superclass.
32703290 if (!checkOverrides (CD)) {
@@ -3609,13 +3629,13 @@ void checkMemberOperator(TypeChecker &TC, FuncDecl *FD) {
36093629 isProtocol, FD->getFullName ());
36103630}
36113631
3612- bool checkDynamicSelfReturn (TypeChecker &TC, FuncDecl *func,
3632+ bool checkDynamicSelfReturn (FuncDecl *func,
36133633 TypeRepr *typeRepr,
36143634 unsigned optionalDepth) {
36153635 // Look through parentheses.
36163636 if (auto parenRepr = dyn_cast<TupleTypeRepr>(typeRepr)) {
36173637 if (!parenRepr->isParenType ()) return false ;
3618- return checkDynamicSelfReturn (TC, func, parenRepr->getElementType (0 ),
3638+ return checkDynamicSelfReturn (func, parenRepr->getElementType (0 ),
36193639 optionalDepth);
36203640 }
36213641
@@ -3624,8 +3644,9 @@ bool checkDynamicSelfReturn(TypeChecker &TC, FuncDecl *func,
36243644 TypeAttributes attrs = attrRepr->getAttrs ();
36253645 if (!attrs.empty ())
36263646 return false ;
3627- return checkDynamicSelfReturn (TC, func, attrRepr->getTypeRepr (),
3647+ return checkDynamicSelfReturn (func, attrRepr->getTypeRepr (),
36283648 optionalDepth);
3649+
36293650 }
36303651
36313652 // Look through optional types.
@@ -3639,7 +3660,7 @@ bool checkDynamicSelfReturn(TypeChecker &TC, FuncDecl *func,
36393660 if (base) {
36403661 // But only one level.
36413662 if (optionalDepth != 0 ) return false ;
3642- return checkDynamicSelfReturn (TC, func, base, optionalDepth + 1 );
3663+ return checkDynamicSelfReturn (func, base, optionalDepth + 1 );
36433664 }
36443665
36453666 // Check whether we have a simple identifier type.
@@ -3648,17 +3669,16 @@ bool checkDynamicSelfReturn(TypeChecker &TC, FuncDecl *func,
36483669 return false ;
36493670
36503671 // Check whether it is 'Self'.
3651- if (simpleRepr->getIdentifier () != TC. Context .Id_Self )
3672+ if (simpleRepr->getIdentifier () != func-> getASTContext () .Id_Self )
36523673 return false ;
36533674
36543675 // Note that the function has a dynamic Self return type and set
36553676 // the return type component to the dynamic self type.
3656- func->setDynamicSelf (true );
3657- return false ;
3677+ return true ;
36583678}
36593679
36603680// / Check for methods that return 'DynamicResult'.
3661- bool checkDynamicSelfReturn (TypeChecker &TC, FuncDecl *func) {
3681+ bool checkDynamicSelfReturn (FuncDecl *func) {
36623682 // Check whether we have a specified result type.
36633683 auto typeRepr = func->getBodyResultTypeLoc ().getTypeRepr ();
36643684 if (!typeRepr)
@@ -3674,7 +3694,7 @@ bool checkDynamicSelfReturn(TypeChecker &TC, FuncDecl *func) {
36743694 if (isa<AccessorDecl>(func))
36753695 return false ;
36763696
3677- return checkDynamicSelfReturn (TC, func, typeRepr, 0 );
3697+ return checkDynamicSelfReturn (func, typeRepr, 0 );
36783698}
36793699
36803700Type buildAddressorResultType (TypeChecker &TC,
@@ -4097,8 +4117,7 @@ void TypeChecker::validateDecl(ValueDecl *D) {
40974117 validateSelfAccessKind (*this , FD);
40984118
40994119 // Check whether the return type is dynamic 'Self'.
4100- if (checkDynamicSelfReturn (*this , FD))
4101- FD->setInvalid ();
4120+ FD->setDynamicSelf (checkDynamicSelfReturn (FD));
41024121
41034122 // Accessors should pick up various parts of their type signatures
41044123 // directly from the storage declaration instead of re-deriving them.
0 commit comments