Hi,

I think that this ICE on invalid (and valid, for c++17+) can be in fact avoided by accepting in make_typename_type a TYPE_PACK_EXPANSION as context, thus by not triggering the "‘T ...’ is not a class" error. Not sure if a better fix would be something more general. Note, anyway, that we are asserting TYPE_P (context) thus TYPE_PACK_EXPANSIONs definitely get through beyond MAYBE_CLASS_TYPE_P.

Tested x86_64-linux.

Thanks, Paolo.

///////////////////////////

/cp
2019-02-01  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/88986
        * decl.c (make_typename_type): Allow for TYPE_PACK_EXPANSION as
        context (the first argument).

/testsuite
2019-02-01  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/88986
        * g++.dg/cpp1z/using4.C: New.

Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 268447)
+++ cp/decl.c   (working copy)
@@ -3816,7 +3816,9 @@ make_typename_type (tree context, tree name, enum
   gcc_assert (identifier_p (name));
   gcc_assert (TYPE_P (context));
 
-  if (!MAYBE_CLASS_TYPE_P (context))
+  if (TREE_CODE (context) == TYPE_PACK_EXPANSION)
+    /* This can happen for C++17 variadic using (c++/88986).  */;
+  else if (!MAYBE_CLASS_TYPE_P (context))
     {
       if (complain & tf_error)
        error ("%q#T is not a class", context);
Index: testsuite/g++.dg/cpp1z/using4.C
===================================================================
--- testsuite/g++.dg/cpp1z/using4.C     (nonexistent)
+++ testsuite/g++.dg/cpp1z/using4.C     (working copy)
@@ -0,0 +1,8 @@
+// PR c++/88986
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename ...T> struct C : T... {
+  using typename T::type ...;  // { dg-warning "pack expansion" "" { target 
c++14_down } }
+  void f() { type value; }
+};

Reply via email to