@@ -826,7 +826,7 @@ class PrintAST : public ASTVisitor<PrintAST> {
826
826
void printMembers (ArrayRef<Decl *> members, bool needComma = false ,
827
827
bool openBracket = true , bool closeBracket = true );
828
828
void printGenericDeclGenericParams (GenericContext *decl);
829
- void printGenericDeclGenericRequirements (GenericContext *decl);
829
+ void printDeclGenericRequirements (GenericContext *decl);
830
830
void printInherited (const Decl *decl);
831
831
void printBodyIfNecessary (const AbstractFunctionDecl *decl);
832
832
@@ -2055,19 +2055,23 @@ void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
2055
2055
printGenericSignature (GenericSig, PrintParams | InnermostOnly);
2056
2056
}
2057
2057
2058
- void PrintAST::printGenericDeclGenericRequirements (GenericContext *decl) {
2059
- if (decl->isGeneric ()) {
2060
- if (auto genericSig = decl->getGenericSignature ()) {
2061
- auto baseGenericSig = decl->getParent ()
2062
- ->getGenericSignatureOfContext ();
2063
- printGenericSignature (genericSig, PrintRequirements,
2064
- [baseGenericSig](const Requirement &req) {
2065
- if (baseGenericSig)
2066
- return !baseGenericSig->isRequirementSatisfied (req);
2067
- return true ;
2068
- });
2069
- }
2070
- }
2058
+ void PrintAST::printDeclGenericRequirements (GenericContext *decl) {
2059
+ const auto genericSig = decl->getGenericSignature ();
2060
+ if (!genericSig)
2061
+ return ;
2062
+
2063
+ // If the declaration is itself non-generic, it might still
2064
+ // carry a contextual where clause.
2065
+ const auto parentSig = decl->getParent ()->getGenericSignatureOfContext ();
2066
+ if (parentSig && parentSig->isEqual (genericSig))
2067
+ return ;
2068
+
2069
+ printGenericSignature (genericSig, PrintRequirements,
2070
+ [parentSig](const Requirement &req) {
2071
+ if (parentSig)
2072
+ return !parentSig->isRequirementSatisfied (req);
2073
+ return true ;
2074
+ });
2071
2075
}
2072
2076
2073
2077
void PrintAST::printInherited (const Decl *decl) {
@@ -2178,7 +2182,7 @@ void PrintAST::printSynthesizedExtension(Type ExtendedType,
2178
2182
2179
2183
printExtendedTypeName (ExtendedType, Printer, Options);
2180
2184
printInherited (ExtDecl);
2181
- printGenericDeclGenericRequirements (ExtDecl);
2185
+ printDeclGenericRequirements (ExtDecl);
2182
2186
}
2183
2187
if (Options.TypeDefinitions ) {
2184
2188
printMembersOfDecl (ExtDecl, false ,
@@ -2379,7 +2383,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
2379
2383
llvm::SaveAndRestore<GenericEnvironment*> setGenericEnv (Options.GenericEnv ,
2380
2384
decl->getGenericEnvironment ());
2381
2385
printTypeLoc (TypeLoc (decl->getUnderlyingTypeRepr (), Ty));
2382
- printGenericDeclGenericRequirements (decl);
2386
+ printDeclGenericRequirements (decl);
2383
2387
}
2384
2388
}
2385
2389
@@ -2434,7 +2438,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
2434
2438
printGenericDeclGenericParams (decl);
2435
2439
});
2436
2440
printInherited (decl);
2437
- printGenericDeclGenericRequirements (decl);
2441
+ printDeclGenericRequirements (decl);
2438
2442
}
2439
2443
if (Options.TypeDefinitions ) {
2440
2444
printMembersOfDecl (decl, false , true ,
@@ -2462,7 +2466,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
2462
2466
printGenericDeclGenericParams (decl);
2463
2467
});
2464
2468
printInherited (decl);
2465
- printGenericDeclGenericRequirements (decl);
2469
+ printDeclGenericRequirements (decl);
2466
2470
}
2467
2471
if (Options.TypeDefinitions ) {
2468
2472
printMembersOfDecl (decl, false , true ,
@@ -2491,7 +2495,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
2491
2495
});
2492
2496
2493
2497
printInherited (decl);
2494
- printGenericDeclGenericRequirements (decl);
2498
+ printDeclGenericRequirements (decl);
2495
2499
}
2496
2500
2497
2501
if (Options.TypeDefinitions ) {
@@ -2930,7 +2934,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2930
2934
ResultTyLoc, decl->isImplicitlyUnwrappedOptional ());
2931
2935
Printer.printStructurePost (PrintStructureKind::FunctionReturnType);
2932
2936
}
2933
- printGenericDeclGenericRequirements (decl);
2937
+ printDeclGenericRequirements (decl);
2934
2938
}
2935
2939
2936
2940
printBodyIfNecessary (decl);
@@ -3079,7 +3083,7 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
3079
3083
printTypeLocForImplicitlyUnwrappedOptional (
3080
3084
elementTy, decl->isImplicitlyUnwrappedOptional ());
3081
3085
Printer.printStructurePost (PrintStructureKind::FunctionReturnType);
3082
- printGenericDeclGenericRequirements (decl);
3086
+ printDeclGenericRequirements (decl);
3083
3087
printAccessors (decl);
3084
3088
}
3085
3089
@@ -3127,7 +3131,7 @@ void PrintAST::visitConstructorDecl(ConstructorDecl *decl) {
3127
3131
printFunctionParameters (decl);
3128
3132
});
3129
3133
3130
- printGenericDeclGenericRequirements (decl);
3134
+ printDeclGenericRequirements (decl);
3131
3135
3132
3136
printBodyIfNecessary (decl);
3133
3137
}
0 commit comments