Index: lib/Sema/SemaInit.cpp =================================================================== --- lib/Sema/SemaInit.cpp +++ lib/Sema/SemaInit.cpp @@ -885,8 +885,13 @@ StructuredSubobjectInitList->setRBraceLoc(EndLoc); } - // Complain about missing braces. + // Complain about missing braces when rhs is not a macro from system header. if (T->isArrayType() || T->isRecordType()) { + SourceLocation SpellingLoc = StructuredSubobjectInitList->getLocStart(); + SpellingLoc = SemaRef.getSourceManager().getSpellingLoc(SpellingLoc); + if (SpellingLoc.isValid() && + SemaRef.getSourceManager().isInSystemHeader(SpellingLoc)) + return; SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), diag::warn_missing_braces) << StructuredSubobjectInitList->getSourceRange() Index: test/Sema/warn-missing-braces.c =================================================================== --- test/Sema/warn-missing-braces.c +++ test/Sema/warn-missing-braces.c @@ -1,3 +1,21 @@ // RUN: %clang_cc1 -fsyntax-only -Wmissing-braces -verify %s +#ifdef BE_THE_HEADER +#pragma clang system_header + +typedef struct _foo { + unsigned char Data[2]; +} foo; + +#define BAR { 0 } + +#else + +#define BE_THE_HEADER +#include __FILE__ + int a[2][2] = { 0, 1, 2, 3 }; // expected-warning{{suggest braces}} expected-warning{{suggest braces}} + +foo g = BAR; // should not show warnings + +#endif