PR c++/79464 - ICE in IPA with omitted constructor parms
authorJason Merrill <jason@redhat.com>
Wed, 15 Feb 2017 20:29:08 +0000 (15:29 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 15 Feb 2017 20:29:08 +0000 (15:29 -0500)
* class.c (build_clone): Also omit parms from TYPE_ARG_TYPES.
(adjust_clone_args): Adjust.
(add_method): Remember omitted parms.
* call.c (add_function_candidate): Likewise.
* mangle.c (write_method_parms): Likewise.
* method.c (ctor_omit_inherited_parms): Return false if there are no
parms to omit.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r245495

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/mangle.c
gcc/cp/method.c
gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C

index 4d4f1a07805f4ee004c63d55cdc5fc1fbc346cef..d346d687d93a90076211d280e2870734faa3cc5f 100644 (file)
@@ -1,3 +1,15 @@
+2017-02-15  Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79464 - ICE in IPA with omitted constructor parms
+       * class.c (build_clone): Also omit parms from TYPE_ARG_TYPES.
+       (adjust_clone_args): Adjust.
+       (add_method): Remember omitted parms.
+       * call.c (add_function_candidate): Likewise.
+       * mangle.c (write_method_parms): Likewise.
+       * method.c (ctor_omit_inherited_parms): Return false if there are no
+       parms to omit.
+
 2017-02-15  Martin Sebor  <msebor@redhat.com>
 
        PR c++/79363
index 718438cff1b85a2a2f60aa98a25e2cbbe40cefec..154509bec6f55c16b46889aee886a25184b2746c 100644 (file)
@@ -2005,7 +2005,11 @@ add_function_candidate (struct z_candidate **candidates,
      considered in overload resolution.  */
   if (DECL_CONSTRUCTOR_P (fn))
     {
-      parmlist = skip_artificial_parms_for (fn, parmlist);
+      if (ctor_omit_inherited_parms (fn))
+       /* Bring back parameters omitted from an inherited ctor.  */
+       parmlist = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (fn));
+      else
+       parmlist = skip_artificial_parms_for (fn, parmlist);
       skip = num_artificial_parms_for (fn);
       if (skip > 0 && first_arg != NULL_TREE)
        {
index 7ec07c9c7532508dcada03cb44fc48c4ac2adf6a..1442b55cfe9246c59fd9e50fc62d455f8b52065d 100644 (file)
@@ -1149,6 +1149,12 @@ add_method (tree type, tree method, tree using_decl)
       if (! DECL_STATIC_FUNCTION_P (method))
        parms2 = TREE_CHAIN (parms2);
 
+      /* Bring back parameters omitted from an inherited ctor.  */
+      if (ctor_omit_inherited_parms (fn))
+       parms1 = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (fn));
+      if (ctor_omit_inherited_parms (method))
+       parms2 = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (method));
+
       if (compparms (parms1, parms2)
          && (!DECL_CONV_FN_P (fn)
              || same_type_p (TREE_TYPE (fn_type),
@@ -4761,6 +4767,10 @@ build_clone (tree fn, tree name)
        DECL_VINDEX (clone) = NULL_TREE;
     }
 
+  bool ctor_omit_inherited_parms_p = ctor_omit_inherited_parms (clone);
+  if (ctor_omit_inherited_parms_p)
+    gcc_assert (DECL_HAS_IN_CHARGE_PARM_P (clone));
+
   /* If there was an in-charge parameter, drop it from the function
      type.  */
   if (DECL_HAS_IN_CHARGE_PARM_P (clone))
@@ -4780,8 +4790,12 @@ build_clone (tree fn, tree name)
       if (DECL_HAS_VTT_PARM_P (fn)
          && ! DECL_NEEDS_VTT_PARM_P (clone))
        parmtypes = TREE_CHAIN (parmtypes);
-       /* If this is subobject constructor or destructor, add the vtt
-        parameter.  */
+      if (ctor_omit_inherited_parms_p)
+       {
+         /* If we're omitting inherited parms, that just leaves the VTT.  */
+         gcc_assert (DECL_NEEDS_VTT_PARM_P (clone));
+         parmtypes = tree_cons (NULL_TREE, vtt_parm_type, void_list_node);
+       }
       TREE_TYPE (clone)
        = build_method_type_directly (basetype,
                                      TREE_TYPE (TREE_TYPE (clone)),
@@ -4818,7 +4832,7 @@ build_clone (tree fn, tree name)
 
   /* A base constructor inheriting from a virtual base doesn't get the
      arguments.  */
-  if (ctor_omit_inherited_parms (clone))
+  if (ctor_omit_inherited_parms_p)
     DECL_CHAIN (DECL_CHAIN (DECL_ARGUMENTS (clone))) = NULL_TREE;
 
   for (parms = DECL_ARGUMENTS (clone); parms; parms = DECL_CHAIN (parms))
@@ -4965,6 +4979,13 @@ adjust_clone_args (tree decl)
           decl_parms = TREE_CHAIN (decl_parms),
             clone_parms = TREE_CHAIN (clone_parms))
        {
+         if (clone_parms == void_list_node)
+           {
+             gcc_assert (decl_parms == clone_parms
+                         || ctor_omit_inherited_parms (clone));
+             break;
+           }
+
          gcc_assert (same_type_p (TREE_TYPE (decl_parms),
                                   TREE_TYPE (clone_parms)));
 
@@ -4999,7 +5020,7 @@ adjust_clone_args (tree decl)
              break;
            }
        }
-      gcc_assert (!clone_parms);
+      gcc_assert (!clone_parms || clone_parms == void_list_node);
     }
 }
 
index 3ead33e4bfa403dc67440e811696a9ca1afbce6f..8b30f42b2f983392982bc1e027777dec56ab69b6 100644 (file)
@@ -2740,6 +2740,10 @@ write_method_parms (tree parm_types, const int method_p, const tree decl)
          parm_types = TREE_CHAIN (parm_types);
          parm_decl = DECL_CHAIN (parm_decl);
        }
+
+      if (decl && ctor_omit_inherited_parms (decl))
+       /* Bring back parameters omitted from an inherited ctor.  */
+       parm_types = FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (decl));
     }
 
   for (first_parm_type = parm_types;
index a6a9b4e7f7484289911710227618347b34a8a45e..beb0a24a0b9c27f605074e02131fa7902dd82206 100644 (file)
@@ -575,6 +575,9 @@ ctor_omit_inherited_parms (tree fn)
   if (!DECL_BASE_CONSTRUCTOR_P (fn)
       || !CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn)))
     return false;
+  if (FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (fn)) == void_list_node)
+    /* No user-declared parameters to omit.  */
+    return false;
   tree binfo = inherited_ctor_binfo (fn);
   for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
     if (BINFO_VIRTUAL_P (binfo))
index c0cf040048cccfafd5bc7b388cd2c670bec38fc5..fe2c2eb396e1ebb7088210562a50eabe1499e2de 100644 (file)
@@ -1,6 +1,6 @@
 // Testcase from P0136
 // { dg-do compile { target c++11 } }
-// { dg-options "-fnew-inheriting-ctors -fdump-tree-gimple" }
+// { dg-options "-fnew-inheriting-ctors -fdump-tree-gimple -O2 -fno-inline" }
 
 struct W { W(int); };
 struct V: W { using W::W; };