yamaguchi updated this revision to Diff 97182. yamaguchi added a comment. Update testcase. Made it minimal.
https://reviews.llvm.org/D32646 Files: lib/Sema/SemaInit.cpp test/Sema/warn-missing-braces.c 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 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.isValid() && + 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 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.isValid() && + SemaRef.getSourceManager().isInSystemHeader(SpellingLoc))) { + SemaRef.Diag(StructuredSubobjectInitList->getLocStart(), + diag::warn_missing_braces) + << StructuredSubobjectInitList->getSourceRange() + << FixItHint::CreateInsertion( + StructuredSubobjectInitList->getLocStart(), "{") + << FixItHint::CreateInsertion( + SemaRef.getLocForEndOfToken( + StructuredSubobjectInitList->getLocEnd()), + "}"); + } } } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits