rsmith added inline comments.
================ Comment at: lib/Sema/SemaInit.cpp:884 + bool MissingBracesOkay = false; + + if (!SemaRef.getLangOpts().CPlusPlus && ---------------- Remove empty line. ================ Comment at: lib/Sema/SemaInit.cpp:885-892 + if (!SemaRef.getLangOpts().CPlusPlus && + StructuredSubobjectInitList->getNumInits() == 1) { + if (const IntegerLiteral *lit = dyn_cast<IntegerLiteral>(StructuredSubobjectInitList->getInit(0))) { + if (lit->getValue() == 0) { + MissingBracesOkay = true; + } + } ---------------- I think it would make more sense to check `ParentIList` here instead of `StructuredSubobjectInitList` -- we want to check whether the list the user wrote in the source code was `{0}`, not the list after semantic checking. This would matter for a case like: ``` struct A { int n; }; struct B { struct A a; }; struct C { struct B b; }; C c = {0}; ``` `ParentIList` will be `{0}` at every level here, but it looks like `StructuredSubobjectInitList` will be `{{0}}` when checking the initialization of `c.b`, so you won't suppress the warning. It would also matter for a case like ``` struct A { short p; }; struct B { A a; }; B b = {0}; ``` where the list after semantic checking will have an implicit conversion wrapped around the initializer. ================ Comment at: lib/Sema/SemaInit.cpp:1843-1851 + // Check if this is C's zero initializer { 0 } + if (!SemaRef.getLangOpts().CPlusPlus && + IList->getNumInits() == 1) { + if (const IntegerLiteral *lit = dyn_cast<IntegerLiteral>(IList->getInit(0))) { + if (lit->getValue() == 0) { + CheckForMissingFields = false; + } ---------------- Please factor this check out into something like `InitListExpr::isIdiomaticZeroInitializer()`. It would make sense for that function to also assert `isSyntactic()`. https://reviews.llvm.org/D28148 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits