diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp @@ -78,10 +78,12 @@ return; QualType TypePtr = MatchedDecl->getType(); - const char *InitializationString = nullptr; + llvm::Optional 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"; @@ -96,11 +98,12 @@ 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); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -78,6 +78,12 @@ Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:`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 ^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-init-variables.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-init-variables.rst --- a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-init-variables.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-init-variables.rst @@ -37,6 +37,21 @@ // 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 ------- diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-init-variables.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-init-variables.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-init-variables.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-init-variables.cpp @@ -92,3 +92,35 @@ } 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] +}