Index: clang/lib/AST/Type.cpp =================================================================== --- clang/lib/AST/Type.cpp +++ clang/lib/AST/Type.cpp @@ -3110,6 +3110,11 @@ for (unsigned i = 0; i != getNumParams(); ++i) { addDependence(params[i]->getDependence() & ~TypeDependence::VariablyModified); + // A pack expansion with a non-dependent pattern affects the number of + // parameters, thus we mark such function type as dependent, even though + // this isn't listed in N4861 [temp.dep.type]. + if (params[i]->getAs()) + addDependence(TypeDependence::Dependent); argSlot[i] = params[i]; } Index: clang/test/SemaTemplate/alias-templates.cpp =================================================================== --- clang/test/SemaTemplate/alias-templates.cpp +++ clang/test/SemaTemplate/alias-templates.cpp @@ -265,3 +265,34 @@ int z = Bar(); // expected-error {{use of template template parameter 'Bar' requires template arguments}} } } + +namespace PR42654 { + template struct function { }; + + template + struct thing { + void f(function) { } + }; + + template + struct Environment + { + template + using Integer = int; + + using Function = function...)>; + using MyTuple = thing...>; + + void run(Function func) + { + MyTuple t; + t.f(func); + } + }; + + void f() + { + Environment env; + env.run({}); + } +}