xbolva00 updated this revision to Diff 229658. xbolva00 added a comment. Added -Wdeprecated-copy-dtor (not part of -Wextra). Now we should be fully compatible with GCC.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D70342/new/ https://reviews.llvm.org/D70342 Files: clang/include/clang/Basic/DiagnosticGroups.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/deprecated-copy.cpp Index: clang/test/SemaCXX/deprecated-copy.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/deprecated-copy.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy -verify +// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy-dtor -DDEPRECATED_COPY_DTOR -verify +// RUN: %clang_cc1 -std=c++11 %s -Wextra -verify + +#ifdef DEPRECATED_COPY_DTOR +struct A { + int *ptr; + ~A() { delete ptr; } // expected-warning {{definition of implicit copy constructor for 'A' is deprecated because it has a user-declared destructor}} +}; + +void foo() { + A a{}; + A b = a; // expected-note {{implicit copy constructor for 'A' first required here}} +} +#else +struct B { + B &operator=(const B &); // expected-warning {{definition of implicit copy constructor for 'B' is deprecated because it has a user-declared copy assignment operator}} +}; + +void bar() { + B b1, b2(b1); // expected-note {{implicit copy constructor for 'B' first required here}} +} +#endif \ No newline at end of file Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -12434,9 +12434,10 @@ if (UserDeclaredOperation) { S.Diag(UserDeclaredOperation->getLocation(), - diag::warn_deprecated_copy_operation) - << RD << /*copy assignment*/!isa<CXXConstructorDecl>(CopyOp) - << /*destructor*/isa<CXXDestructorDecl>(UserDeclaredOperation); + isa<CXXDestructorDecl>(UserDeclaredOperation) + ? diag::warn_deprecated_copy_dtor_operation + : diag::warn_deprecated_copy_operation) + << RD << /*copy assignment*/ !isa<CXXConstructorDecl>(CopyOp); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -551,9 +551,13 @@ "use using declarations instead">; def warn_deprecated_copy_operation : Warning< "definition of implicit copy %select{constructor|assignment operator}1 " - "for %0 is deprecated because it has a user-declared " - "%select{copy %select{assignment operator|constructor}1|destructor}2">, - InGroup<Deprecated>, DefaultIgnore; + "for %0 is deprecated because it has a user-declared copy " + "%select{assignment operator|constructor}1">, + InGroup<DeprecatedCopy>, DefaultIgnore; +def warn_deprecated_copy_dtor_operation : Warning< + "definition of implicit copy %select{constructor|assignment operator}1 " + "for %0 is deprecated because it has a user-declared destructor">, + InGroup<DeprecatedCopyDtor>, DefaultIgnore; def warn_cxx17_compat_exception_spec_in_signature : Warning< "mangled name of %0 will change in C++17 due to non-throwing exception " "specification in function signature">, InGroup<CXX17CompatMangling>; Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -128,6 +128,8 @@ def DeprecatedAttributes : DiagGroup<"deprecated-attributes">; def DeprecatedCommaSubscript : DiagGroup<"deprecated-comma-subscript">; +def DeprecatedCopy : DiagGroup<"deprecated-copy">; +def DeprecatedCopyDtor : DiagGroup<"deprecated-copy-dtor">; def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">; def UnavailableDeclarations : DiagGroup<"unavailable-declarations">; def UnguardedAvailabilityNew : DiagGroup<"unguarded-availability-new">; @@ -147,6 +149,8 @@ // FIXME: Why is DeprecatedImplementations not in this group? def Deprecated : DiagGroup<"deprecated", [DeprecatedAttributes, DeprecatedCommaSubscript, + DeprecatedCopy, + DeprecatedCopyDtor, DeprecatedDeclarations, DeprecatedDynamicExceptionSpec, DeprecatedIncrementBool, @@ -812,6 +816,7 @@ ]>; def Extra : DiagGroup<"extra", [ + DeprecatedCopy, MissingFieldInitializers, IgnoredQualifiers, InitializerOverrides,
Index: clang/test/SemaCXX/deprecated-copy.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/deprecated-copy.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy -verify +// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy-dtor -DDEPRECATED_COPY_DTOR -verify +// RUN: %clang_cc1 -std=c++11 %s -Wextra -verify + +#ifdef DEPRECATED_COPY_DTOR +struct A { + int *ptr; + ~A() { delete ptr; } // expected-warning {{definition of implicit copy constructor for 'A' is deprecated because it has a user-declared destructor}} +}; + +void foo() { + A a{}; + A b = a; // expected-note {{implicit copy constructor for 'A' first required here}} +} +#else +struct B { + B &operator=(const B &); // expected-warning {{definition of implicit copy constructor for 'B' is deprecated because it has a user-declared copy assignment operator}} +}; + +void bar() { + B b1, b2(b1); // expected-note {{implicit copy constructor for 'B' first required here}} +} +#endif \ No newline at end of file Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -12434,9 +12434,10 @@ if (UserDeclaredOperation) { S.Diag(UserDeclaredOperation->getLocation(), - diag::warn_deprecated_copy_operation) - << RD << /*copy assignment*/!isa<CXXConstructorDecl>(CopyOp) - << /*destructor*/isa<CXXDestructorDecl>(UserDeclaredOperation); + isa<CXXDestructorDecl>(UserDeclaredOperation) + ? diag::warn_deprecated_copy_dtor_operation + : diag::warn_deprecated_copy_operation) + << RD << /*copy assignment*/ !isa<CXXConstructorDecl>(CopyOp); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -551,9 +551,13 @@ "use using declarations instead">; def warn_deprecated_copy_operation : Warning< "definition of implicit copy %select{constructor|assignment operator}1 " - "for %0 is deprecated because it has a user-declared " - "%select{copy %select{assignment operator|constructor}1|destructor}2">, - InGroup<Deprecated>, DefaultIgnore; + "for %0 is deprecated because it has a user-declared copy " + "%select{assignment operator|constructor}1">, + InGroup<DeprecatedCopy>, DefaultIgnore; +def warn_deprecated_copy_dtor_operation : Warning< + "definition of implicit copy %select{constructor|assignment operator}1 " + "for %0 is deprecated because it has a user-declared destructor">, + InGroup<DeprecatedCopyDtor>, DefaultIgnore; def warn_cxx17_compat_exception_spec_in_signature : Warning< "mangled name of %0 will change in C++17 due to non-throwing exception " "specification in function signature">, InGroup<CXX17CompatMangling>; Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -128,6 +128,8 @@ def DeprecatedAttributes : DiagGroup<"deprecated-attributes">; def DeprecatedCommaSubscript : DiagGroup<"deprecated-comma-subscript">; +def DeprecatedCopy : DiagGroup<"deprecated-copy">; +def DeprecatedCopyDtor : DiagGroup<"deprecated-copy-dtor">; def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">; def UnavailableDeclarations : DiagGroup<"unavailable-declarations">; def UnguardedAvailabilityNew : DiagGroup<"unguarded-availability-new">; @@ -147,6 +149,8 @@ // FIXME: Why is DeprecatedImplementations not in this group? def Deprecated : DiagGroup<"deprecated", [DeprecatedAttributes, DeprecatedCommaSubscript, + DeprecatedCopy, + DeprecatedCopyDtor, DeprecatedDeclarations, DeprecatedDynamicExceptionSpec, DeprecatedIncrementBool, @@ -812,6 +816,7 @@ ]>; def Extra : DiagGroup<"extra", [ + DeprecatedCopy, MissingFieldInitializers, IgnoredQualifiers, InitializerOverrides,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits