]> granicus.if.org Git - clang/commitdiff
Make sure all of the isUnsigned flags line up when comparing initializer values,...
authorDouglas Gregor <dgregor@apple.com>
Fri, 23 Jan 2009 18:58:42 +0000 (18:58 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 23 Jan 2009 18:58:42 +0000 (18:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62858 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/Sema/designated-initializers.c

index ba8312b7b52df00badaab0f9b46a92816ffcd44a..aff46ef61d501760412cf42e9e401aae771b0a72 100644 (file)
@@ -271,12 +271,13 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType,
   }
 
   // We might know the maximum number of elements in advance.
-  llvm::APSInt maxElements(elementIndex.getBitWidth(), 0);
+  llvm::APSInt maxElements(elementIndex.getBitWidth(), elementIndex.isUnsigned());
   bool maxElementsKnown = false;
   if (const ConstantArrayType *CAT =
         SemaRef->Context.getAsConstantArrayType(DeclType)) {
     maxElements = CAT->getSize();
     elementIndex.extOrTrunc(maxElements.getBitWidth());
+    elementIndex.setIsUnsigned(maxElements.isUnsigned());
     maxElementsKnown = true;
   }
 
@@ -303,6 +304,7 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType,
         maxElements.extend(elementIndex.getBitWidth());
       else if (elementIndex.getBitWidth() < maxElements.getBitWidth())
         elementIndex.extend(maxElements.getBitWidth());
+      elementIndex.setIsUnsigned(maxElements.isUnsigned());
 
       // If the array is of incomplete type, keep track of the number of
       // elements in the initializer.
@@ -329,7 +331,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(maxElements.getBitWidth(), 0);
+    llvm::APSInt Zero(maxElements.getBitWidth(), maxElements.isUnsigned());
     if (maxElements == Zero) {
       // Sizing an array implicitly to zero is not allowed by ISO C,
       // but is supported by GNU.
@@ -568,6 +570,7 @@ InitListChecker::CheckDesignatedInitializer(InitListExpr *IList,
   if (isa<ConstantArrayType>(AT)) {
     llvm::APSInt MaxElements(cast<ConstantArrayType>(AT)->getSize(), false);
     DesignatedIndex.extOrTrunc(MaxElements.getBitWidth());
+    DesignatedIndex.setIsUnsigned(MaxElements.isUnsigned());
     if (DesignatedIndex >= MaxElements) {
       SemaRef->Diag(IndexExpr->getSourceRange().getBegin(),
                     diag::err_array_designator_too_large)
@@ -617,7 +620,8 @@ CheckArrayDesignatorExpr(Sema &Self, Expr *Index, llvm::APSInt &Value) {
       << Index->getSourceRange();
 
   // Make sure this constant expression is non-negative.
-  llvm::APSInt Zero(llvm::APSInt::getNullValue(Value.getBitWidth()), false);
+  llvm::APSInt Zero(llvm::APSInt::getNullValue(Value.getBitWidth()), 
+                    Value.isUnsigned());
   if (Value < Zero)
     return Self.Diag(Loc, diag::err_array_designator_negative)
       << Value.toString(10) << Index->getSourceRange();
index 8e5bd43b6c6a05b64aad0f6d86e0973273c86fa2..3fe5f8484c2df5eed180c36729858d90ddfce4fd 100644 (file)
@@ -115,3 +115,4 @@ struct disklabel_ops disklabel64_ops = {
 
 // PR clang/3377
 int bitwidth[] = { [(long long int)1] = 5, [(short int)2] = 2 };
+int a[]= { [sizeof(int)] = 0 };