https://github.com/Fznamznon created https://github.com/llvm/llvm-project/pull/75591
a01307a broke silencing of -Wmissing-field-initializers warnings in C for nested designators. This fixes the issue. >From 7d93f51878c495e245ce21d4be97c4ca7cddd404 Mon Sep 17 00:00:00 2001 From: "Podchishchaeva, Mariya" <mariya.podchishcha...@intel.com> Date: Fri, 15 Dec 2023 04:05:41 -0800 Subject: [PATCH] [clang] Fix unexpected warnings after a01307a a01307a broke silencing of -Wmissing-field-initializers warnings in C for nested designators. This fixes the issue. --- clang/lib/Sema/SemaInit.cpp | 8 +++++++ clang/test/Sema/missing-field-initializers.c | 23 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index de0d92edb550dd..1cd2198503abaf 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -864,6 +864,14 @@ InitListChecker::FillInEmptyInitializations(const InitializedEntity &Entity, WarnIfMissingField &= SemaRef.getLangOpts().CPlusPlus || !hasAnyDesignatedInits(SForm); + if (OuterILE) { + InitListExpr *OuterSForm = OuterILE->isSyntacticForm() + ? OuterILE + : OuterILE->getSyntacticForm(); + WarnIfMissingField &= SemaRef.getLangOpts().CPlusPlus || + !hasAnyDesignatedInits(OuterSForm); + } + unsigned NumElems = numStructUnionElements(ILE->getType()); if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember()) ++NumElems; diff --git a/clang/test/Sema/missing-field-initializers.c b/clang/test/Sema/missing-field-initializers.c index 8653591ff1187a..8dc8288ad92e6c 100644 --- a/clang/test/Sema/missing-field-initializers.c +++ b/clang/test/Sema/missing-field-initializers.c @@ -61,3 +61,26 @@ struct S { // f1, now we no longer issue that warning (note, this code is still unsafe // because of the buffer overrun). struct S s = {1, {1, 2}}; + +struct S1 { + long int l; + struct { int a, b; } d1; +}; + +struct S1 s01 = { 1, {1} }; // expected-warning {{missing field 'b' initializer}} +struct S1 s02 = { .d1.a = 1 }; // designator avoids MFI warning + +union U1 { + long int l; + struct { int a, b; } d1; +}; + +union U1 u01 = { 1 }; +union U1 u02 = { .d1.a = 1 }; // designator avoids MFI warning + +struct S2 { + long int l; + struct { int a, b; struct {int c; } d2; } d1; +}; + +struct S2 s22 = { .d1.d2.c = 1 }; // designator avoids MFI warning _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits