On Wed, Jun 12, 2013 at 7:02 PM, Richard Smith <[email protected]> wrote: > Author: rsmith > Date: Wed Jun 12 21:02:51 2013 > New Revision: 183881 > > URL: http://llvm.org/viewvc/llvm-project?rev=183881&view=rev > Log: > Add -Wdeprecated warnings and fixits for things deprecated in C++11: > - 'register' storage class > - dynamic exception specifications
If you're just working down the list - I'd love to see the rule of 5 deprecations (using an implicit copy ctor/assignment operator when an explicit copy/move ctor/assignment operator are provided) implemented. Though I may get to that myself one of these days if it's not on your list/priority right now. > > Only the former check is enabled by default for now (the latter might be > quite noisy). > > Added: > cfe/trunk/test/SemaCXX/deprecated.cpp > Modified: > cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Parse/ParseDecl.cpp > cfe/trunk/lib/Parse/ParseDeclCXX.cpp > cfe/trunk/test/CXX/class/class.friend/p6.cpp > cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp > cfe/trunk/test/FixIt/fixit-cxx0x.cpp > cfe/trunk/test/Sema/thread-specifier.c > cfe/trunk/test/SemaCXX/attr-cxx0x.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Wed Jun 12 21:02:51 > 2013 > @@ -309,6 +309,8 @@ def err_expected_class_name_not_template > Error<"'typename' is redundant; base classes are implicitly types">; > def err_unspecified_vla_size_with_static : Error< > "'static' may not be used with an unspecified variable length array size">; > +def warn_deprecated_register : Warning< > + "'register' storage class specifier is deprecated">, InGroup<Deprecated>; > > def err_expected_case_before_expression: Error< > "expected 'case' keyword before expression">; > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jun 12 21:02:51 > 2013 > @@ -287,6 +287,10 @@ def note_using_decl : Note<"%select{|pre > def warn_access_decl_deprecated : Warning< > "access declarations are deprecated; use using declarations instead">, > InGroup<Deprecated>; > +def warn_exception_spec_deprecated : Warning< > + "dynamic exception specifications are deprecated">, > + InGroup<Deprecated>, DefaultIgnore; > +def note_exception_spec_deprecated : Note<"use '%0' instead">; > > def warn_global_constructor : Warning< > "declaration requires a global constructor">, > > Modified: cfe/trunk/lib/Parse/ParseDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) > +++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Jun 12 21:02:51 2013 > @@ -2771,6 +2771,9 @@ void Parser::ParseDeclarationSpecifiers( > PrevSpec, DiagID); > break; > case tok::kw_register: > + if (getLangOpts().CPlusPlus11) > + Diag(Tok, diag::warn_deprecated_register) > + << FixItHint::CreateRemoval(Tok.getLocation()); > isInvalid = DS.SetStorageClassSpec(Actions, DeclSpec::SCS_register, > Loc, > PrevSpec, DiagID); > break; > > Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original) > +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Jun 12 21:02:51 2013 > @@ -2893,6 +2893,16 @@ Parser::tryParseExceptionSpecification( > return Result; > } > > +static void diagnoseDynamicExceptionSpecification( > + Parser &P, const SourceRange &Range, bool IsNoexcept) { > + if (P.getLangOpts().CPlusPlus11) { > + const char *Replacement = IsNoexcept ? "noexcept" : "noexcept(false)"; > + P.Diag(Range.getBegin(), diag::warn_exception_spec_deprecated) << Range; > + P.Diag(Range.getBegin(), diag::note_exception_spec_deprecated) > + << Replacement << FixItHint::CreateReplacement(Range, Replacement); > + } > +} > + > /// ParseDynamicExceptionSpecification - Parse a C++ > /// dynamic-exception-specification (C++ [except.spec]). > /// > @@ -2926,6 +2936,7 @@ ExceptionSpecificationType Parser::Parse > Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec); > T.consumeClose(); > SpecificationRange.setEnd(T.getCloseLocation()); > + diagnoseDynamicExceptionSpecification(*this, SpecificationRange, false); > return EST_MSAny; > } > > @@ -2957,6 +2968,8 @@ ExceptionSpecificationType Parser::Parse > > T.consumeClose(); > SpecificationRange.setEnd(T.getCloseLocation()); > + diagnoseDynamicExceptionSpecification(*this, SpecificationRange, > + Exceptions.empty()); > return Exceptions.empty() ? EST_DynamicNone : EST_Dynamic; > } > > > Modified: cfe/trunk/test/CXX/class/class.friend/p6.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.friend/p6.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/test/CXX/class/class.friend/p6.cpp (original) > +++ cfe/trunk/test/CXX/class/class.friend/p6.cpp Wed Jun 12 21:02:51 2013 > @@ -4,7 +4,11 @@ > class A { > friend static class B; // expected-error {{'static' is invalid in friend > declarations}} > friend extern class C; // expected-error {{'extern' is invalid in friend > declarations}} > +#if __cplusplus < 201103L > friend register class E; // expected-error {{'register' is invalid in > friend declarations}} > +#else > + friend register class E; // expected-error {{'register' is invalid in > friend declarations}} expected-warning {{deprecated}} > +#endif > friend mutable class F; // expected-error {{'mutable' is invalid in friend > declarations}} > friend typedef class G; // expected-error {{'typedef' is invalid in friend > declarations}} > friend __thread class G; // expected-error {{'__thread' is invalid in > friend declarations}} > > Modified: cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp (original) > +++ cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp Wed Jun 12 > 21:02:51 2013 > @@ -117,7 +117,7 @@ void g() { > > for (extern int a : A()) {} // expected-error {{loop variable 'a' may not > be declared 'extern'}} > for (static int a : A()) {} // expected-error {{loop variable 'a' may not > be declared 'static'}} > - for (register int a : A()) {} // expected-error {{loop variable 'a' may > not be declared 'register'}} > + for (register int a : A()) {} // expected-error {{loop variable 'a' may > not be declared 'register'}} expected-warning {{deprecated}} > for (constexpr int a : A()) {} // expected-error {{loop variable 'a' may > not be declared 'constexpr'}} > > for (auto u : X::NoBeginADL()) { // expected-error {{invalid range > expression of type 'X::NoBeginADL'; no viable 'begin' function available}} > > Modified: cfe/trunk/test/FixIt/fixit-cxx0x.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/fixit-cxx0x.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/test/FixIt/fixit-cxx0x.cpp (original) > +++ cfe/trunk/test/FixIt/fixit-cxx0x.cpp Wed Jun 12 21:02:51 2013 > @@ -132,3 +132,8 @@ namespace NonStaticConstexpr { > } > }; > } > + > +int RegisterVariable() { > + register int n; // expected-warning {{'register' storage class specifier > is deprecated}} > + return n; > +} > > Modified: cfe/trunk/test/Sema/thread-specifier.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/thread-specifier.c?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/thread-specifier.c (original) > +++ cfe/trunk/test/Sema/thread-specifier.c Wed Jun 12 21:02:51 2013 > @@ -2,8 +2,8 @@ > // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DGNU > // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic %s -DC11 -D__thread=_Thread_local > // RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DC11 -D__thread=_Thread_local > -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DCXX11 > -D__thread=thread_local -std=c++11 > -// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DC11 > -D__thread=_Thread_local -std=c++11 > +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DCXX11 > -D__thread=thread_local -std=c++11 -Wno-deprecated > +// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only > -Wno-private-extern -verify -pedantic -x c++ %s -DC11 > -D__thread=_Thread_local -std=c++11 -Wno-deprecated > > #ifdef __cplusplus > // In C++, we define __private_extern__ to extern. > > Modified: cfe/trunk/test/SemaCXX/attr-cxx0x.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-cxx0x.cpp?rev=183881&r1=183880&r2=183881&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCXX/attr-cxx0x.cpp (original) > +++ cfe/trunk/test/SemaCXX/attr-cxx0x.cpp Wed Jun 12 21:02:51 2013 > @@ -12,7 +12,7 @@ struct align_member { > }; > > void f(alignas(1) char c) { // expected-error {{'alignas' attribute cannot > be applied to a function parameter}} > - alignas(1) register char k; // expected-error {{'alignas' attribute cannot > be applied to a variable with 'register' storage class}} > + alignas(1) register char k; // expected-error {{'alignas' attribute cannot > be applied to a variable with 'register' storage class}} expected-warning > {{deprecated}} > try { > } catch (alignas(4) int n) { // expected-error {{'alignas' attribute > cannot be applied to a 'catch' variable}} > } > > Added: cfe/trunk/test/SemaCXX/deprecated.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/deprecated.cpp?rev=183881&view=auto > ============================================================================== > --- cfe/trunk/test/SemaCXX/deprecated.cpp (added) > +++ cfe/trunk/test/SemaCXX/deprecated.cpp Wed Jun 12 21:02:51 2013 > @@ -0,0 +1,31 @@ > +// RUN: %clang_cc1 -std=c++98 %s -Wdeprecated -verify > +// RUN: %clang_cc1 -std=c++11 %s -Wdeprecated -verify > +// RUN: %clang_cc1 -std=c++1y %s -Wdeprecated -verify > + > +void f() throw(); > +void g() throw(int); > +void h() throw(...); > +#if __cplusplus >= 201103L > +// expected-warning@-4 {{dynamic exception specifications are deprecated}} > expected-note@-4 {{use 'noexcept' instead}} > +// expected-warning@-4 {{dynamic exception specifications are deprecated}} > expected-note@-4 {{use 'noexcept(false)' instead}} > +// expected-warning@-4 {{dynamic exception specifications are deprecated}} > expected-note@-4 {{use 'noexcept(false)' instead}} > +#endif > + > +void stuff() { > + register int n; > +#if __cplusplus >= 201103L > + // expected-warning@-2 {{'register' storage class specifier is deprecated}} > +#endif > + > + bool b; > + ++b; // expected-warning {{incrementing expression of type bool is > deprecated}} > + > + // FIXME: This is ill-formed in C++11. > + char *p = "foo"; // expected-warning {{conversion from string literal to > 'char *' is deprecated}} > +} > + > +struct S { int n; }; > +struct T : private S { > + // FIXME: This is ill-formed in C++11. > + S::n; // expected-warning {{access declarations are deprecated; use using > declarations instead}} > +}; > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
