Thanks Alex... On Fri, Jun 9, 2017 at 1:02 AM, Alexander Kornienko via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Fixes committed in r305024 and r305057. > > On Fri, Jun 9, 2017 at 12:07 AM, Alexander Kornienko <ale...@google.com> > wrote: > >> It looks like the buildbots have exceptions turned off by default, so the >> tests need to use `-fexceptions` explicitly. Testing a fix... >> >> On Thu, Jun 8, 2017 at 11:26 PM, Galina Kistanova <gkistan...@gmail.com> >> wrote: >> >>> Hello Alexander, >>> >>> Couple of our builders do not like this commit: >>> >>> Failing Tests: >>> >>> Clang Tools :: clang-tidy/modernize-use-noexcept-opt.cpp >>> Clang Tools :: clang-tidy/modernize-use-noexcept.cpp >>> >>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei >>> -ps4-ubuntu-fast/builds/12431 >>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei >>> -ps4-windows10pro-fast >>> >>> Please have a look at this? >>> >>> Thanks >>> >>> Galina >>> >>> On Thu, Jun 8, 2017 at 7:04 AM, Alexander Kornienko via cfe-commits < >>> cfe-commits@lists.llvm.org> wrote: >>> >>>> Author: alexfh >>>> Date: Thu Jun 8 09:04:16 2017 >>>> New Revision: 304977 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=304977&view=rev >>>> Log: >>>> [clang-tidy] New checker to replace dynamic exception specifications >>>> >>>> Summary: >>>> New checker to replace dynamic exception >>>> specifications >>>> >>>> This is an alternative to D18575 which relied on reparsing the decl to >>>> find the location of dynamic exception specifications, but couldn't >>>> deal with preprocessor conditionals correctly without reparsing the >>>> entire file. >>>> >>>> This approach uses D20428 to find dynamic exception specification >>>> locations and handles all cases correctly. >>>> >>>> Reviewers: aaron.ballman, alexfh >>>> >>>> Reviewed By: aaron.ballman, alexfh >>>> >>>> Subscribers: xazax.hun, mgehre, malcolm.parsons, mgorny, JDevlieghere, >>>> cfe-commits, Eugene.Zelenko, etienneb >>>> >>>> Patch by Don Hinton! >>>> >>>> Differential Revision: https://reviews.llvm.org/D20693 >>>> >>>> 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-noexce >>>> pt-macro.cpp >>>> clang-tools-extra/trunk/test/clang-tidy/modernize-use-noexce >>>> pt-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/ModernizeTidyMo >>>> dule.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=304977&r1=304976&r2= >>>> 304977&view=diff >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt >>>> (original) >>>> +++ clang-tools-extra/trunk/clang-tidy/modernize/CMakeLists.txt Thu >>>> Jun 8 09:04:16 2017 >>>> @@ -22,6 +22,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/ModernizeTidyMo >>>> dule.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >>>> clang-tidy/modernize/ModernizeTidyModule.cpp?rev=304977&r1=3 >>>> 04976&r2=304977&view=diff >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp >>>> (original) >>>> +++ clang-tools-extra/trunk/clang-tidy/modernize/ModernizeTidyModule.cpp >>>> Thu Jun 8 09:04:16 2017 >>>> @@ -28,6 +28,7 @@ >>>> #include "UseEmplaceCheck.h" >>>> #include "UseEqualsDefaultCheck.h" >>>> #include "UseEqualsDeleteCheck.h" >>>> +#include "UseNoexceptCheck.h" >>>> #include "UseNullptrCheck.h" >>>> #include "UseOverrideCheck.h" >>>> #include "UseTransparentFunctorsCheck.h" >>>> @@ -69,6 +70,7 @@ public: >>>> CheckFactories.registerCheck<UseEqualsDefaultCheck>("modern >>>> ize-use-equals-default"); >>>> CheckFactories.registerCheck<UseEqualsDeleteCheck>( >>>> "modernize-use-equals-delete"); >>>> + CheckFactories.registerCheck<UseNoexceptCheck>("modernize-us >>>> e-noexcept"); >>>> CheckFactories.registerCheck<UseNullptrCheck>("modernize-us >>>> e-nullptr"); >>>> CheckFactories.registerCheck<UseOverrideCheck>("modernize-u >>>> se-override"); >>>> CheckFactories.registerCheck<UseTransparentFunctorsCheck>( >>>> >>>> Added: clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptChec >>>> k.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >>>> clang-tidy/modernize/UseNoexceptCheck.cpp?rev=304977&view=auto >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp >>>> (added) >>>> +++ clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.cpp >>>> Thu Jun 8 09:04:16 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(functionProtoTy >>>> pe(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(inne >>>> rType( >>>> + functionProtoType(hasDynamicEx >>>> ceptionSpec())))))), >>>> + hasType(memberPointerType(poin >>>> tee(parenType(innerType( >>>> + functionProtoType(hasDynamicEx >>>> ceptionSpec())))))))) >>>> + .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<Functio >>>> nDecl>("del-dtor"); >>>> + FnTy = FuncDecl->getType()->getAs<FunctionProtoType>(); >>>> + if (const auto *TSI = FuncDecl->getTypeSourceInfo()) >>>> + Range = >>>> + TSI->getTypeLoc().castAs<FunctionTypeLoc>().getExceptionSpec >>>> Range(); >>>> + } 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.c_str() >>>> + : 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=304977&view=auto >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h >>>> (added) >>>> +++ clang-tools-extra/trunk/clang-tidy/modernize/UseNoexceptCheck.h >>>> Thu Jun 8 09:04:16 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=304977&r1=304976&r2=304977&view=diff >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) >>>> +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Thu Jun 8 09:04:16 >>>> 2017 >>>> @@ -100,6 +100,11 @@ Improvements to clang-tidy >>>> to remove user-defined make functions from ``push_back`` calls on >>>> containers >>>> of custom tuple-like types by providing `TupleTypes` and >>>> `TupleMakeFunctions`. >>>> >>>> + - New `modernize-use-noexcept >>>> + <http://clang.llvm.org/extra/clang-tidy/checks/modernize-us >>>> e-noexcept.html>`_ check >>>> + >>>> + Replaces dynamic exception specifications with ``noexcept`` or a >>>> user defined macro. >>>> + >>>> - New `performance-inefficient-vector-operation >>>> <http://clang.llvm.org/extra/clang-tidy/checks/performance- >>>> inefficient-vector-operation.html>`_ check >>>> >>>> >>>> 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=304977&r1=304976&r2=3049 >>>> 77&view=diff >>>> ============================================================ >>>> ================== >>>> --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) >>>> +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Thu Jun 8 >>>> 09:04:16 2017 >>>> @@ -135,6 +135,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=304977&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 Jun 8 09:04:16 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``. Fix-it 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 fix-it generated. >>>> + void foo() NOEXCEPT; >>>> + >>>> +if the :option:`ReplacementString` option is set to `NOEXCEPT`. >>>> + >>>> +.. option:: UseNoexceptFalse >>>> + >>>> +Enabled by default, disabling will generate fix-it 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-noexce >>>> pt-macro.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >>>> test/clang-tidy/modernize-use-noexcept-macro.cpp?rev=304977&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 Jun 8 09:04:16 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-noexce >>>> pt-opt.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >>>> test/clang-tidy/modernize-use-noexcept-opt.cpp?rev=304977&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 Jun 8 09:04:16 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-noexce >>>> pt.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >>>> test/clang-tidy/modernize-use-noexcept.cpp?rev=304977&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 Jun 8 09:04:16 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 > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits