]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/85262 - ICE with redundant qualification on constructor.
authorJason Merrill <jason@redhat.com>
Mon, 9 Apr 2018 20:53:31 +0000 (16:53 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 9 Apr 2018 20:53:31 +0000 (16:53 -0400)
* call.c (build_new_method_call_1): Move make_args_non_dependent
after A::A() handling.

From-SVN: r259255

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/parse/ctor10.C [new file with mode: 0644]

index 0017c34db75a66ef4f169d0491cebdfc4cee981e..37f446feec0894434613b431b3746bf2c4400ab1 100644 (file)
@@ -1,5 +1,9 @@
 2018-04-09  Jason Merrill  <jason@redhat.com>
 
+       PR c++/85262 - ICE with redundant qualification on constructor.
+       * call.c (build_new_method_call_1): Move make_args_non_dependent
+       after A::A() handling.
+
        PR c++/85277 - ICE with invalid offsetof.
        * semantics.c (finish_offsetof): Avoid passing non-DECL to %qD.
        Adjust -Winvalid-offsetof diagnostic to say conditionally supported.
index b22a3cc132e34590e50ad125aa80294352b7e8d1..f978ea73f3d70cc60d6f75f6777ebe3bbb6716ee 100644 (file)
@@ -9104,14 +9104,6 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
   basetype = TYPE_MAIN_VARIANT (TREE_TYPE (instance));
   gcc_assert (CLASS_TYPE_P (basetype));
 
-  if (processing_template_decl)
-    {
-      orig_args = args == NULL ? NULL : make_tree_vector_copy (*args);
-      instance = build_non_dependent_expr (instance);
-      if (args != NULL)
-       make_args_non_dependent (*args);
-    }
-
   user_args = args == NULL ? NULL : *args;
   /* Under DR 147 A::A() is an invalid constructor call,
      not a functional cast.  */
@@ -9132,12 +9124,21 @@ build_new_method_call_1 (tree instance, tree fns, vec<tree, va_gc> **args,
       return call;
     }
 
+  if (processing_template_decl)
+    {
+      orig_args = args == NULL ? NULL : make_tree_vector_copy (*args);
+      instance = build_non_dependent_expr (instance);
+      if (args != NULL)
+       make_args_non_dependent (*args);
+    }
+
   /* Process the argument list.  */
   if (args != NULL && *args != NULL)
     {
       *args = resolve_args (*args, complain);
       if (*args == NULL)
        return error_mark_node;
+      user_args = *args;
     }
 
   /* Consider the object argument to be used even if we end up selecting a
diff --git a/gcc/testsuite/g++.dg/parse/ctor10.C b/gcc/testsuite/g++.dg/parse/ctor10.C
new file mode 100644 (file)
index 0000000..99d3ca8
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/85262
+// { dg-options -fpermissive }
+
+struct A {};
+
+template<int> struct B : A
+{
+  B()
+  {
+    A::A(A());                 // { dg-warning "constructor" }
+  }
+};
+
+B<0> b;