diff options
| author | John McCall <rjmccall@apple.com> | 2010-03-11 19:32:38 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-03-11 19:32:38 +0000 |
| commit | e40b58ec2f66479ea1738d38540c25f8c1b2b5d8 (patch) | |
| tree | f6c4da7f2ef51a293ca095bea2ebe7ad23c10219 /clang/lib/Sema | |
| parent | 607de1de53d429f56a4482db257d6195cf984a7a (diff) | |
| download | bcm5719-llvm-e40b58ec2f66479ea1738d38540c25f8c1b2b5d8.tar.gz bcm5719-llvm-e40b58ec2f66479ea1738d38540c25f8c1b2b5d8.zip | |
Implement -Wmissing-field-initializers. Patch by mikem!
llvm-svn: 98275
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 3540cd02e6d..51d2f153769 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1051,6 +1051,7 @@ void InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl(); RecordDecl::field_iterator FieldEnd = RD->field_end(); bool InitializedSomething = false; + bool CheckForMissingFields = true; while (Index < IList->getNumInits()) { Expr *Init = IList->getInit(Index); @@ -1070,6 +1071,10 @@ void InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, hadError = true; InitializedSomething = true; + + // Disable check for missing fields when designators are used. + // This matches gcc behaviour. + CheckForMissingFields = false; continue; } @@ -1106,6 +1111,21 @@ void InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity, ++Field; } + // Emit warnings for missing struct field initializers. + if (CheckForMissingFields && Field != FieldEnd && + !Field->getType()->isIncompleteArrayType() && !DeclType->isUnionType()) { + // It is possible we have one or more unnamed bitfields remaining. + // Find first (if any) named field and emit warning. + for (RecordDecl::field_iterator it = Field, end = RD->field_end(); + it != end; ++it) { + if (!it->isUnnamedBitfield()) { + SemaRef.Diag(IList->getSourceRange().getEnd(), + diag::warn_missing_field_initializers) << it->getName(); + break; + } + } + } + if (Field == FieldEnd || !Field->getType()->isIncompleteArrayType() || Index >= IList->getNumInits()) return; |

