Hi,

the main issue, a C++14 rejects-valid, is already fixed in trunk, and a while ago I added a testcase for that. However, Andrew noticed that in C++11 mode we emit redundant and also a bit puzzling diagnostic (ending with one of those annoying "... because:" and nothing after which unfortunately we emit in some other cases too). Comparing to, eg, clang too, I think we can make progress by simply returning early after the first hard error. Also, as an additional tweak, we might replace the second error with an inform, per the usual scheme. Tested x86_64-linux.

Thanks, Paolo.

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

/cp
2017-09-29  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/68754
        * method.c (defaulted_late_check): Early return if the defaulted
        declaration does not match the expected signature.

/testsuite
2017-09-29  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/68754
        * g++.dg/cpp1y/constexpr-68754.C: Move...
        * g++.dg/cpp0x/constexpr-68754.C: ... here, adjust.
Index: cp/method.c
===================================================================
--- cp/method.c (revision 253283)
+++ cp/method.c (working copy)
@@ -2191,9 +2191,11 @@ defaulted_late_check (tree fn)
       || !compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
                     TYPE_ARG_TYPES (TREE_TYPE (implicit_fn))))
     {
-      error ("defaulted declaration %q+D", fn);
-      error_at (DECL_SOURCE_LOCATION (fn),
-               "does not match expected signature %qD", implicit_fn);
+      error ("defaulted declaration %q+D does not match the "
+            "expected signature", fn);
+      inform (DECL_SOURCE_LOCATION (fn),
+             "expected signature: %qD", implicit_fn);
+      return;
     }
 
   if (DECL_DELETED_FN (implicit_fn))
Index: testsuite/g++.dg/cpp0x/constexpr-68754.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-68754.C    (revision 253283)
+++ testsuite/g++.dg/cpp0x/constexpr-68754.C    (working copy)
@@ -1,7 +1,7 @@
 // PR c++/68754
-// { dg-do compile { target c++14 } }
+// { dg-do compile { target c++11 } }
 
 struct base { };
 struct derived : base {
-  constexpr derived& operator=(derived const&) = default;
+  constexpr derived& operator=(derived const&) = default; // { dg-error 
"defaulted declaration" "" { target { ! c++14 } } }
 };
Index: testsuite/g++.dg/cpp1y/constexpr-68754.C
===================================================================
--- testsuite/g++.dg/cpp1y/constexpr-68754.C    (revision 253283)
+++ testsuite/g++.dg/cpp1y/constexpr-68754.C    (working copy)
@@ -1,7 +0,0 @@
-// PR c++/68754
-// { dg-do compile { target c++14 } }
-
-struct base { };
-struct derived : base {
-  constexpr derived& operator=(derived const&) = default;
-};

Reply via email to