Index: lib/Sema/SemaInit.cpp =================================================================== --- lib/Sema/SemaInit.cpp +++ lib/Sema/SemaInit.cpp @@ -885,17 +885,22 @@ 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()) { - SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), - diag::warn_missing_braces) - << StructuredSubobjectInitList->getSourceRange() - << FixItHint::CreateInsertion( - StructuredSubobjectInitList->getLocStart(), "{") - << FixItHint::CreateInsertion( - SemaRef.getLocForEndOfToken( - StructuredSubobjectInitList->getLocEnd()), - "}"); + SourceLocation SpellingLoc = StructuredSubobjectInitList->getLocStart(); + SpellingLoc = SemaRef.getSourceManager().getSpellingLoc(SpellingLoc); + if (SpellingLoc.isInvalid() || + !(SemaRef.getSourceManager().isInSystemHeader(SpellingLoc))) { + SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), + diag::warn_missing_braces) + << StructuredSubobjectInitList->getSourceRange() + << FixItHint::CreateInsertion( + StructuredSubobjectInitList->getLocStart(), "{") + << FixItHint::CreateInsertion( + SemaRef.getLocForEndOfToken( + StructuredSubobjectInitList->getLocEnd()), + "}"); + } } } } 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