Sinitax updated this revision to Diff 529658.
Sinitax added a comment.
Rename warning to -Wincomplete-array-initializer-list for clarity, and add test
case.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152083/new/
https://reviews.llvm.org/D152083
Files:
include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaInit.cpp
test/Sema/warn-incomplete-array-initializer-list.c
Index: test/Sema/warn-incomplete-array-initializer-list.c
===================================================================
--- /dev/null
+++ 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: lib/Sema/SemaInit.cpp
===================================================================
--- lib/Sema/SemaInit.cpp
+++ lib/Sema/SemaInit.cpp
@@ -980,6 +980,20 @@
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: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ 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_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: include/clang/Basic/DiagnosticGroups.td
===================================================================
--- include/clang/Basic/DiagnosticGroups.td
+++ include/clang/Basic/DiagnosticGroups.td
@@ -732,6 +732,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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits