cpplearner updated this revision to Diff 211358. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D65050/new/
https://reviews.llvm.org/D65050 Files: clang/lib/AST/Type.cpp clang/test/SemaTemplate/alias-templates.cpp Index: clang/test/SemaTemplate/alias-templates.cpp =================================================================== --- clang/test/SemaTemplate/alias-templates.cpp +++ clang/test/SemaTemplate/alias-templates.cpp @@ -267,3 +267,34 @@ int z = Bar(); // expected-error {{use of template template parameter 'Bar' requires template arguments}} } } + +namespace PR42654 { + template<typename> struct function { }; + + template<typename...T> + struct thing { + void f(function<void(T...)>) { } + }; + + template<typename ...Ts> + struct Environment + { + template<typename T> + using Integer = int; + + using Function = function<void(Integer<Ts>...)>; + using MyTuple = thing<Integer<Ts>...>; + + void run(Function func) + { + MyTuple t; + t.f(func); + } + }; + + void f() + { + Environment<int, double> env; + env.run({}); + } +} Index: clang/lib/AST/Type.cpp =================================================================== --- clang/lib/AST/Type.cpp +++ clang/lib/AST/Type.cpp @@ -2912,7 +2912,10 @@ // Fill in the trailing argument array. auto *argSlot = getTrailingObjects<QualType>(); for (unsigned i = 0; i != getNumParams(); ++i) { - if (params[i]->isDependentType()) + // A pack expansion with a non-dependent pattern still affects the number of + // parameters, thus we mark such function type as dependent, even though + // this isn't listed in N4820 [temp.dep.type]. + if (params[i]->isDependentType() || params[i]->getAs<PackExpansionType>()) setDependent(); else if (params[i]->isInstantiationDependentType()) setInstantiationDependent();
Index: clang/test/SemaTemplate/alias-templates.cpp =================================================================== --- clang/test/SemaTemplate/alias-templates.cpp +++ clang/test/SemaTemplate/alias-templates.cpp @@ -267,3 +267,34 @@ int z = Bar(); // expected-error {{use of template template parameter 'Bar' requires template arguments}} } } + +namespace PR42654 { + template<typename> struct function { }; + + template<typename...T> + struct thing { + void f(function<void(T...)>) { } + }; + + template<typename ...Ts> + struct Environment + { + template<typename T> + using Integer = int; + + using Function = function<void(Integer<Ts>...)>; + using MyTuple = thing<Integer<Ts>...>; + + void run(Function func) + { + MyTuple t; + t.f(func); + } + }; + + void f() + { + Environment<int, double> env; + env.run({}); + } +} Index: clang/lib/AST/Type.cpp =================================================================== --- clang/lib/AST/Type.cpp +++ clang/lib/AST/Type.cpp @@ -2912,7 +2912,10 @@ // Fill in the trailing argument array. auto *argSlot = getTrailingObjects<QualType>(); for (unsigned i = 0; i != getNumParams(); ++i) { - if (params[i]->isDependentType()) + // A pack expansion with a non-dependent pattern still affects the number of + // parameters, thus we mark such function type as dependent, even though + // this isn't listed in N4820 [temp.dep.type]. + if (params[i]->isDependentType() || params[i]->getAs<PackExpansionType>()) setDependent(); else if (params[i]->isInstantiationDependentType()) setInstantiationDependent();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits