Author: alexfh Date: Thu Dec 17 05:49:19 2015 New Revision: 255886 URL: http://llvm.org/viewvc/llvm-project?rev=255886&view=rev Log: Remove clang-modernize.
Summary: clang-modernize transforms have moved to clang-tidy. Removing the old tool now. Reviewers: klimek Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D15606 Removed: clang-tools-extra/trunk/clang-modernize/ clang-tools-extra/trunk/docs/AddOverrideTransform.rst clang-tools-extra/trunk/docs/LoopConvertTransform.rst clang-tools-extra/trunk/docs/MigratorUsage.rst clang-tools-extra/trunk/docs/ModernizerUsage.rst clang-tools-extra/trunk/docs/PassByValueTransform.rst clang-tools-extra/trunk/docs/ReplaceAutoPtrTransform.rst clang-tools-extra/trunk/docs/UseAutoTransform.rst clang-tools-extra/trunk/docs/UseNullptrTransform.rst clang-tools-extra/trunk/test/clang-modernize/ clang-tools-extra/trunk/unittests/clang-modernize/ clang-tools-extra/trunk/unittests/include/common/Utility.h Modified: clang-tools-extra/trunk/CMakeLists.txt clang-tools-extra/trunk/Makefile clang-tools-extra/trunk/docs/clang-modernize.rst clang-tools-extra/trunk/docs/cpp11-migrate.rst clang-tools-extra/trunk/docs/index.rst clang-tools-extra/trunk/test/CMakeLists.txt clang-tools-extra/trunk/unittests/CMakeLists.txt clang-tools-extra/trunk/unittests/Makefile Modified: clang-tools-extra/trunk/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/CMakeLists.txt (original) +++ clang-tools-extra/trunk/CMakeLists.txt Thu Dec 17 05:49:19 2015 @@ -1,5 +1,4 @@ add_subdirectory(clang-apply-replacements) -add_subdirectory(clang-modernize) add_subdirectory(clang-rename) add_subdirectory(modularize) if(CLANG_ENABLE_STATIC_ANALYZER) Modified: clang-tools-extra/trunk/Makefile URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/Makefile (original) +++ clang-tools-extra/trunk/Makefile Thu Dec 17 05:49:19 2015 @@ -12,8 +12,7 @@ CLANG_LEVEL := ../.. include $(CLANG_LEVEL)/../../Makefile.config PARALLEL_DIRS := tool-template modularize pp-trace -DIRS := clang-apply-replacements clang-modernize clang-rename clang-tidy \ - clang-query unittests +DIRS := clang-apply-replacements clang-rename clang-tidy clang-query unittests include $(CLANG_LEVEL)/Makefile Removed: clang-tools-extra/trunk/docs/AddOverrideTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/AddOverrideTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/AddOverrideTransform.rst (original) +++ clang-tools-extra/trunk/docs/AddOverrideTransform.rst (removed) @@ -1,54 +0,0 @@ -.. index:: Add-Override Transform - -====================== -Add-Override Transform -====================== - -The Add-Override Transform adds the ``override`` specifier to member -functions that override a virtual function in a base class and that -don't already have the specifier. The transform is enabled with the -:option:`-add-override` option of :program:`clang-modernize`. -For example: - -.. code-block:: c++ - - class A { - public: - virtual void h() const; - }; - - class B : public A { - public: - void h() const; - - // The declaration of h is transformed to - void h() const override; - }; - -Using Expands-to-Override Macros -================================ - -Like LLVM's ``LLVM_OVERRIDE``, several projects have macros that conditionally -expand to the ``override`` keyword when compiling with C++11 features enabled. -To maintain compatibility with non-C++11 builds, the Add-Override Transform -supports detection and use of these macros instead of using the ``override`` -keyword directly. Specify ``-override-macros`` on the command line to the -Modernizer to enable this behavior. - - -Known Limitations -================= -* This transform will not insert the override keyword if a method is - pure. At the moment it's not possible to track down the pure - specifier location. - -.. code-block:: c++ - - class B : public A { - public: - virtual void h() const = 0; - - // The declaration of h is NOT transformed to - virtual void h() const override = 0; - }; - Removed: clang-tools-extra/trunk/docs/LoopConvertTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/LoopConvertTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/LoopConvertTransform.rst (original) +++ clang-tools-extra/trunk/docs/LoopConvertTransform.rst (removed) @@ -1,257 +0,0 @@ -.. index:: Loop Convert Transform - -====================== -Loop Convert Transform -====================== - -The Loop Convert Transform is a transformation to convert ``for(...; ...; -...)`` loops to use the new range-based loops in C++11. The transform is enabled -with the :option:`-loop-convert` option of :program:`clang-modernize`. - -Three kinds of loops can be converted: - -- Loops over statically allocated arrays -- Loops over containers, using iterators -- Loops over array-like containers, using ``operator[]`` and ``at()`` - -Risk -==== - -Risky ------ - -In loops where the container expression is more complex than just a -reference to a declared expression (a variable, function, enum, etc.), -and some part of it appears elsewhere in the loop, we lower our confidence -in the transformation due to the increased risk of changing semantics. -Transformations for these loops are marked as `risky`, and thus will only -be converted if the acceptable risk level is set to ``-risk=risky``. - -.. code-block:: c++ - - int arr[10][20]; - int l = 5; - - for (int j = 0; j < 20; ++j) - int k = arr[l][j] + l; // using l outside arr[l] is considered risky - - for (int i = 0; i < obj.getVector().size(); ++i) - obj.foo(10); // using 'obj' is considered risky - -See -:ref:`Range-based loops evaluate end() only once<IncorrectRiskyTransformation>` -for an example of an incorrect transformation when the maximum acceptable risk -level is set to `risky`. - -Reasonable (Default) --------------------- - -If a loop calls ``.end()`` or ``.size()`` after each iteration, the -transformation for that loop is marked as `reasonable`, and thus will -be converted if the acceptable risk level is set to ``-risk=reasonable`` -(default) or higher. - -.. code-block:: c++ - - // using size() is considered reasonable - for (int i = 0; i < container.size(); ++i) - cout << container[i]; - -Safe ----- - -Any other loops that do not match the above criteria to be marked as -`risky` or `reasonable` are marked `safe`, and thus will be converted -if the acceptable risk level is set to ``-risk=safe`` or higher. - -.. code-block:: c++ - - int arr[] = {1,2,3}; - - for (int i = 0; i < 3; ++i) - cout << arr[i]; - -Example -======= - -Original: - -.. code-block:: c++ - - const int N = 5; - int arr[] = {1,2,3,4,5}; - vector<int> v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - - // safe transform - for (int i = 0; i < N; ++i) - cout << arr[i]; - - // reasonable transform - for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) - cout << *it;* - - // reasonable transform - for (int i = 0; i < v.size(); ++i) - cout << v[i]; - -After transformation with risk level set to ``-risk=reasonable`` (default): - -.. code-block:: c++ - - const int N = 5; - int arr[] = {1,2,3,4,5}; - vector<int> v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - - // safe transform - for (auto & elem : arr) - cout << elem; - - // reasonable transform - for (auto & elem : v) - cout << elem; - - // reasonable transform - for (auto & elem : v) - cout << elem; - -Limitations -=========== - -There are certain situations where the tool may erroneously perform -transformations that remove information and change semantics. Users of the tool -should be aware of the behaviour and limitations of the transform outlined by -the cases below. - -Comments inside loop headers ----------------------------- - -Comments inside the original loop header are ignored and deleted when -transformed. - -.. code-block:: c++ - - for (int i = 0; i < N; /* This will be deleted */ ++i) { } - -Range-based loops evaluate end() only once ------------------------------------------- - -The C++11 range-based for loop calls ``.end()`` only once during the -initialization of the loop. If in the original loop ``.end()`` is called after -each iteration the semantics of the transformed loop may differ. - -.. code-block:: c++ - - // The following is semantically equivalent to the C++11 range-based for loop, - // therefore the semantics of the header will not change. - for (iterator it = container.begin(), e = container.end(); it != e; ++it) { } - - // Instead of calling .end() after each iteration, this loop will be - // transformed to call .end() only once during the initialization of the loop, - // which may affect semantics. - for (iterator it = container.begin(); it != container.end(); ++it) { } - -.. _IncorrectRiskyTransformation: - -As explained above, calling member functions of the container in the body -of the loop is considered `risky`. If the called member function modifies the -container the semantics of the converted loop will differ due to ``.end()`` -being called only once. - -.. code-block:: c++ - - bool flag = false; - for (vector<T>::iterator it = vec.begin(); it != vec.end(); ++it) { - // Add a copy of the first element to the end of the vector. - if (!flag) { - // This line makes this transformation 'risky'. - vec.push_back(*it); - flag = true; - } - cout << *it; - } - -The original code above prints out the contents of the container including the -newly added element while the converted loop, shown below, will only print the -original contents and not the newly added element. - -.. code-block:: c++ - - bool flag = false; - for (auto & elem : vec) { - // Add a copy of the first element to the end of the vector. - if (!flag) { - // This line makes this transformation 'risky' - vec.push_back(elem); - flag = true; - } - cout << elem; - } - -Semantics will also be affected if ``.end()`` has side effects. For example, in -the case where calls to ``.end()`` are logged the semantics will change in the -transformed loop if ``.end()`` was originally called after each iteration. - -.. code-block:: c++ - - iterator end() { - num_of_end_calls++; - return container.end(); - } - -Overloaded operator->() with side effects ------------------------------------------ - -Similarly, if ``operator->()`` was overloaded to have side effects, such as -logging, the semantics will change. If the iterator's ``operator->()`` was used -in the original loop it will be replaced with ``<container element>.<member>`` -instead due to the implicit dereference as part of the range-based for loop. -Therefore any side effect of the overloaded ``operator->()`` will no longer be -performed. - -.. code-block:: c++ - - for (iterator it = c.begin(); it != c.end(); ++it) { - it->func(); // Using operator->() - } - // Will be transformed to: - for (auto & elem : c) { - elem.func(); // No longer using operator->() - } - -Pointers and references to containers -------------------------------------- - -While most of the transform's risk analysis is dedicated to determining whether -the iterator or container was modified within the loop, it is possible to -circumvent the analysis by accessing and modifying the container through a -pointer or reference. - -If the container were directly used instead of using the pointer or reference -the following transformation would have only been applied at the ``-risk=risky`` -level since calling a member function of the container is considered `risky`. -The transform cannot identify expressions associated with the container that are -different than the one used in the loop header, therefore the transformation -below ends up being performed at the ``-risk=safe`` level. - -.. code-block:: c++ - - vector<int> vec; - - vector<int> *ptr = &vec; - vector<int> &ref = vec; - - for (vector<int>::iterator it = vec.begin(), e = vec.end(); it != e; ++it) { - if (!flag) { - // Accessing and modifying the container is considered risky, but the risk - // level is not raised here. - ptr->push_back(*it); - ref.push_back(*it); - flag = true; - } - } Removed: clang-tools-extra/trunk/docs/MigratorUsage.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/MigratorUsage.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/MigratorUsage.rst (original) +++ clang-tools-extra/trunk/docs/MigratorUsage.rst (removed) @@ -1,6 +0,0 @@ -=================== -cpp11-migrate Usage -=================== - -This program has been renamed :doc:`clang-modernize <clang-modernize>`, and its usage is now -found in :doc:`ModernizerUsage`. Removed: clang-tools-extra/trunk/docs/ModernizerUsage.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ModernizerUsage.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/ModernizerUsage.rst (original) +++ clang-tools-extra/trunk/docs/ModernizerUsage.rst (removed) @@ -1,313 +0,0 @@ -===================== -clang-modernize Usage -===================== - -``clang-modernize [options] [<sources>...] [-- [args]]`` - -``<source#>`` specifies the path to the source to migrate. This path may be -relative to the current directory. If no sources are provided, a compilation -database provided with `-p`_ can be used to provide sources together with the -`include/exclude options`_. - -By default all transformations are applied. There are two ways to enable a -subset of the transformations: - -1. Explicitly, by referring to the transform options directly, see - :ref:`transform-specific-command-line-options`. -2. Implicitly, based on the compilers to support, see - :ref:`-for-compilers=\<string\> <for-compilers-option>`. - -If both ways of specifying transforms are used only explicitly specified -transformations that are supported by the given compilers will be applied. - -General Command Line Options -============================ - -.. option:: -help - - Displays tool usage instructions and command line options. - -.. option:: -version - - Displays the version information of this tool. - -.. _-p: - -.. option:: -p=<build-path> - - ``<build-path>`` is the directory containing a *compilation databasefile*, a - file named ``compile_commands.json``, which provides compiler arguments for - building each source file. CMake can generate this file by specifying - ``-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`` when running CMake. Ninja_, since v1.2 - can also generate this file with ``ninja -t compdb``. If the compilation - database cannot be used for any reason, an error is reported. - - This option is ignored if ``--`` is present. - - Files in the compilation database will be transformed if no sources are - provided and paths to files are explicitly included using ``-include`` or - ``-include-from``. - In order to transform all files in a compilation database the following - command line can be used: - - ``clang-modernize -p=<build-path> -include=<project_root>`` - - Use ``-exclude`` or ``-exclude-from`` to limit the scope of ``-include``. - -.. _Ninja: http://martine.github.io/ninja/ - -.. option:: -- [args] - - Another way to provide compiler arguments is to specify all arguments on the - command line following ``--``. Arguments provided this way are used for - *every* source file. - - If neither ``--`` nor ``-p`` are specified a compilation database is - searched for starting with the path of the first-provided source file and - proceeding through parent directories. If no compilation database is found or - one is found and cannot be used for any reason then ``-std=c++11`` is used as - the only compiler argument. - -.. option:: -risk=<risk-level> - - Some transformations may cause a change in semantics. In such cases the - maximum acceptable risk level specified through the ``-risk`` command - line option decides whether or not a transformation is applied. - - Three different risk level options are available: - - ``-risk=safe`` - Perform only safe transformations. - ``-risk=reasonable`` (default) - Enable transformations that may change semantics. - ``-risk=risky`` - Enable transformations that are likely to change semantics. - - The meaning of risk is handled differently for each transform. See - :ref:`transform documentation <transforms>` for details. - -.. option:: -final-syntax-check - - After applying the final transform to a file, parse the file to ensure the - last transform did not introduce syntax errors. Syntax errors introduced by - earlier transforms are already caught when subsequent transforms parse the - file. - -.. option:: -summary - - Displays a summary of the number of changes each transform made or could have - made to each source file immediately after each transform is applied. - **Accepted** changes are those actually made. **Rejected** changes are those - that could have been made if the acceptable risk level were higher. - **Deferred** changes are those that might be possible but they might conflict - with other accepted changes. Re-applying the transform will resolve deferred - changes. - -.. _for-compilers-option: - -.. option:: -for-compilers=<string> - - Select transforms targeting the intersection of language features supported by - the given compilers. - - Four compilers are supported. The transforms are enabled according to this - table: - - =============== ===== === ==== ==== - Transforms clang gcc icc mscv - =============== ===== === ==== ==== - AddOverride (1) 3.0 4.7 14 8 - LoopConvert 3.0 4.6 13 11 - PassByValue 3.0 4.6 13 11 - ReplaceAutoPtr 3.0 4.6 13 11 - UseAuto 2.9 4.4 12 10 - UseNullptr 3.0 4.6 12.1 10 - =============== ===== === ==== ==== - - (1): if *-override-macros* is provided it's assumed that the macros are C++11 - aware and the transform is enabled without regard to the supported compilers. - - The structure of the argument to the `-for-compilers` option is - **<compiler>-<major ver>[.<minor ver>]** where **<compiler>** is one of the - compilers from the above table. - - Some examples: - - 1. To support `Clang >= 3.0`, `gcc >= 4.6` and `MSVC >= 11`: - - ``clang-modernize -for-compilers=clang-3.0,gcc-4.6,msvc-11 <args..>`` - - Enables LoopConvert, ReplaceAutoPtr, UseAuto, UseNullptr. - - 2. To support `icc >= 12` while using a C++11-aware macro for the `override` - virtual specifier: - - ``clang-modernize -for-compilers=icc-12 -override-macros <args..>`` - - Enables AddOverride and UseAuto. - - .. warning:: - - If your version of Clang depends on the GCC headers (e.g: when `libc++` is - not used), then you probably want to add the GCC version to the targeted - platforms as well. - -.. option:: -perf[=<directory>] - - Turns on performance measurement and output functionality. The time it takes to - apply each transform is recorded by the migrator and written in JSON format - to a uniquely named file in the given ``<directory>``. All sources processed - by a single Modernizer process are written to the same output file. If - ``<directory>`` is not provided the default is ``./migrate_perf/``. - - The time recorded for a transform includes parsing and creating source code - replacements. - -.. option:: -serialize-replacements - - Causes the modernizer to generate replacements and serialize them to disk but - not apply them. This can be useful for debugging or for manually running - ``clang-apply-replacements``. Replacements are serialized in YAML_ format. - By default serialzied replacements are written to a temporary directory whose - name is written to stderr when serialization is complete. - -.. _YAML: http://www.yaml.org/ - -.. option:: -serialize-dir=<string> - - Choose a directory to serialize replacements to. The directory must exist. - -.. _include/exclude options: - -Path Inclusion/Exclusion Options -================================ - -.. option:: -include=<path1>,<path2>,...,<pathN> - - Use this option to indicate which directories contain files that can be - changed by the modernizer. Inidividual files may be specified if desired. - Multiple paths can be specified as a comma-separated list. Sources mentioned - explicitly on the command line are always included so this option controls - which other files (e.g. headers) may be changed while transforming - translation units. - -.. option:: -exclude=<path1>,<path2>,...,<pathN> - - Used with ``-include`` to provide finer control over which files and - directories can be transformed. Individual files and files within directories - specified by this option **will not** be transformed. Multiple paths can be - specified as a comma-separated list. - -.. option:: -include-from=<filename> - - Like ``-include`` but read paths from the given file. Paths should be one per - line. - -.. option:: -exclude-from=<filename> - - Like ``-exclude`` but read paths from the given file. Paths are listed one - per line. - -Formatting Command Line Options -=============================== - -.. option:: -format - - Enable reformatting of code changed by transforms. Formatting is done after - every transform. - -.. option:: -style=<string> - - Specifies how formatting should be done. The behaviour of this option is - identical to the same option provided by clang-format_. Refer to - `clang-format's style options`_ for more details. - -.. option:: -style-config=<dir> - - When using ``-style=file``, the default behaviour is to look for - ``.clang-format`` starting in the current directory and then in ancestors. To - specify a directory to find the style configuration file, use this option. - -Example: - -.. code-block:: c++ - :emphasize-lines: 10-12,18 - - // file.cpp - for (std::vector<int>::const_iterator I = my_container.begin(), - E = my_container.end(); - I != E; ++I) { - std::cout << *I << std::endl; - } - - // No reformatting: - // clang-modernize -use-auto file.cpp - for (auto I = my_container.begin(), - E = my_container.end(); - I != E; ++I) { - std::cout << *I << std::endl; - } - - // With reformatting enabled: - // clang-modernize -format -use-auto file.cpp - for (auto I = my_container.begin(), E = my_container.end(); I != E; ++I) { - std::cout << *I << std::endl; - } - -.. _clang-format: http://clang.llvm.org/docs/ClangFormat.html -.. _clang-format's style options: http://clang.llvm.org/docs/ClangFormatStyleOptions.html - - -.. _transform-specific-command-line-options: - -Transform-Specific Command Line Options -======================================= - -.. option:: -loop-convert - - Makes use of C++11 range-based for loops where possible. See - :doc:`LoopConvertTransform`. - -.. option:: -use-nullptr - - Makes use of the new C++11 keyword ``nullptr`` where possible. - See :doc:`UseNullptrTransform`. - -.. option:: -user-null-macros=<string> - - ``<string>`` is a comma-separated list of user-defined macros that behave like - the ``NULL`` macro. The :option:`-use-nullptr` transform will replace these - macros along with ``NULL``. See :doc:`UseNullptrTransform`. - -.. option:: -use-auto - - Replace the type specifier of variable declarations with the ``auto`` type - specifier. See :doc:`UseAutoTransform`. - -.. option:: -add-override - - Adds the override specifier to member functions where it is appropriate. That - is, the override specifier is added to member functions that override a - virtual function in a base class and that don't already have the specifier. - See :doc:`AddOverrideTransform`. - -.. option:: -override-macros - - Tells the Add Override Transform to locate a macro that expands to - ``override`` and use that macro instead of the ``override`` keyword directly. - If no such macro is found, ``override`` is still used. This option enables - projects that use such macros to maintain build compatibility with non-C++11 - code. - -.. option:: -pass-by-value - - Replace const-reference parameters by values in situations where it can be - beneficial. - See :doc:`PassByValueTransform`. - -.. option:: -replace-auto_ptr - - Replace ``std::auto_ptr`` (deprecated in C++11) by ``std::unique_ptr`` and - wrap calls to the copy constructor and assignment operator with - ``std::move()``. - See :doc:`ReplaceAutoPtrTransform`. Removed: clang-tools-extra/trunk/docs/PassByValueTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/PassByValueTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/PassByValueTransform.rst (original) +++ clang-tools-extra/trunk/docs/PassByValueTransform.rst (removed) @@ -1,165 +0,0 @@ -.. index:: Pass-By-Value Transform - -======================= -Pass-By-Value Transform -======================= - -The Pass-By-Value Transform makes use of the pass-by-value idiom when possible. - -With move semantics added to the language and the standard library updated with -move constructors added for many types it is now interesting to take an argument -directly by value, instead of by const-reference, and then copy. This -transformation allows the compiler to take care of choosing the best way to -construct the copy. - -The transformation is usually beneficial when the calling code passes an -*rvalue* and assumes the move construction is a cheap operation. This short -example illustrates how the construction of the value happens: - - .. code-block:: c++ - - void foo(std::string s); - std::string get_str(); - - void f(const std::string &str) { - foo(str); // lvalue -> copy construction - foo(get_str()); // prvalue -> move construction - } - -.. note:: - - Currently only constructors are transformed to make use of pass-by-value. - Contributions that handle other situations are welcome! - - -Pass-by-value in constructors ------------------------------ - -Replaces the uses of const-references constructor parameters that are copied -into class fields. The parameter is then moved with `std::move()`. - -Since `std::move()` is a library function declared in `<utility>` it may be -necessary to add this include. The transform will add the include directive when -necessary. - -Example:: - - $ clang-modernize -pass-by-value ctor.cpp - -**ctor.cpp** - - .. code-block:: c++ - - #include <string> - - class Foo { - public: - - Foo(const std::string &Copied, const std::string &ReadOnly) - - : Copied(Copied), ReadOnly(ReadOnly) - + Foo(std::string Copied, const std::string &ReadOnly) - + : Copied(std::move(Copied)), ReadOnly(ReadOnly) - {} - - private: - std::string Copied; - const std::string &ReadOnly; - }; - - std::string get_cwd(); - - void f(const std::string &Path) { - // The parameter corresponding to 'get_cwd()' is move-constructed. By - // using pass-by-value in the Foo constructor we managed to avoid a - // copy-construction. - Foo foo(get_cwd(), Path); - } - - -If the parameter is used more than once no transformation is performed since -moved objects have an undefined state. It means the following code will be left -untouched: - -.. code-block:: c++ - - #include <string> - - void pass(const std::string &S); - - struct Foo { - Foo(const std::string &S) : Str(S) { - pass(S); - } - - std::string Str; - }; - - -Risk -^^^^ - -This modification is considered **reasonably safe** (see :option:`-risk` -option). - -A situation where the generated code can be wrong is when the object referenced -is modified before the assignment in the init-list through a "hidden" reference. - -Example: - -.. code-block:: c++ - - std::string s("foo"); - - struct Base { - Base() { - s = "bar"; - } - }; - - struct Derived : Base { - - Derived(const std::string &S) : Field(S) - + Derived(std::string S) : Field(std::move(S)) - { } - - std::string Field; - }; - - void f() { - - Derived d(s); // d.Field holds "bar" - + Derived d(s); // d.Field holds "foo" - } - - -Note about delayed template parsing -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When delayed template parsing is enabled, constructors part of templated -contexts; templated constructors, constructors in class templates, constructors -of inner classes of template classes, etc., are not transformed. Delayed -template parsing is enabled by default on Windows as a Microsoft extension: -`Clang Compiler Userâs Manual - Microsoft extensions`_. - -Delayed template parsing can be enabled using the `-fdelayed-template-parsing` -flag and disabled using `-fno-delayed-template-parsing`. - -Example: - -.. code-block:: c++ - - template <typename T> class C { - std::string S; - - public: - = // using -fdelayed-template-parsing (default on Windows) - = C(const std::string &S) : S(S) {} - - + // using -fno-delayed-template-parsing (default on non-Windows systems) - + C(std::string S) : S(std::move(S)) {} - }; - -.. _Clang Compiler Userâs Manual - Microsoft extensions: http://clang.llvm.org/docs/UsersManual.html#microsoft-extensions - -.. seealso:: - - For more information about the pass-by-value idiom, read: `Want Speed? Pass by Value`_. - - .. _Want Speed? Pass by Value: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ Removed: clang-tools-extra/trunk/docs/ReplaceAutoPtrTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReplaceAutoPtrTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/ReplaceAutoPtrTransform.rst (original) +++ clang-tools-extra/trunk/docs/ReplaceAutoPtrTransform.rst (removed) @@ -1,72 +0,0 @@ -.. index:: Replace-AutoPtr Transform - -========================= -Replace-AutoPtr Transform -========================= - -The Replace-AutoPtr Transform replaces the uses of the deprecated class -``std::auto_ptr`` by ``std::unique_ptr`` (introduced in C++11). The transfer of -ownership, done by the copy-constructor and the assignment operator, is changed -to match ``std::unique_ptr`` usage by using explicit calls to ``std::move()``. -The transform is enabled with the :option:`-replace-auto_ptr` option of -:program:`clang-modernize`. - -Migration example: - -.. code-block:: c++ - - -void take_ownership_fn(std::auto_ptr<int> int_ptr); - +void take_ownership_fn(std::unique_ptr<int> int_ptr); - - void f(int x) { - - std::auto_ptr<int> a(new int(x)); - - std::auto_ptr<int> b; - + std::unique_ptr<int> a(new int(x)); - + std::unique_ptr<int> b; - - - b = a; - - take_ownership_fn(b); - + b = std::move(a); - + take_ownership_fn(std::move(b)); - } - - -Known Limitations -================= -* If headers modification is not activated or if a header is not allowed to be - changed this transform will produce broken code (compilation error), where the - the headers' code will stay unchanged while the code using them will be - changed. - -* Client code that declares a reference to an ``std::auto_ptr`` coming from code - that can't be migrated (such as a header coming from a 3\ :sup:`rd` party - library) will produce a compilation error after migration. This is because the - type of the reference will be changed to ``std::unique_ptr`` but the type - returned by the library won't change, binding a reference to - ``std::unique_ptr`` from an ``std::auto_ptr``. This pattern doesn't make much - sense and usually ``std::auto_ptr`` are stored by value (otherwise what is the - point in using them instead of a reference or a pointer?). - - .. code-block:: c++ - - // <3rd-party header...> - std::auto_ptr<int> get_value(); - const std::auto_ptr<int> & get_ref(); - - // <calling code (with migration)...> - -std::auto_ptr<int> a(get_value()); - +std::unique_ptr<int> a(get_value()); // ok, unique_ptr constructed from auto_ptr - - -const std::auto_ptr<int> & p = get_ptr(); - +const std::unique_ptr<int> & p = get_ptr(); // won't compile - -* Non-instantiated templates aren't modified. - - .. code-block:: c++ - - template <typename X> - void f() { - std::auto_ptr<X> p; - } - - // only 'f<int>()' (or similar) will trigger the replacement Removed: clang-tools-extra/trunk/docs/UseAutoTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/UseAutoTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/UseAutoTransform.rst (original) +++ clang-tools-extra/trunk/docs/UseAutoTransform.rst (removed) @@ -1,137 +0,0 @@ -.. index:: Use-Auto Transform - -================== -Use-Auto Transform -================== - -The Use-Auto Transform is responsible for using the ``auto`` type specifier for -variable declarations to *improve code readability and maintainability*. The -transform is enabled with the :option:`-use-auto` option of -:program:`clang-modernize`. For example: - -.. code-block:: c++ - - std::vector<int>::iterator I = my_container.begin(); - - // transforms to: - - auto I = my_container.begin(); - -The ``auto`` type specifier will only be introduced in situations where the -variable type matches the type of the initializer expression. In other words -``auto`` should deduce the same type that was originally spelled in the source. -However, not every situation should be transformed: - -.. code-block:: c++ - - int val = 42; - InfoStruct &I = SomeObject.getInfo(); - - // Should not become: - - auto val = 42; - auto &I = SomeObject.getInfo(); - -In this example using ``auto`` for builtins doesn't improve readability. In -other situations it makes the code less self-documenting impairing readability -and maintainability. As a result, ``auto`` is used only introduced in specific -situations described below. - -Iterators -========= - -Iterator type specifiers tend to be long and used frequently, especially in -loop constructs. Since the functions generating iterators have a common format, -the type specifier can be replaced without obscuring the meaning of code while -improving readability and maintainability. - -.. code-block:: c++ - - for (std::vector<int>::iterator I = my_container.begin(), - E = my_container.end(); - I != E; ++I) { - } - - // becomes - - for (auto I = my_container.begin(), E = my_container.end(); I != E; ++I) { - } - -The transform will only replace iterator type-specifiers when all of the -following conditions are satisfied: -* The iterator is for one of the standard container in ``std`` namespace: - - * ``array`` - - * ``deque`` - - * ``forward_list`` - - * ``list`` - - * ``vector`` - - * ``map`` - - * ``multimap`` - - * ``set`` - - * ``multiset`` - - * ``unordered_map`` - - * ``unordered_multimap`` - - * ``unordered_set`` - - * ``unordered_multiset`` - - * ``queue`` - - * ``priority_queue`` - - * ``stack`` - -* The iterator is one of the possible iterator types for standard containers: - - * ``iterator`` - - * ``reverse_iterator`` - - * ``const_iterator`` - - * ``const_reverse_iterator`` - -* In addition to using iterator types directly, typedefs or other ways of - referring to those types are also allowed. However, implementation-specific - types for which a type like ``std::vector<int>::iterator`` is itself a - typedef will not be transformed. Consider the following examples: - -.. code-block:: c++ - - // The following direct uses of iterator types will be transformed. - std::vector<int>::iterator I = MyVec.begin(); - { - using namespace std; - list<int>::iterator I = MyList.begin(); - } - - // The type specifier for J would transform to auto since it's a typedef - // to a standard iterator type. - typedef std::map<int, std::string>::const_iterator map_iterator; - map_iterator J = MyMap.begin(); - - // The following implementation-specific iterator type for which - // std::vector<int>::iterator could be a typedef would not be transformed. - __gnu_cxx::__normal_iterator<int*, std::vector> K = MyVec.begin(); - -* The initializer for the variable being declared is not a braced initializer - list. Otherwise, use of ``auto`` would cause the type of the variable to be - deduced as``std::initializer_list``. - -Known Limitations -================= -* If the initializer is an explicit conversion constructor, the transform will - not replace the type specifier even though it would be safe to do so. -* User-defined iterators are not handled at this time. Removed: clang-tools-extra/trunk/docs/UseNullptrTransform.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/UseNullptrTransform.rst?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/UseNullptrTransform.rst (original) +++ clang-tools-extra/trunk/docs/UseNullptrTransform.rst (removed) @@ -1,82 +0,0 @@ -.. index:: Use-Nullptr Transform - -===================== -Use-Nullptr Transform -===================== - -The Use-Nullptr Transform is a transformation to convert the usage of null -pointer constants (eg. ``NULL``, ``0``) to use the new C++11 ``nullptr`` -keyword. The transform is enabled with the :option:`-use-nullptr` option of -:program:`clang-modernize`. - -Example -======= - -.. code-block:: c++ - - void assignment() { - char *a = NULL; - char *b = 0; - char c = 0; - } - - int *ret_ptr() { - return 0; - } - - -transforms to: - -.. code-block:: c++ - - void assignment() { - char *a = nullptr; - char *b = nullptr; - char c = 0; - } - - int *ret_ptr() { - return nullptr; - } - - -User defined macros -=================== - -By default this transform will only replace the ``NULL`` macro and will skip any -user-defined macros that behaves like ``NULL``. The user can use the -:option:`-user-null-macros` option to specify a comma-separated list of macro -names that will be transformed along with ``NULL``. - -Example -------- - -.. code-block:: c++ - - #define MY_NULL (void*)0 - void assignment() { - void *p = MY_NULL; - } - - -using the command-line - -.. code-block:: bash - - clang-modernize -use-nullptr -user-null-macros=MY_NULL foo.cpp - - -transforms to: - -.. code-block:: c++ - - #define MY_NULL NULL - void assignment() { - int *p = nullptr; - } - - -Risk -==== - -:option:`-risk` has no effect in this transform. Modified: clang-tools-extra/trunk/docs/clang-modernize.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-modernize.rst?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-modernize.rst (original) +++ clang-tools-extra/trunk/docs/clang-modernize.rst Thu Dec 17 05:49:19 2015 @@ -1,112 +1,2 @@ -.. index:: clang-modernize - -.. note:: - - **Deprecation** - - As of September 2015 all :program:`clang-modernize` transforms have been - ported to :doc:`clang-tidy/index`. :program:`clang-modernize` is deprecated - and is going to be removed soon. - - -================================== -Clang C++ Modernizer User's Manual -================================== - -.. toctree:: - :hidden: - - UseAutoTransform - UseNullptrTransform - LoopConvertTransform - AddOverrideTransform - PassByValueTransform - ReplaceAutoPtrTransform - ModernizerUsage - cpp11-migrate - MigratorUsage - -:program:`clang-modernize` is a standalone tool used to automatically convert -C++ code written against old standards to use features of the newest C++ -standard where appropriate. - -Getting Started -=============== - -To build from source: - -1. Read `Getting Started with the LLVM System`_ and `Clang Tools - Documentation`_ for information on getting sources for LLVM, Clang, and - Clang Extra Tools. - -2. `Getting Started with the LLVM System`_ and `Building LLVM with CMake`_ give - directions for how to build. With sources all checked out into the - right place the LLVM build will build Clang Extra Tools and their - dependencies automatically. - - * If using CMake, you can also use the ``clang-modernize`` target to build - just the Modernizer and its dependencies. - -Before continuing, take a look at :doc:`ModernizerUsage` to see how to invoke -the Modernizer. - -Before running the Modernizer on code you'll need the arguments you'd normally -pass to the compiler. If you're migrating a single file with few compiler -arguments, it might be easier to pass the compiler args on the command line -after ``--``. If you don't have any compiler arguments then ``--`` is not needed. -If you're working with multiple files or even a single file with many compiler -args, it's probably best to use a *compilation database*. - -A `compilation database`_ contains the command-line arguments for multiple -files. If the code you want to transform can be built with CMake, you can -generate this database easily by running CMake with the -``-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`` option. The Ninja_ build system, since -v1.2, can create this file too using the *compdb* tool: ``ninja -t compdb``. If -you're not already using either of these tools or cannot easily make use of -them you might consider looking into Bear_. - -In addition to the compiler arguments you usually build your code with, you must -provide the option for enabling C++11 features. For clang and versions of gcc -⥠v4.8 this is ``-std=c++11``. - -With compiler arguments in hand, the modernizer can be applied to sources. Each -transform is applied to all sources before the next transform. All the changes -generated by each transform pass are serialized to disk and applied using -``clang-apply-replacements``. This executable must be located on the ``PATH`` -or be present in the same directory as the ``clang-modernizer`` executable. If -any changes fail to apply, the modernizer will **not** proceed to the next -transform and will halt. - -There's a small chance that changes made by a transform will produce code that -doesn't compile, also causing the modernizer to halt. This can happen with -bugs in the transforms or use of the pre-processor to make the same code behave -differently between translation units. Before logging a bug, be sure which -situation you are dealing with. - -.. _Ninja: http://martine.github.io/ninja/ -.. _Bear: https://github.com/rizsotto/Bear -.. _compilation database: http://clang.llvm.org/docs/JSONCompilationDatabase.html -.. _Getting Started with the LLVM System: http://llvm.org/docs/GettingStarted.html -.. _Building LLVM with CMake: http://llvm.org/docs/CMake.html -.. _Clang Tools Documentation: http://clang.llvm.org/docs/ClangTools.html - - -.. _transforms: - -Transformations -=============== - -The Modernizer is a collection of independent transforms which can be -independently enabled. The transforms currently implemented are: - -* :doc:`LoopConvertTransform` - -* :doc:`UseNullptrTransform` - -* :doc:`UseAutoTransform` - -* :doc:`AddOverrideTransform` - -* :doc:`PassByValueTransform` - -* :doc:`ReplaceAutoPtrTransform` +All :program:`clang-modernize` transforms have moved to :doc:`clang-tidy/index` +(see the ``modernize`` module). Modified: clang-tools-extra/trunk/docs/cpp11-migrate.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/cpp11-migrate.rst?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/cpp11-migrate.rst (original) +++ clang-tools-extra/trunk/docs/cpp11-migrate.rst Thu Dec 17 05:49:19 2015 @@ -1,5 +1,2 @@ -============================ -C++11 Migrator User's Manual -============================ - -This tool has been renamed :doc:`clang-modernize <clang-modernize>`. +All :program:`clang-modernize` transforms have moved to :doc:`clang-tidy/index` +(see the ``modernize`` module). Modified: clang-tools-extra/trunk/docs/index.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/index.rst?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/index.rst (original) +++ clang-tools-extra/trunk/docs/index.rst Thu Dec 17 05:49:19 2015 @@ -15,7 +15,6 @@ Contents .. toctree:: :maxdepth: 1 - clang-modernize clang-tidy/index modularize pp-trace Modified: clang-tools-extra/trunk/test/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/test/CMakeLists.txt (original) +++ clang-tools-extra/trunk/test/CMakeLists.txt Thu Dec 17 05:49:19 2015 @@ -36,7 +36,6 @@ set(CLANG_TOOLS_TEST_DEPS # Individual tools we test. clang-apply-replacements - clang-modernize clang-rename clang-query clang-tidy Modified: clang-tools-extra/trunk/unittests/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/CMakeLists.txt?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/CMakeLists.txt (original) +++ clang-tools-extra/trunk/unittests/CMakeLists.txt Thu Dec 17 05:49:19 2015 @@ -6,7 +6,6 @@ function(add_extra_unittest test_dirname endfunction() add_subdirectory(clang-apply-replacements) -add_subdirectory(clang-modernize) add_subdirectory(clang-rename) add_subdirectory(clang-query) add_subdirectory(clang-tidy) Modified: clang-tools-extra/trunk/unittests/Makefile URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/Makefile?rev=255886&r1=255885&r2=255886&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/Makefile (original) +++ clang-tools-extra/trunk/unittests/Makefile Thu Dec 17 05:49:19 2015 @@ -10,6 +10,6 @@ CLANG_LEVEL := ../../.. include $(CLANG_LEVEL)/../../Makefile.config -PARALLEL_DIRS := clang-apply-replacements clang-modernize clang-query clang-tidy clang-rename +PARALLEL_DIRS := clang-apply-replacements clang-query clang-tidy clang-rename include $(CLANG_LEVEL)/Makefile Removed: clang-tools-extra/trunk/unittests/include/common/Utility.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/include/common/Utility.h?rev=255885&view=auto ============================================================================== --- clang-tools-extra/trunk/unittests/include/common/Utility.h (original) +++ clang-tools-extra/trunk/unittests/include/common/Utility.h (removed) @@ -1,25 +0,0 @@ -//=-- clang-modernize/Utility.h - Utility functions and macros---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef CLANG_MODERNIZE_UNITTESTS_UTILITY_H -#define CLANG_MODERNIZE_UNITTESTS_UTILITY_H - -// FIXME: copied from unittests/Support/Path.cpp -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - llvm::SmallString<128> MessageStorage; \ - llvm::raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - -#endif // CLANG_MODERNIZE_UNITTESTS_UTILITY_H _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits