aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c17
-rw-r--r--gcc/testsuite/g++.dg/parse/ctor10.C14
3 files changed, 27 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0017c34..37f446f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index b22a3cc..f978ea7 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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
index 0000000..99d3ca8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ctor10.C
@@ -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;