Sinitax updated this revision to Diff 528256.
Sinitax added a comment.

Add new warning to its own group.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152083/new/

https://reviews.llvm.org/D152083

Files:
  clang/include/clang/Basic/DiagnosticGroups.td
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/lib/Sema/SemaInit.cpp


Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -980,6 +980,22 @@
     if (RequiresSecondPass && !hadError)
       FillInEmptyInitializations(Entity, FullyStructuredList,
                                  RequiresSecondPass, nullptr, 0);
+
+    if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(T)) {
+      if (FullyStructuredList->getNumInits() < 
CAType->getSize().getZExtValue()) {
+        S.Diag(IL->getBeginLoc(), diag::warn_uninit_fixed_size_array)
+          << IL->getSourceRange();
+      } else {
+        Expr **inits = FullyStructuredList->getInits();
+        for (unsigned i = 0, e = FullyStructuredList->getNumInits(); i != e; 
++i) {
+          if (inits[i] == nullptr) {
+            S.Diag(IL->getBeginLoc(), diag::warn_uninit_fixed_size_array)
+              << IL->getSourceRange();
+            break;
+          }
+        }
+      }
+    }
   }
   if (hadError && FullyStructuredList)
     FullyStructuredList->markError();
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2214,6 +2214,9 @@
   "reference %0 is not yet bound to a value when used within its own"
   " initialization">,
   InGroup<Uninitialized>;
+def warn_uninit_fixed_size_array : Warning<
+  "fixed-size array contains uninitialized elements">,
+  InGroup<UninitializedArrayElements>, DefaultIgnore;
 def warn_uninit_var : Warning<
   "variable %0 is uninitialized when %select{used here|captured by block}1">,
   InGroup<Uninitialized>, DefaultIgnore;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -729,6 +729,7 @@
 def UninitializedSometimes : DiagGroup<"sometimes-uninitialized">;
 def UninitializedStaticSelfInit : DiagGroup<"static-self-init">;
 def UninitializedConstReference : DiagGroup<"uninitialized-const-reference">;
+def UninitializedArrayElements : DiagGroup<"uninitialized-array-elements">;
 def Uninitialized  : DiagGroup<"uninitialized", [UninitializedSometimes,
                                                  UninitializedStaticSelfInit,
                                                  UninitializedConstReference]>;


Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -980,6 +980,22 @@
     if (RequiresSecondPass && !hadError)
       FillInEmptyInitializations(Entity, FullyStructuredList,
                                  RequiresSecondPass, nullptr, 0);
+
+    if (const ConstantArrayType *CAType = dyn_cast<ConstantArrayType>(T)) {
+      if (FullyStructuredList->getNumInits() < CAType->getSize().getZExtValue()) {
+        S.Diag(IL->getBeginLoc(), diag::warn_uninit_fixed_size_array)
+          << IL->getSourceRange();
+      } else {
+        Expr **inits = FullyStructuredList->getInits();
+        for (unsigned i = 0, e = FullyStructuredList->getNumInits(); i != e; ++i) {
+          if (inits[i] == nullptr) {
+            S.Diag(IL->getBeginLoc(), diag::warn_uninit_fixed_size_array)
+              << IL->getSourceRange();
+            break;
+          }
+        }
+      }
+    }
   }
   if (hadError && FullyStructuredList)
     FullyStructuredList->markError();
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2214,6 +2214,9 @@
   "reference %0 is not yet bound to a value when used within its own"
   " initialization">,
   InGroup<Uninitialized>;
+def warn_uninit_fixed_size_array : Warning<
+  "fixed-size array contains uninitialized elements">,
+  InGroup<UninitializedArrayElements>, DefaultIgnore;
 def warn_uninit_var : Warning<
   "variable %0 is uninitialized when %select{used here|captured by block}1">,
   InGroup<Uninitialized>, DefaultIgnore;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -729,6 +729,7 @@
 def UninitializedSometimes : DiagGroup<"sometimes-uninitialized">;
 def UninitializedStaticSelfInit : DiagGroup<"static-self-init">;
 def UninitializedConstReference : DiagGroup<"uninitialized-const-reference">;
+def UninitializedArrayElements : DiagGroup<"uninitialized-array-elements">;
 def Uninitialized  : DiagGroup<"uninitialized", [UninitializedSometimes,
                                                  UninitializedStaticSelfInit,
                                                  UninitializedConstReference]>;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to