Hi Don, Hi Aaron, I had to revert this in r293267 because all the clang-tools-extra buildbots were still broken many hours after it was committed. See for instance http://lab.llvm.org:8011/builders/clang-cmake-aarch64-full/builds/1039
Eugene Zelenko also had some small fixes to modernize-use-noexcept.rst, you might want to incorporate those as well before recommitting (see r293234). Regards, Diana On 27 January 2017 at 00:34, Aaron Ballman via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: aaronballman > Date: Thu Jan 26 16:34:24 2017 > New Revision: 293217 > > URL: http://llvm.org/viewvc/llvm-project?rev=293217&view=rev > Log: > Implement a new clang-tidy check that suggests users replace dynamic > exception specifications with noexcept exception specifications. > > Patch by Don Hinton. > > Added: > clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp > clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h > clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-noexcept.rst > clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-macro.cpp > clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-opt.cpp > clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept.cpp > Modified: > clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt > clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp > clang-tools-extra/trunk/docs/ReleaseNotes.rst > clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > > Modified: clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt?rev=293217&r1=293216&r2=293217&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt (original) > +++ clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt Thu Jan 26 > 16:34:24 2017 > @@ -20,6 +20,7 @@ add_clang_library(clangTidyModernizeModu > UseEmplaceCheck.cpp > UseEqualsDefaultCheck.cpp > UseEqualsDeleteCheck.cpp > + UseNoexceptCheck.cpp > UseNullptrCheck.cpp > UseOverrideCheck.cpp > UseTransparentFunctorsCheck.cpp > > Modified: clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp?rev=293217&r1=293216&r2=293217&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp > (original) > +++ clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp Thu > Jan 26 16:34:24 2017 > @@ -26,6 +26,7 @@ > #include "UseEmplaceCheck.h" > #include "UseEqualsDefaultCheck.h" > #include "UseEqualsDeleteCheck.h" > +#include "UseNoexceptCheck.h" > #include "UseNullptrCheck.h" > #include "UseOverrideCheck.h" > #include "UseTransparentFunctorsCheck.h" > @@ -63,6 +64,7 @@ public: > > CheckFactories.registerCheck<UseEqualsDefaultCheck>("modernize-use-equals-default"); > CheckFactories.registerCheck<UseEqualsDeleteCheck>( > "modernize-use-equals-delete"); > + CheckFactories.registerCheck<UseNoexceptCheck>("modernize-use-noexcept"); > CheckFactories.registerCheck<UseNullptrCheck>("modernize-use-nullptr"); > CheckFactories.registerCheck<UseOverrideCheck>("modernize-use-override"); > CheckFactories.registerCheck<UseTransparentFunctorsCheck>( > > Added: clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp (added) > +++ clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp Thu Jan > 26 16:34:24 2017 > @@ -0,0 +1,114 @@ > +//===--- UseNoexceptCheck.cpp - > clang-tidy---------------------------------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > + > +#include "UseNoexceptCheck.h" > +#include "clang/AST/ASTContext.h" > +#include "clang/Lex/Lexer.h" > + > +using namespace clang::ast_matchers; > + > +namespace clang { > +namespace tidy { > +namespace modernize { > + > +UseNoexceptCheck::UseNoexceptCheck(StringRef Name, ClangTidyContext *Context) > + : ClangTidyCheck(Name, Context), > + NoexceptMacro(Options.get("ReplacementString", "")), > + UseNoexceptFalse(Options.get("UseNoexceptFalse", true)) {} > + > +void UseNoexceptCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { > + Options.store(Opts, "ReplacementString", NoexceptMacro); > + Options.store(Opts, "UseNoexceptFalse", UseNoexceptFalse); > +} > + > +void UseNoexceptCheck::registerMatchers(MatchFinder *Finder) { > + if (!getLangOpts().CPlusPlus11) > + return; > + > + Finder->addMatcher( > + functionDecl( > + cxxMethodDecl( > + hasTypeLoc(loc(functionProtoType(hasDynamicExceptionSpec()))), > + anyOf(hasOverloadedOperatorName("delete[]"), > + hasOverloadedOperatorName("delete"), > cxxDestructorDecl())) > + .bind("del-dtor")) > + .bind("funcDecl"), > + this); > + > + Finder->addMatcher( > + functionDecl( > + hasTypeLoc(loc(functionProtoType(hasDynamicExceptionSpec()))), > + unless(anyOf(hasOverloadedOperatorName("delete[]"), > + hasOverloadedOperatorName("delete"), > + cxxDestructorDecl()))) > + .bind("funcDecl"), > + this); > + > + Finder->addMatcher( > + parmVarDecl(anyOf(hasType(pointerType(pointee(parenType(innerType( > + > functionProtoType(hasDynamicExceptionSpec())))))), > + > hasType(memberPointerType(pointee(parenType(innerType( > + > functionProtoType(hasDynamicExceptionSpec())))))))) > + .bind("parmVarDecl"), > + this); > +} > + > +void UseNoexceptCheck::check(const MatchFinder::MatchResult &Result) { > + const FunctionProtoType *FnTy = nullptr; > + bool DtorOrOperatorDel = false; > + SourceRange Range; > + > + if (const auto *FuncDecl = > Result.Nodes.getNodeAs<FunctionDecl>("funcDecl")) { > + DtorOrOperatorDel = Result.Nodes.getNodeAs<FunctionDecl>("del-dtor"); > + FnTy = FuncDecl->getType()->getAs<FunctionProtoType>(); > + if (const auto *TSI = FuncDecl->getTypeSourceInfo()) > + Range = > + > TSI->getTypeLoc().castAs<FunctionTypeLoc>().getExceptionSpecRange(); > + } else if (const auto *ParmDecl = > + Result.Nodes.getNodeAs<ParmVarDecl>("parmVarDecl")) { > + FnTy = ParmDecl->getType() > + ->getAs<Type>() > + ->getPointeeType() > + ->getAs<FunctionProtoType>(); > + > + if (const auto *TSI = ParmDecl->getTypeSourceInfo()) > + Range = TSI->getTypeLoc() > + .getNextTypeLoc() > + .IgnoreParens() > + .castAs<FunctionProtoTypeLoc>() > + .getExceptionSpecRange(); > + } > + CharSourceRange CRange = Lexer::makeFileCharRange( > + CharSourceRange::getTokenRange(Range), *Result.SourceManager, > + Result.Context->getLangOpts()); > + > + assert(FnTy && "FunctionProtoType is null."); > + bool IsNoThrow = FnTy->isNothrow(*Result.Context); > + StringRef ReplacementStr = > + IsNoThrow > + ? NoexceptMacro.empty() ? "noexcept" : NoexceptMacro > + : NoexceptMacro.empty() > + ? (DtorOrOperatorDel || UseNoexceptFalse) ? "noexcept(false)" > + : "" > + : ""; > + > + FixItHint FixIt; > + if ((IsNoThrow || NoexceptMacro.empty()) && CRange.isValid()) > + FixIt = FixItHint::CreateReplacement(CRange, ReplacementStr); > + > + diag(Range.getBegin(), "dynamic exception specification '%0' is > deprecated; " > + "consider %select{using '%2'|removing it}1 instead") > + << Lexer::getSourceText(CRange, *Result.SourceManager, > + Result.Context->getLangOpts()) > + << ReplacementStr.empty() << ReplacementStr << FixIt; > +} > + > +} // namespace modernize > +} // namespace tidy > +} // namespace clang > > Added: clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h (added) > +++ clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h Thu Jan > 26 16:34:24 2017 > @@ -0,0 +1,49 @@ > +//===--- UseNoexceptCheck.h - clang-tidy-------------------------*- C++ > -*-===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > + > +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_NOEXCEPT_H > +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_NOEXCEPT_H > + > +#include "../ClangTidy.h" > + > +namespace clang { > +namespace tidy { > +namespace modernize { > + > +/// \brief Replace dynamic exception specifications, with > +/// `noexcept` (or user-defined macro) or `noexcept(false)`. > +/// \code > +/// void foo() throw(); > +/// void bar() throw(int); > +/// \endcode > +/// Is converted to: > +/// \code > +/// void foo() ; > +// void bar() noexcept(false); > +/// \endcode > +/// > +/// For the user-facing documentation see: > +/// http://clang.llvm.org/extra/clang-tidy/checks/modernize-use-noexcept.html > +class UseNoexceptCheck : public ClangTidyCheck { > +public: > + UseNoexceptCheck(StringRef Name, ClangTidyContext *Context); > + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; > + void registerMatchers(ast_matchers::MatchFinder *Finder) override; > + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; > + > +private: > + const std::string NoexceptMacro; > + bool UseNoexceptFalse; > +}; > + > +} // namespace modernize > +} // namespace tidy > +} // namespace clang > + > +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_NOEXCEPT_H > > Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=293217&r1=293216&r2=293217&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) > +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Thu Jan 26 16:34:24 2017 > @@ -57,7 +57,10 @@ The improvements are... > Improvements to clang-tidy > -------------------------- > > -The improvements are... > + - New `modernize-use-noexcept > + > <http://clang.llvm.org/extra/clang-tidy/checks/modernize-use-noexcept.html>`_ > check > + > + Replaces dynamic exception specifications with ``noexcept`` or a user > defined macro. > > Improvements to include-fixer > ----------------------------- > > Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=293217&r1=293216&r2=293217&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) > +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Thu Jan 26 > 16:34:24 2017 > @@ -116,6 +116,7 @@ Clang-Tidy Checks > modernize-use-emplace > modernize-use-equals-default > modernize-use-equals-delete > + modernize-use-noexcept > modernize-use-nullptr > modernize-use-override > modernize-use-transparent-functors > > Added: > clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-noexcept.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-noexcept.rst?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-noexcept.rst > (added) > +++ clang-tools-extra/trunk/docs/clang-tidy/checks/modernize-use-noexcept.rst > Thu Jan 26 16:34:24 2017 > @@ -0,0 +1,90 @@ > +.. title:: clang-tidy - modernize-use-noexcept > + > +modernize-use-noexcept > +====================== > + > +This check replaces deprecated dynamic exception specifications with > +the appropriate noexcept specification (introduced in C++11). By > +default this check will replace ``throw()`` with ``noexcept``, > +and ``throw(<exception>[,...])`` or ``throw(...)`` with > +``noexcept(false)``. > + > +Example > +------- > + > +.. code-block:: c++ > + > + void foo() throw(); > + void bar() throw(int) {} > + > +transforms to: > + > +.. code-block:: c++ > + > + void foo() noexcept; > + void bar() noexcept(false) {} > + > +Options > +------- > + > +.. option:: ReplacementString > + > +Users can use :option:`ReplacementString` to specify a macro to use > +instead of ``noexcept``. This is useful when maintaining source code > +that uses custom exception specification marking other than > +``noexcept``. Fixit hints will only be generated for non-throwing > +specifications. > + > +Example > +^^^^^^^ > + > +.. code-block:: c++ > + > + void bar() throw(int); > + void foo() throw(); > + > +transforms to: > + > +.. code-block:: c++ > + > + void bar() throw(int); // No Fixit generated. > + void foo() NOEXCEPT; > + > +if the :option:`ReplacementString` option is set to `NOEXCEPT`. > + > +.. option:: UseNoexceptFalse > + > +Enabled by default, disabling will generate Fixit hints that remove > +throwing dynamic exception specs, e.g., ``throw(<something>)``, > +completely without providing a replacement text, except for > +destructors and delete operators that are ``noexcept(true)`` by > +default. > + > +Example > +^^^^^^^ > + > +.. code-block:: c++ > + > + void foo() throw(int) {} > + > + struct bar { > + void foobar() throw(int); > + void operator delete(void *ptr) throw(int); > + void operator delete[](void *ptr) throw(int); > + ~bar() throw(int); > + } > + > +transforms to: > + > +.. code-block:: c++ > + > + void foo() {} > + > + struct bar { > + void foobar(); > + void operator delete(void *ptr) noexcept(false); > + void operator delete[](void *ptr) noexcept(false); > + ~bar() noexcept(false); > + } > + > +if the :option:`UseNoexceptFalse` option is set to `0`. > > Added: > clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-macro.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-macro.cpp?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-macro.cpp > (added) > +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-macro.cpp > Thu Jan 26 16:34:24 2017 > @@ -0,0 +1,36 @@ > +// RUN: %check_clang_tidy %s modernize-use-noexcept %t -- \ > +// RUN: -config="{CheckOptions: [{key: > modernize-use-noexcept.ReplacementString, value: 'NOEXCEPT'}]}" \ > +// RUN: -- -std=c++11 > + > +// Example definition of NOEXCEPT -- simplified test to see if noexcept is > supported. > +#if (__has_feature(cxx_noexcept)) > +#define NOEXCEPT noexcept > +#else > +#define NOEXCEPT throw() > +#endif > + > +void bar() throw() {} > +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'NOEXCEPT' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void bar() NOEXCEPT {} > + > +// Should not trigger a FixItHint, since macros only support noexcept, and > this > +// case throws. > +class A {}; > +class B {}; > +void foobar() throw(A, B); > +// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: dynamic exception specification > 'throw(A, B)' is deprecated; consider removing it instead > [modernize-use-noexcept] > + > +// Should not trigger a replacement. > +void foo() noexcept(true); > + > +struct Z { > + void operator delete(void *ptr) throw(); > + void operator delete[](void *ptr) throw(int); > + ~Z() throw(int) {} > +}; > +// CHECK-MESSAGES: :[[@LINE-4]]:35: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'NOEXCEPT' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:37: warning: dynamic exception specification > 'throw(int)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:8: warning: dynamic exception specification > 'throw(int)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void operator delete(void *ptr) NOEXCEPT; > +// CHECK-FIXES: void operator delete[](void *ptr) throw(int); > +// CHECK-FIXES: ~Z() throw(int) {} > > Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-opt.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-opt.cpp?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-opt.cpp > (added) > +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept-opt.cpp > Thu Jan 26 16:34:24 2017 > @@ -0,0 +1,88 @@ > +// RUN: %check_clang_tidy %s modernize-use-noexcept %t -- \ > +// RUN: -config="{CheckOptions: [{key: > modernize-use-noexcept.UseNoexceptFalse, value: 0}]}" \ > +// RUN: -- -std=c++11 > + > +class A {}; > +class B {}; > + > +void foo() throw(); > +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foo() noexcept; > + > +void bar() throw(...); > +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: dynamic exception specification > 'throw(...)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void bar() ; > + > +void k() throw(int(int)); > +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: dynamic exception specification > 'throw(int(int))' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void k() ; > + > +void foobar() throw(A, B) > +{} > +// CHECK-MESSAGES: :[[@LINE-2]]:15: warning: dynamic exception specification > 'throw(A, B)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foobar() > + > +void baz(int = (throw A(), 0)) throw(A, B) {} > +// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: dynamic exception specification > 'throw(A, B)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void baz(int = (throw A(), 0)) {} > + > +void g(void (*fp)(void) throw()); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void g(void (*fp)(void) noexcept); > + > +void f(void (*fp)(void) throw(int)) throw(char); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'throw(int)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:37: warning: dynamic exception specification > 'throw(char)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void f(void (*fp)(void) ) ; > + > +#define THROW throw > +void h(void (*fp)(void) THROW(int)) THROW(char); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'THROW(int)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:37: warning: dynamic exception specification > 'THROW(char)' is deprecated; consider removing it instead > [modernize-use-noexcept] > +// CHECK-FIXES: void h(void (*fp)(void) ) ; > + > +void j() throw(int(int) throw(void(void) throw(int))); > +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: dynamic exception specification > 'throw(int(int) throw(void(void) throw(int)))' is deprecated; consider > removing it instead [modernize-use-noexcept] > +// CHECK-FIXES: void j() ; > + > +class Y { > + Y() throw() = default; > +}; > +// CHECK-MESSAGES: :[[@LINE-2]]:7: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: Y() noexcept = default; > + > +struct Z { > + void operator delete(void *ptr) throw(); > + void operator delete[](void *ptr) throw(int); > + ~Z() throw(int) {} > +}; > +// CHECK-MESSAGES: :[[@LINE-4]]:35: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:37: warning: dynamic exception specification > 'throw(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:8: warning: dynamic exception specification > 'throw(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void operator delete(void *ptr) noexcept; > +// CHECK-FIXES: void operator delete[](void *ptr) noexcept(false); > +// CHECK-FIXES: ~Z() noexcept(false) {} > + > +struct S { > + void f() throw(); > +}; > +void f(void (S::*)() throw()); > +// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void f() noexcept; > +// CHECK-FIXES: void f(void (S::*)() noexcept); > + > +typedef void (*fp)(void (*fp2)(int) throw()); > +// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: typedef void (*fp)(void (*fp2)(int) noexcept); > + > +// Should not trigger a replacement. > +void titi() noexcept {} > +void toto() noexcept(true) {} > + > +// Should not trigger a replacement. > +void bad() > +#if !__has_feature(cxx_noexcept) > + throw() > +#endif > + ; > > Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept.cpp?rev=293217&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept.cpp (added) > +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexcept.cpp Thu > Jan 26 16:34:24 2017 > @@ -0,0 +1,104 @@ > +// RUN: %check_clang_tidy %s modernize-use-noexcept %t -- \ > +// RUN: -- -std=c++11 > + > +class A {}; > +class B {}; > + > +void foo() throw(); > +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foo() noexcept; > + > +template <typename T> > +void foo() throw(); > +void footest() { foo<int>(); foo<double>(); } > +// CHECK-MESSAGES: :[[@LINE-2]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foo() noexcept; > + > +void bar() throw(...); > +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: dynamic exception specification > 'throw(...)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void bar() noexcept(false); > + > +void k() throw(int(int)); > +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: dynamic exception specification > 'throw(int(int))' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void k() noexcept(false); > + > +void foobar() throw(A, B) > +{} > +// CHECK-MESSAGES: :[[@LINE-2]]:15: warning: dynamic exception specification > 'throw(A, B)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foobar() noexcept(false) > + > +void baz(int = (throw A(), 0)) throw(A, B) {} > +// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: dynamic exception specification > 'throw(A, B)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void baz(int = (throw A(), 0)) noexcept(false) {} > + > +void g(void (*fp)(void) throw()); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void g(void (*fp)(void) noexcept); > + > +void f(void (*fp)(void) throw(int)) throw(char); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'throw(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:37: warning: dynamic exception specification > 'throw(char)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void f(void (*fp)(void) noexcept(false)) noexcept(false); > + > +#define THROW throw > +void h(void (*fp)(void) THROW(int)) THROW(char); > +// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: dynamic exception specification > 'THROW(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:37: warning: dynamic exception specification > 'THROW(char)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void h(void (*fp)(void) noexcept(false)) noexcept(false); > + > +void j() throw(int(int) throw(void(void) throw(int))); > +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: dynamic exception specification > 'throw(int(int) throw(void(void) throw(int)))' is deprecated; consider using > 'noexcept(false)' instead [modernize-use-noexcept] > +// CHECK-FIXES: void j() noexcept(false); > + > +class Y { > + Y() throw() = default; > +}; > +// CHECK-MESSAGES: :[[@LINE-2]]:7: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: Y() noexcept = default; > + > +struct Z { > + void operator delete(void *ptr) throw(); > + void operator delete[](void *ptr) throw(int); > + ~Z() throw(int) {} > +}; > +// CHECK-MESSAGES: :[[@LINE-4]]:35: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:37: warning: dynamic exception specification > 'throw(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-4]]:8: warning: dynamic exception specification > 'throw(int)' is deprecated; consider using 'noexcept(false)' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void operator delete(void *ptr) noexcept; > +// CHECK-FIXES: void operator delete[](void *ptr) noexcept(false); > +// CHECK-FIXES: ~Z() noexcept(false) {} > + > +struct S { > + void f() throw(); > +}; > +void f(void (S::*)() throw()); > +// CHECK-MESSAGES: :[[@LINE-3]]:12: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:22: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void f() noexcept; > +// CHECK-FIXES: void f(void (S::*)() noexcept); > + > +template <typename T> > +struct ST { > + void foo() throw(); > +}; > +template <typename T> > +void ft(void (ST<T>::*)() throw()); > +// CHECK-MESSAGES: :[[@LINE-4]]:14: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-MESSAGES: :[[@LINE-2]]:27: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: void foo() noexcept; > +// CHECK-FIXES: void ft(void (ST<T>::*)() noexcept); > + > +typedef void (*fp)(void (*fp2)(int) throw()); > +// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: dynamic exception specification > 'throw()' is deprecated; consider using 'noexcept' instead > [modernize-use-noexcept] > +// CHECK-FIXES: typedef void (*fp)(void (*fp2)(int) noexcept); > + > +// Should not trigger a replacement. > +void titi() noexcept {} > +void toto() noexcept(true) {} > + > +// Should not trigger a replacement. > +void bad() > +#if !__has_feature(cxx_noexcept) > + throw() > +#endif > + ; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits