<div dir="ltr"><div dir="ltr"><a href="https://reviews.llvm.org/rL343369">https://reviews.llvm.org/rL343369</a><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 28, 2018 at 4:51 PM Galina Kistanova via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr">Hello Richard,<br><br>This commit broke couple of our builders:</div><div dir="ltr"><br></div><div dir="ltr"><a href="http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/12924" target="_blank">http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/12924</a><br><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/10475" target="_blank">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/10475</a><br>. . .<br><span style="font-family:monospace,monospace">FAILED: lib/Transforms/Instrumentation/CMakeFiles/LLVMInstrumentation.dir/DataFlowSanitizer.cpp.o <br>/home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/install/stage1/bin/clang++   -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Transforms/Instrumentation -I/home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/llvm.src/lib/Transforms/Instrumentation -Iinclude -I/home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/llvm.src/include -fPIC -fvisibility-inlines-hidden -Werror -Werror=date-time -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -ffunction-sections -fdata-sections -O3    -UNDEBUG  -fno-exceptions -fno-rtti -MD -MT lib/Transforms/Instrumentation/CMakeFiles/LLVMInstrumentation.dir/DataFlowSanitizer.cpp.o -MF lib/Transforms/Instrumentation/CMakeFiles/LLVMInstrumentation.dir/DataFlowSanitizer.cpp.o.d -o lib/Transforms/Instrumentation/CMakeFiles/LLVMInstrumentation.dir/DataFlowSanitizer.cpp.o -c /home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/llvm.src/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp<br>/home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/llvm.src/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp:231:24: error: explicitly defaulted move assignment operator is implicitly deleted [-Werror,-Wdefaulted-function-deleted]<br>  TransformedFunction& operator=(TransformedFunction&&) = default;<br>                       ^<br>/home/buildslave/ps4-buildslave1/clang-with-thin-lto-ubuntu/llvm.src/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp:234:23: note: move assignment operator of 'TransformedFunction' is implicitly deleted because field 'OriginalType' is of const-qualified type 'llvm::FunctionType *const'<br>  FunctionType* const OriginalType;<br>                      ^<br>1 error generated.</span><br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 27, 2018 at 6:18 PM Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Thu Sep 27 18:16:43 2018<br>
New Revision: 343285<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=343285&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=343285&view=rev</a><br>
Log:<br>
[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only<br>
render the function deleted instead of rendering the program ill-formed.<br>
<br>
This change also adds an enabled-by-default warning for the case where<br>
an explicitly-defaulted special member function of a non-template class<br>
is implicitly deleted by the type checking rules. (This fires either due<br>
to this language change or due to pre-C++20 reasons for the member being<br>
implicitly deleted). I've tested this on a large codebase and found only<br>
bugs (where the program means something that's clearly different from<br>
what the programmer intended), so this is enabled by default, but we<br>
should revisit this if there are problems with this being enabled by<br>
default.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
    cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp<br>
    cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp<br>
    cfe/trunk/test/CXX/drs/dr6xx.cpp<br>
    cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp<br>
    cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp<br>
    cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp<br>
    cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp<br>
    cfe/trunk/test/SemaCUDA/<a href="http://implicit-member-target.cu" rel="noreferrer" target="_blank">implicit-member-target.cu</a><br>
    cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp<br>
    cfe/trunk/test/SemaCXX/cxx17-compat.cpp<br>
    cfe/trunk/test/SemaCXX/dr1301.cpp<br>
    cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp<br>
    cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp<br>
    cfe/trunk/www/cxx_status.html<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Sep 27 18:16:43 2018<br>
@@ -7760,9 +7760,19 @@ def err_incorrect_defaulted_exception_sp<br>
 def err_incorrect_defaulted_constexpr : Error<<br>
   "defaulted definition of %sub{select_special_member_kind}0 "<br>
   "is not constexpr">;<br>
+def warn_defaulted_method_deleted : Warning<<br>
+  "explicitly defaulted %sub{select_special_member_kind}0 is implicitly "<br>
+  "deleted">, InGroup<DiagGroup<"defaulted-function-deleted">>;<br>
 def err_out_of_line_default_deletes : Error<<br>
   "defaulting this %sub{select_special_member_kind}0 "<br>
   "would delete it after its first declaration">;<br>
+def note_deleted_type_mismatch : Note<<br>
+  "function is implicitly deleted because its declared type does not match "<br>
+  "the type of an implicit %sub{select_special_member_kind}0">;<br>
+def warn_cxx17_compat_defaulted_method_type_mismatch : Warning<<br>
+  "explicitly defaulting this %sub{select_special_member_kind}0 with a type "<br>
+  "different from the implicit type is incompatible with C++ standards before "<br>
+  "C++2a">, InGroup<CXXPre2aCompat>, DefaultIgnore;<br>
 def warn_vbase_moved_multiple_times : Warning<<br>
   "defaulted move assignment operator of %0 will move assign virtual base "<br>
   "class %1 multiple times">, InGroup<DiagGroup<"multiple-move-vbase">>;<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Sep 27 18:16:43 2018<br>
@@ -6451,20 +6451,29 @@ void Sema::CheckExplicitlyDefaultedSpeci<br>
   //        copy operation can take a non-const reference) as an implicit<br>
   //        declaration, and<br>
   //     -- not have default arguments.<br>
+  // C++2a changes the second bullet to instead delete the function if it's<br>
+  // defaulted on its first declaration, unless it's "an assignment operator,<br>
+  // and its return type differs or its parameter type is not a reference".<br>
+  bool DeleteOnTypeMismatch = getLangOpts().CPlusPlus2a && First;<br>
+  bool ShouldDeleteForTypeMismatch = false;<br>
   unsigned ExpectedParams = 1;<br>
   if (CSM == CXXDefaultConstructor || CSM == CXXDestructor)<br>
     ExpectedParams = 0;<br>
   if (MD->getNumParams() != ExpectedParams) {<br>
-    // This also checks for default arguments: a copy or move constructor with a<br>
+    // This checks for default arguments: a copy or move constructor with a<br>
     // default argument is classified as a default constructor, and assignment<br>
     // operations and destructors can't have default arguments.<br>
     Diag(MD->getLocation(), diag::err_defaulted_special_member_params)<br>
       << CSM << MD->getSourceRange();<br>
     HadError = true;<br>
   } else if (MD->isVariadic()) {<br>
-    Diag(MD->getLocation(), diag::err_defaulted_special_member_variadic)<br>
-      << CSM << MD->getSourceRange();<br>
-    HadError = true;<br>
+    if (DeleteOnTypeMismatch)<br>
+      ShouldDeleteForTypeMismatch = true;<br>
+    else {<br>
+      Diag(MD->getLocation(), diag::err_defaulted_special_member_variadic)<br>
+        << CSM << MD->getSourceRange();<br>
+      HadError = true;<br>
+    }<br>
   }<br>
<br>
   const FunctionProtoType *Type = MD->getType()->getAs<FunctionProtoType>();<br>
@@ -6489,9 +6498,13 @@ void Sema::CheckExplicitlyDefaultedSpeci<br>
<br>
     // A defaulted special member cannot have cv-qualifiers.<br>
     if (Type->getTypeQuals()) {<br>
-      Diag(MD->getLocation(), diag::err_defaulted_special_member_quals)<br>
-        << (CSM == CXXMoveAssignment) << getLangOpts().CPlusPlus14;<br>
-      HadError = true;<br>
+      if (DeleteOnTypeMismatch)<br>
+        ShouldDeleteForTypeMismatch = true;<br>
+      else {<br>
+        Diag(MD->getLocation(), diag::err_defaulted_special_member_quals)<br>
+          << (CSM == CXXMoveAssignment) << getLangOpts().CPlusPlus14;<br>
+        HadError = true;<br>
+      }<br>
     }<br>
   }<br>
<br>
@@ -6504,23 +6517,30 @@ void Sema::CheckExplicitlyDefaultedSpeci<br>
     HasConstParam = ReferentType.isConstQualified();<br>
<br>
     if (ReferentType.isVolatileQualified()) {<br>
-      Diag(MD->getLocation(),<br>
-           diag::err_defaulted_special_member_volatile_param) << CSM;<br>
-      HadError = true;<br>
+      if (DeleteOnTypeMismatch)<br>
+        ShouldDeleteForTypeMismatch = true;<br>
+      else {<br>
+        Diag(MD->getLocation(),<br>
+             diag::err_defaulted_special_member_volatile_param) << CSM;<br>
+        HadError = true;<br>
+      }<br>
     }<br>
<br>
     if (HasConstParam && !CanHaveConstParam) {<br>
-      if (CSM == CXXCopyConstructor || CSM == CXXCopyAssignment) {<br>
+      if (DeleteOnTypeMismatch)<br>
+        ShouldDeleteForTypeMismatch = true;<br>
+      else if (CSM == CXXCopyConstructor || CSM == CXXCopyAssignment) {<br>
         Diag(MD->getLocation(),<br>
              diag::err_defaulted_special_member_copy_const_param)<br>
           << (CSM == CXXCopyAssignment);<br>
         // FIXME: Explain why this special member can't be const.<br>
+        HadError = true;<br>
       } else {<br>
         Diag(MD->getLocation(),<br>
              diag::err_defaulted_special_member_move_const_param)<br>
           << (CSM == CXXMoveAssignment);<br>
+        HadError = true;<br>
       }<br>
-      HadError = true;<br>
     }<br>
   } else if (ExpectedParams) {<br>
     // A copy assignment operator can take its argument by value, but a<br>
@@ -6582,14 +6602,27 @@ void Sema::CheckExplicitlyDefaultedSpeci<br>
                                         EPI));<br>
   }<br>
<br>
-  if (ShouldDeleteSpecialMember(MD, CSM)) {<br>
+  if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {<br>
     if (First) {<br>
       SetDeclDeleted(MD, MD->getLocation());<br>
+      if (!inTemplateInstantiation() && !HadError) {<br>
+        Diag(MD->getLocation(), diag::warn_defaulted_method_deleted) << CSM;<br>
+        if (ShouldDeleteForTypeMismatch) {<br>
+          Diag(MD->getLocation(), diag::note_deleted_type_mismatch) << CSM;<br>
+        } else {<br>
+          ShouldDeleteSpecialMember(MD, CSM, nullptr, /*Diagnose*/true);<br>
+        }<br>
+      }<br>
+      if (ShouldDeleteForTypeMismatch && !HadError) {<br>
+        Diag(MD->getLocation(),<br>
+             diag::warn_cxx17_compat_defaulted_method_type_mismatch) << CSM;<br>
+      }<br>
     } else {<br>
       // C++11 [dcl.fct.def.default]p4:<br>
       //   [For a] user-provided explicitly-defaulted function [...] if such a<br>
       //   function is implicitly defined as deleted, the program is ill-formed.<br>
       Diag(MD->getLocation(), diag::err_out_of_line_default_deletes) << CSM;<br>
+      assert(!ShouldDeleteForTypeMismatch && "deleted non-first decl");<br>
       ShouldDeleteSpecialMember(MD, CSM, nullptr, /*Diagnose*/true);<br>
       HadError = true;<br>
     }<br>
<br>
Modified: cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp (original)<br>
+++ cfe/trunk/test/CXX/class.derived/class.abstract/p16.cpp Thu Sep 27 18:16:43 2018<br>
@@ -44,8 +44,8 @@ struct G : D {};<br>
 // expected-error@-3 {{deleted function 'operator=' cannot override a non-deleted function}}<br>
 // expected-note@-4 {{while declaring the implicit move assignment operator for 'G'}}<br>
 // expected-note@-5 {{move assignment operator of 'G' is implicitly deleted because base class 'D' has an inaccessible move assignment operator}}<br>
-struct H : D {<br>
-  H &operator=(H&&) = default;<br>
+struct H : D { // expected-note {{deleted because base class 'D' has an inaccessible move assignment}}<br>
+  H &operator=(H&&) = default; // expected-warning {{implicitly deleted}}<br>
   // expected-error@-1 {{deleted function 'operator=' cannot override a non-deleted function}}<br>
   // expected-note@-3 {{move assignment operator of 'H' is implicitly deleted because base class 'D' has an inaccessible move assignment operator}}<br>
   ~H();<br>
<br>
Modified: cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp (original)<br>
+++ cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,15 +1,30 @@<br>
 // RUN: %clang_cc1 -verify %s -std=c++11<br>
+// RUN: %clang_cc1 -verify %s -std=c++17<br>
+// RUN: %clang_cc1 -verify %s -std=c++2a<br>
<br>
 // A function that is explicitly defaulted shall<br>
 struct A {<br>
   // -- be a special member function,<br>
   A(int) = default; // expected-error {{only special member functions may be defaulted}}<br>
+  A(A) = default; // expected-error {{must pass its first argument by reference}}<br>
<br>
   // -- have the same declared function type as if it had been implicitly<br>
   //    declared<br>
   void operator=(const A &) = default; // expected-error {{must return 'A &'}}<br>
-  A(...) = default; // expected-error {{cannot be variadic}}<br>
-  A(const A &, ...) = default; // expected-error {{cannot be variadic}}<br>
+  A(...) = default;<br>
+  A(const A &, ...) = default;<br>
+  A &operator=(const A&) const = default;<br>
+  A &operator=(A) const = default; // expected-error {{must be an lvalue refe}}<br>
+#if __cplusplus <= 201703L<br>
+  // expected-error@-5 {{cannot be variadic}}<br>
+  // expected-error@-5 {{cannot be variadic}}<br>
+  // expected-error@-5 {{may not have 'const'}}<br>
+  // expected-error@-5 {{may not have 'const'}}<br>
+#else<br>
+  // expected-warning@-10 {{implicitly deleted}} expected-note@-10 {{declared type does not match the type of an implicit default constructor}}<br>
+  // expected-warning@-10 {{implicitly deleted}} expected-note@-10 {{declared type does not match the type of an implicit copy constructor}}<br>
+  // expected-warning@-10 {{implicitly deleted}} expected-note@-10 {{declared type does not match the type of an implicit copy assignment}}<br>
+#endif<br>
<br>
   //    (except for possibly differing ref-qualifiers<br>
   A &operator=(A &&) & = default;<br>
@@ -23,3 +38,35 @@ struct A {<br>
   A(double = 0.0) = default; // expected-error {{cannot have default arguments}}<br>
   A(const A & = 0) = default; // expected-error {{cannot have default arguments}}<br>
 };<br>
+<br>
+struct A2 {<br>
+  A2(...);<br>
+  A2(const A2 &, ...);<br>
+  A2 &operator=(const A2&) const;<br>
+};<br>
+A2::A2(...) = default; // expected-error {{cannot be variadic}}<br>
+A2::A2(const A2&, ...) = default; // expected-error {{cannot be variadic}}<br>
+A2 &A2::operator=(const A2&) const = default; // expected-error {{may not have 'const'}}<br>
+<br>
+struct B {<br>
+  B(B&);<br>
+  B &operator=(B&);<br>
+};<br>
+struct C : B {<br>
+  C(const C&) = default;<br>
+  C &operator=(const C&) = default;<br>
+#if __cplusplus <= 201703L<br>
+  // expected-error@-3 {{is const, but a member or base requires it to be non-const}}<br>
+  // expected-error@-3 {{is const, but a member or base requires it to be non-const}}<br>
+#else<br>
+  // expected-warning@-6 {{implicitly deleted}} expected-note@-6 {{type does not match}}<br>
+  // expected-warning@-6 {{implicitly deleted}} expected-note@-6 {{type does not match}}<br>
+#endif<br>
+};<br>
+<br>
+struct D : B { // expected-note 2{{base class}}<br>
+  D(const D&);<br>
+  D &operator=(const D&);<br>
+};<br>
+D::D(const D&) = default; // expected-error {{would delete}} expected-error {{is const, but}}<br>
+D &D::operator=(const D&) = default; // expected-error {{would delete}} expected-error {{is const, but}}<br>
<br>
Modified: cfe/trunk/test/CXX/drs/dr6xx.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr6xx.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr6xx.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/drs/dr6xx.cpp (original)<br>
+++ cfe/trunk/test/CXX/drs/dr6xx.cpp Thu Sep 27 18:16:43 2018<br>
@@ -757,8 +757,8 @@ namespace dr666 { // dr666: yes<br>
 #if __cplusplus >= 201103L<br>
 namespace dr667 { // dr667: yes<br>
   struct A {<br>
-    A() = default;<br>
-    int &r;<br>
+    A() = default; // expected-warning {{explicitly defaulted default constructor is implicitly deleted}}<br>
+    int &r; // expected-note {{because field 'r' of reference type 'int &' would not be initialized}}<br>
   };<br>
   static_assert(!__is_trivially_constructible(A), "");<br>
<br>
<br>
Modified: cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp (original)<br>
+++ cfe/trunk/test/CXX/special/class.copy/p12-0x.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -std=c++11 -verify %s<br>
+// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-defaulted-function-deleted<br>
<br>
 // expected-no-diagnostics<br>
<br>
<br>
Modified: cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp (original)<br>
+++ cfe/trunk/test/CXX/special/class.copy/p23-cxx11.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -verify %s -std=c++11<br>
+// RUN: %clang_cc1 -verify %s -std=c++11 -Wno-defaulted-function-deleted<br>
<br>
 struct Trivial {};<br>
<br>
<br>
Modified: cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp (original)<br>
+++ cfe/trunk/test/CXX/special/class.ctor/p5-0x.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11<br>
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 -Wno-defaulted-function-deleted<br>
<br>
 struct DefaultedDefCtor1 {};<br>
 struct DefaultedDefCtor2 { DefaultedDefCtor2() = default; };<br>
<br>
Modified: cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp (original)<br>
+++ cfe/trunk/test/CXX/special/class.dtor/p5-0x.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -verify -std=c++11 %s<br>
+// RUN: %clang_cc1 -verify -std=c++11 %s -Wno-defaulted-function-deleted<br>
<br>
 struct NonTrivDtor {<br>
   ~NonTrivDtor();<br>
<br>
Modified: cfe/trunk/test/SemaCUDA/<a href="http://implicit-member-target.cu" rel="noreferrer" target="_blank">implicit-member-target.cu</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/implicit-member-target.cu?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCUDA/implicit-member-target.cu?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCUDA/<a href="http://implicit-member-target.cu" rel="noreferrer" target="_blank">implicit-member-target.cu</a> (original)<br>
+++ cfe/trunk/test/SemaCUDA/<a href="http://implicit-member-target.cu" rel="noreferrer" target="_blank">implicit-member-target.cu</a> Thu Sep 27 18:16:43 2018<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s<br>
+// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s -Wno-defaulted-function-deleted<br>
<br>
 #include "Inputs/cuda.h"<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/cxx0x-deleted-default-ctor.cpp Thu Sep 27 18:16:43 2018<br>
@@ -59,7 +59,7 @@ struct good_const {<br>
 good_const gc;<br>
<br>
 struct no_default {<br>
-  no_default() = delete; // expected-note 4{{deleted here}}<br>
+  no_default() = delete; // expected-note 5{{deleted here}}<br>
 };<br>
 struct no_dtor {<br>
   ~no_dtor() = delete; // expected-note 2{{deleted here}}<br>
@@ -108,8 +108,8 @@ struct has_friend {<br>
 has_friend hf;<br>
<br>
 struct defaulted_delete {<br>
-  no_default nd; // expected-note {{because field 'nd' has a deleted default constructor}}<br>
-  defaulted_delete() = default; // expected-note{{implicitly deleted here}}<br>
+  no_default nd; // expected-note 2{{because field 'nd' has a deleted default constructor}}<br>
+  defaulted_delete() = default; // expected-note{{implicitly deleted here}} expected-warning {{implicitly deleted}}<br>
 };<br>
 defaulted_delete dd; // expected-error {{call to implicitly-deleted default constructor}}<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/cxx17-compat.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx17-compat.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx17-compat.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/cxx17-compat.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/cxx17-compat.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,5 +1,5 @@<br>
 // RUN: %clang_cc1 -fsyntax-only -std=c++17 -pedantic -verify %s<br>
-// RUN: %clang_cc1 -fsyntax-only -std=c++2a -Wc++17-compat-pedantic -verify %s<br>
+// RUN: %clang_cc1 -fsyntax-only -std=c++2a -Wc++17-compat-pedantic -verify %s -Wno-defaulted-function-deleted<br>
<br>
 struct A {};<br>
 int (A::*pa)() const&;<br>
@@ -42,3 +42,15 @@ void copy_lambda() { Lambda = Lambda; }<br>
 #else<br>
     // expected-warning@-4 {{assignment of lambda is incompatible with C++ standards before C++2a}}<br>
 #endif<br>
+<br>
+struct DefaultDeleteWrongTypeBase {<br>
+  DefaultDeleteWrongTypeBase(DefaultDeleteWrongTypeBase&);<br>
+};<br>
+struct DefaultDeleteWrongType : DefaultDeleteWrongTypeBase {<br>
+  DefaultDeleteWrongType(const DefaultDeleteWrongType&) = default;<br>
+#if __cplusplus <= 201703L<br>
+    // expected-error@-2 {{a member or base requires it to be non-const}}<br>
+#else<br>
+    // expected-warning@-4 {{explicitly defaulting this copy constructor with a type different from the implicit type is incompatible with C++ standards before C++2a}}<br>
+#endif<br>
+};<br>
<br>
Modified: cfe/trunk/test/SemaCXX/dr1301.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/dr1301.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/dr1301.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/dr1301.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/dr1301.cpp Thu Sep 27 18:16:43 2018<br>
@@ -6,7 +6,7 @@ struct A { // expected-note 2{{candidate<br>
 int a = A().n; // expected-error {{no matching constructor}}<br>
<br>
 struct B {<br>
-  B() = delete; // expected-note 3{{here}}<br>
+  B() = delete; // expected-note 4{{here}}<br>
   int n;<br>
 };<br>
 int b = B().n; // expected-error {{call to deleted}}<br>
@@ -17,8 +17,8 @@ struct C {<br>
 int c = C().b.n; // expected-error {{call to implicitly-deleted default}}<br>
<br>
 struct D {<br>
-  D() = default; // expected-note {{here}}<br>
-  B b; // expected-note {{'b' has a deleted default constructor}}<br>
+  D() = default; // expected-note {{here}} expected-warning {{implicitly deleted}}<br>
+  B b; // expected-note 2{{'b' has a deleted default constructor}}<br>
 };<br>
 int d = D().b.n; // expected-error {{call to implicitly-deleted default}}<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/microsoft-dtor-lookup-cxx11.cpp Thu Sep 27 18:16:43 2018<br>
@@ -6,8 +6,8 @@ struct S {<br>
   void operator delete(void*, double);<br>
 } s; // expected-error {{attempt to use a deleted function}}<br>
<br>
-struct T { // expected-note{{virtual destructor requires an unambiguous, accessible 'operator delete'}}<br>
-  virtual ~T() = default; // expected-note {{explicitly defaulted function was implicitly deleted here}}<br>
+struct T { // expected-note 2{{virtual destructor requires an unambiguous, accessible 'operator delete'}}<br>
+  virtual ~T() = default; // expected-note {{explicitly defaulted function was implicitly deleted here}} expected-warning {{implicitly deleted}}<br>
   void operator delete(void*, int);<br>
   void operator delete(void*, double);<br>
 } t; // expected-error {{attempt to use a deleted function}}<br>
<br>
Modified: cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp (original)<br>
+++ cfe/trunk/test/SemaTemplate/exception-spec-crash.cpp Thu Sep 27 18:16:43 2018<br>
@@ -1,5 +1,5 @@<br>
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s<br>
-// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -DCXX_EXCEPTIONS -fsyntax-only -verify %s<br>
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -Wno-defaulted-function-deleted<br>
+// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -DCXX_EXCEPTIONS -fsyntax-only -verify %s -Wno-defaulted-function-deleted<br>
<br>
 template <class _Tp> struct is_nothrow_move_constructible {<br>
   static const bool value = false;<br>
<br>
Modified: cfe/trunk/www/cxx_status.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=343285&r1=343284&r2=343285&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=343285&r1=343284&r2=343285&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/www/cxx_status.html (original)<br>
+++ cfe/trunk/www/cxx_status.html Thu Sep 27 18:16:43 2018<br>
@@ -884,7 +884,7 @@ as the draft C++2a standard evolves.<br>
     <tr><br>
       <td><tt>const</tt> mismatch with defaulted copy constructor</td><br>
       <td><a href="<a href="http://wg21.link/p0641r2" rel="noreferrer" target="_blank">http://wg21.link/p0641r2</a>">P0641R2</a></td><br>
-      <td class="none" align="center">No</td><br>
+      <td class="svn" align="center">SVN</td><br>
     </tr><br>
     <tr><br>
       <td rowspan="3">Consistent comparison (<tt>operator&lt;=&gt;</tt>)</td><br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>