Sinitax updated this revision to Diff 530726.
Sinitax added a comment.
Fix test.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152083/new/
https://reviews.llvm.org/D152083
Files:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaInit.cpp
clang/test/Sema/warn-incomplete-array-initializer-list.c
Index: clang/test/Sema/warn-incomplete-array-initializer-list.c
===================================================================
--- /dev/null
+++ clang/test/Sema/warn-incomplete-array-initializer-list.c
@@ -0,0 +1,51 @@
+// RUN: %clang_cc1 -fsyntax-only -Wincomplete-array-initializer-list -verify -std=c99 %s
+
+// missing array initializer in between
+enum {
+ FOO1_A,
+ FOO1_MISSING,
+ FOO1_B,
+ FOO1_COUNT
+};
+const char *foo1[] = { // expected-warning{{incomplete array initializer list}}
+ [FOO1_A] = "a",
+ [FOO1_B] = "b",
+};
+
+// missing array initializer at end
+enum {
+ FOO2_A,
+ FOO2_B,
+ FOO2_MISSING,
+ FOO2_COUNT
+};
+const char *foo2[FOO2_COUNT] = { //expected-warning{{incomplete array initializer list}}
+ [FOO2_A] = "a",
+ [FOO2_B] = "b",
+};
+
+// complete array initializer
+int foo3[4] = { 1, 1, 1, 1 };
+
+// missing struct initializer in between
+struct {
+ int a, b, c, d;
+} bar1 = {
+ .a = 1,
+ .b = 1,
+ .d = 1
+};
+
+// missing struct initializer at end
+struct {
+ int a, b, c, d;
+} bar2 = {
+ .a = 1,
+ .b = 1,
+ .c = 1
+};
+
+// complete struct initializer
+struct {
+ int a, b, c, d;
+} bar3 = { 1, 1, 1, 1 };
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -986,6 +986,21 @@
if (RequiresSecondPass && !hadError)
FillInEmptyInitializations(Entity, FullyStructuredList,
RequiresSecondPass, nullptr, 0);
+
+ if (T->isArrayType() && VerifyOnly) {
+ const auto *CAType = dyn_cast<ConstantArrayType>(T);
+ if (CAType && FullyStructuredList->getNumInits() <
+ CAType->getSize().getZExtValue()) {
+ S.Diag(IL->getBeginLoc(), diag::warn_incomplete_array_initializer_list)
+ << IL->getSourceRange();
+ } else {
+ auto inits = FullyStructuredList->inits();
+ if (llvm::find(inits, nullptr) != inits.end())
+ S.Diag(IL->getBeginLoc(),
+ diag::warn_incomplete_array_initializer_list)
+ << IL->getSourceRange();
+ }
+ }
}
if (hadError && FullyStructuredList)
FullyStructuredList->markError();
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2223,6 +2223,9 @@
"reference %0 is not yet bound to a value when used within its own"
" initialization">,
InGroup<Uninitialized>;
+def warn_incomplete_array_initializer_list : Warning<
+ "incomplete array initializer list">,
+ InGroup<IncompleteArrayInitializerList>, 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
@@ -734,6 +734,7 @@
def Uninitialized : DiagGroup<"uninitialized", [UninitializedSometimes,
UninitializedStaticSelfInit,
UninitializedConstReference]>;
+def IncompleteArrayInitializerList : DiagGroup<"incomplete-array-initializer-list">;
def IgnoredPragmaIntrinsic : DiagGroup<"ignored-pragma-intrinsic">;
// #pragma optimize is often used to avoid to work around MSVC codegen bugs or
// to disable inlining. It's not completely clear what alternative to suggest
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -199,7 +199,6 @@
bool b = nullptr; // Was incorrectly rejected by Clang, is now accepted.
-
Non-comprehensive list of changes in this release
-------------------------------------------------
- Clang now saves the address of ABI-indirect function parameters on the stack,
@@ -339,6 +338,8 @@
can be controlled using ``-fcaret-diagnostics-max-lines=``.
- Clang no longer emits ``-Wunused-variable`` warnings for variables declared
with ``__attribute__((cleanup(...)))`` to match GCC's behavior.
+- Add ``-Wincomplete-array-initializer-list`` warning to detect missing
+ elements in initializer lists assigned to array types.
Bug Fixes in This Version
-------------------------
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits