[PATCH] D65050: [SemaTemplate] Mark a function type as dependent when its parameter list contains pack expansion

S. B. Tam via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 23 15:10:00 PDT 2019


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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65050.211358.patch
Type: text/x-patch
Size: 1655 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190723/315423ff/attachment.bin>


More information about the cfe-commits mailing list