@@ -1572,25 +1572,36 @@ class DeclAndTypePrinter::Implementation
15721572 }
15731573
15741574 bool printImportedAlias (const TypeAliasDecl *alias,
1575+ ArrayRef<Type> genericArgs,
15751576 Optional<OptionalTypeKind> optionalKind) {
15761577 if (!alias->hasClangNode ())
15771578 return false ;
15781579
15791580 if (auto *clangTypeDecl =
15801581 dyn_cast<clang::TypeDecl>(alias->getClangDecl ())) {
1582+ assert (!alias->isGeneric ()
1583+ && " generic typealias backed by clang typedecl?" );
1584+
15811585 maybePrintTagKeyword (alias);
15821586 os << getNameForObjC (alias);
15831587
15841588 if (isClangPointerType (clangTypeDecl))
15851589 printNullability (optionalKind);
15861590 } else if (auto *clangObjCClass
15871591 = dyn_cast<clang::ObjCInterfaceDecl>(alias->getClangDecl ())){
1592+ assert (!alias->isGeneric ()
1593+ && " generic typealias backed by clang interface?" );
1594+
15881595 os << clangObjCClass->getName () << " *" ;
15891596 printNullability (optionalKind);
15901597 } else {
15911598 auto *clangCompatAlias =
15921599 cast<clang::ObjCCompatibleAliasDecl>(alias->getClangDecl ());
1593- os << clangCompatAlias->getName () << " *" ;
1600+
1601+ os << clangCompatAlias->getName ();
1602+ if (!genericArgs.empty ())
1603+ printGenericArgs (genericArgs);
1604+ os << " *" ;
15941605 printNullability (optionalKind);
15951606 }
15961607
@@ -1600,10 +1611,12 @@ class DeclAndTypePrinter::Implementation
16001611 void visitTypeAliasType (TypeAliasType *aliasTy,
16011612 Optional<OptionalTypeKind> optionalKind) {
16021613 const TypeAliasDecl *alias = aliasTy->getDecl ();
1614+ auto genericArgs = aliasTy->getDirectGenericArgs ();
1615+
16031616 if (printIfKnownSimpleType (alias, optionalKind))
16041617 return ;
16051618
1606- if (printImportedAlias (alias, optionalKind))
1619+ if (printImportedAlias (alias, genericArgs, optionalKind))
16071620 return ;
16081621
16091622 visitPart (aliasTy->getSinglyDesugaredType (), optionalKind);
@@ -1737,8 +1750,12 @@ class DeclAndTypePrinter::Implementation
17371750 }
17381751
17391752 void printGenericArgs (BoundGenericType *BGT) {
1753+ printGenericArgs (BGT->getGenericArgs ());
1754+ }
1755+
1756+ void printGenericArgs (ArrayRef<Type> genericArgs) {
17401757 os << ' <' ;
1741- interleave (BGT-> getGenericArgs () ,
1758+ interleave (genericArgs ,
17421759 [this ](Type t) { print (t, None); },
17431760 [this ] { os << " , " ; });
17441761 os << ' >' ;
0 commit comments