The C++17 copy elision code needed to handle CONSTRUCTORs.

Tested x86_64-pc-linux-gnu, applying to trunk.
commit 8b82502696188d92fc560cc55e0a564c507e6144
Author: Jason Merrill <ja...@redhat.com>
Date:   Thu Nov 17 15:37:56 2016 -0500

            PR c++/78369 - {} as default argument
    
            * call.c (build_special_member_call): Handle CONSTRUCTOR.

diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index f6f4590..d25e2e7 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -8317,7 +8317,8 @@ build_special_member_call (tree instance, tree name, 
vec<tree, va_gc> **args,
       if (!reference_related_p (class_type, TREE_TYPE (arg)))
        arg = perform_implicit_conversion_flags (class_type, arg,
                                                 tf_warning, flags);
-      if (TREE_CODE (arg) == TARGET_EXPR
+      if ((TREE_CODE (arg) == TARGET_EXPR
+          || TREE_CODE (arg) == CONSTRUCTOR)
          && (same_type_ignoring_top_level_qualifiers_p
              (class_type, TREE_TYPE (arg))))
        {
diff --git a/gcc/testsuite/g++.dg/overload/defarg11.C 
b/gcc/testsuite/g++.dg/overload/defarg11.C
new file mode 100644
index 0000000..26fac6e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/defarg11.C
@@ -0,0 +1,11 @@
+// PR c++/78369
+// { dg-do compile { target c++11 } }
+
+struct A { };
+inline void f(struct A a = {})  {}
+
+int main()
+{
+  f();
+  return 0;
+}

Reply via email to