Skip to content

Commit

Permalink
[clang-tidy] Fix cppcoreguidelines-init-variables by removing the enum
Browse files Browse the repository at this point in the history
FixIt, and add support for initialization check of scoped enum

In C++, the enumeration is never Integer, and the enumeration condition judgment is added to avoid compiling errors when it is initialized to an integer.
Add support for initialization check of scope enum.

As the following case show, clang-tidy will give a wrong automatic fix:

    enum Color {Red, Green, Blue};
    enum class Gender {Male, Female};
    void func() {
      Color color; // Color color = 0; <--- fix bug
      Gender gender; // <--- no warning
    }

Reviewd By: aaron.ballman, whisperity

Differential Revision: http://reviews.llvm.org/D106431
  • Loading branch information
Sockke authored and whisperity committed Jul 30, 2021
1 parent 65436e6 commit 4a097ef
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,12 @@ void InitVariablesCheck::check(const MatchFinder::MatchResult &Result) {
return;

QualType TypePtr = MatchedDecl->getType();
const char *InitializationString = nullptr;
llvm::Optional<const char *> InitializationString = llvm::None;
bool AddMathInclude = false;

if (TypePtr->isIntegerType())
if (TypePtr->isEnumeralType())
InitializationString = nullptr;
else if (TypePtr->isIntegerType())
InitializationString = " = 0";
else if (TypePtr->isFloatingType()) {
InitializationString = " = NAN";
Expand All @@ -96,11 +98,12 @@ void InitVariablesCheck::check(const MatchFinder::MatchResult &Result) {
if (InitializationString) {
auto Diagnostic =
diag(MatchedDecl->getLocation(), "variable %0 is not initialized")
<< MatchedDecl
<< FixItHint::CreateInsertion(
MatchedDecl->getLocation().getLocWithOffset(
MatchedDecl->getName().size()),
InitializationString);
<< MatchedDecl;
if (*InitializationString != nullptr)
Diagnostic << FixItHint::CreateInsertion(
MatchedDecl->getLocation().getLocWithOffset(
MatchedDecl->getName().size()),
*InitializationString);
if (AddMathInclude) {
Diagnostic << IncludeInserter.createIncludeInsertion(
Source.getFileID(MatchedDecl->getBeginLoc()), MathHeader);
Expand Down
6 changes: 6 additions & 0 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ New check aliases
Changes in existing checks
^^^^^^^^^^^^^^^^^^^^^^^^^^

- Improved :doc:`cppcoreguidelines-init-variables<clang-tidy/checks/cppcoreguidelines-init-variables>` check.

Removed generating fixes for enums because the code generated was broken, trying to initialize the enum from an integer.

The check now also warns for uninitialized scoped enums.

Removed checks
^^^^^^^^^^^^^^

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,21 @@ Would be rewritten to look like this:
// Rest of the function.
}

It warns for the uninitialized enum case, but without a FixIt:

.. code-block:: c++

enum A {A1, A2, A3};
enum A_c : char { A_c1, A_c2, A_c3 };
enum class B { B1, B2, B3 };
enum class B_i : int { B_i1, B_i2, B_i3 };
void function() {
A a; // Warning: variable 'a' is not initialized
A_c a_c; // Warning: variable 'a_c' is not initialized
B b; // Warning: variable 'b' is not initialized
B_i b_i; // Warning: variable 'b_i' is not initialized
}

Options
-------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,35 @@ void catch_variable_decl() {
} catch (int X) {
}
}

enum Color { Red,
Green,
Blue };

enum Car { Benz,
BMW = 20,
Audi = BMW + 2 };

enum Gender : char { Male,
Female };

enum class Direction { Up,
Down,
Left,
Right };

enum class Fruit : int { Apple,
Orange };

void uninitialized_enum() {
Color color;
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: variable 'color' is not initialized [cppcoreguidelines-init-variables]
Car car;
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'car' is not initialized [cppcoreguidelines-init-variables]
Gender gender;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: variable 'gender' is not initialized [cppcoreguidelines-init-variables]
Direction direction;
// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'direction' is not initialized [cppcoreguidelines-init-variables]
Fruit fruit;
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: variable 'fruit' is not initialized [cppcoreguidelines-init-variables]
}

0 comments on commit 4a097ef

Please sign in to comment.