[clang-tools-extra] r304977 - [clang-tidy] New checker to replace dynamic exception specifications

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 9 01:02:39 PDT 2017


Fixes committed in r305024 and r305057.

On Fri, Jun 9, 2017 at 12:07 AM, Alexander Kornienko <alexfh at 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 <gkistanova at 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 at 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/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=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/UseNoexceptCheck.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=304977&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 at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170609/794e5e1b/attachment-0001.html>


More information about the cfe-commits mailing list