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

don hinton via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 9 06:43:25 PDT 2017


Thanks Alex...

On Fri, Jun 9, 2017 at 1:02 AM, Alexander Kornienko via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> 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/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 at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
>>>
>>
>
> _______________________________________________
> 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/c0bd64aa/attachment-0001.html>


More information about the cfe-commits mailing list