diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-01-23 16:54:12 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-01-23 16:54:12 +0000 |
commit | 033d1257ca0f6ca3d5095c139d4d34ad34f4cf91 (patch) | |
tree | 699eda31b933537b8f52d2d11d23f7d805f58278 /clang/lib/Sema/SemaInit.cpp | |
parent | 9aa8904a467c709c5b002dc41b7a3bf55e38b18f (diff) | |
download | bcm5719-llvm-033d1257ca0f6ca3d5095c139d4d34ad34f4cf91.tar.gz bcm5719-llvm-033d1257ca0f6ca3d5095c139d4d34ad34f4cf91.zip |
Properly manage the bit-widths of APInts/APSInts in array initialization.
Fixes PR clang/3377
llvm-svn: 62851
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index e855840ea5d..ba8312b7b52 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -142,8 +142,9 @@ void InitListChecker::CheckListElementTypes(InitListExpr *IList, CheckStructUnionTypes(IList, DeclType, RD->field_begin(), SubobjectIsDesignatorContext, Index); } else if (DeclType->isArrayType()) { - // FIXME: Is 32 always large enough for array indices? - llvm::APSInt Zero(32, false); + llvm::APSInt Zero( + SemaRef->Context.getTypeSize(SemaRef->Context.getSizeType()), + false); CheckArrayType(IList, DeclType, Zero, SubobjectIsDesignatorContext, Index); } else @@ -269,15 +270,13 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType, return; } - // FIXME: Will 32 bits always be enough? I hope so. - const unsigned ArraySizeBits = 32; - // We might know the maximum number of elements in advance. - llvm::APSInt maxElements(ArraySizeBits, 0); + llvm::APSInt maxElements(elementIndex.getBitWidth(), 0); bool maxElementsKnown = false; if (const ConstantArrayType *CAT = SemaRef->Context.getAsConstantArrayType(DeclType)) { maxElements = CAT->getSize(); + elementIndex.extOrTrunc(maxElements.getBitWidth()); maxElementsKnown = true; } @@ -300,6 +299,11 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType, continue; } + if (elementIndex.getBitWidth() > maxElements.getBitWidth()) + maxElements.extend(elementIndex.getBitWidth()); + else if (elementIndex.getBitWidth() < maxElements.getBitWidth()) + elementIndex.extend(maxElements.getBitWidth()); + // If the array is of incomplete type, keep track of the number of // elements in the initializer. if (!maxElementsKnown && elementIndex > maxElements) @@ -325,7 +329,7 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType, if (DeclType->isIncompleteArrayType()) { // If this is an incomplete array type, the actual type needs to // be calculated here. - llvm::APInt Zero(ArraySizeBits, 0); + llvm::APInt Zero(maxElements.getBitWidth(), 0); if (maxElements == Zero) { // Sizing an array implicitly to zero is not allowed by ISO C, // but is supported by GNU. @@ -563,6 +567,7 @@ InitListChecker::CheckDesignatedInitializer(InitListExpr *IList, if (isa<ConstantArrayType>(AT)) { llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false); + DesignatedIndex.extOrTrunc(MaxElements.getBitWidth()); if (DesignatedIndex >= MaxElements) { SemaRef->Diag(IndexExpr->getSourceRange().getBegin(), diag::err_array_designator_too_large) |