]> granicus.if.org Git - clang/commitdiff
Fix invalid VLAs/VMs in Sema::ActOnVariableDeclarator, so that the variable will...
authorAnders Carlsson <andersca@mac.com>
Sat, 28 Feb 2009 21:56:50 +0000 (21:56 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 28 Feb 2009 21:56:50 +0000 (21:56 +0000)
int a[(int)(1.0 / 1.0) = { 1 } will work.

Eli, please review.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65725 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Sema/const-eval.c

index c9b5405fbe1537deffb0e79b0837104d4f478684..76794e571d4ae1c21abe2c888bdca6c889143d38 100644 (file)
@@ -1622,6 +1622,42 @@ Sema::ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC,
     Diag(D.getIdentifierLoc(), diag::warn_attribute_weak_on_local);
   }
 
+  bool isIllegalVLA = R->isVariableArrayType() && NewVD->hasGlobalStorage();
+  bool isIllegalVM = R->isVariablyModifiedType() && NewVD->hasLinkage();
+  if (isIllegalVLA || isIllegalVM) {
+    bool SizeIsNegative;
+    QualType FixedTy =
+        TryToFixInvalidVariablyModifiedType(R, Context, SizeIsNegative);
+    if (!FixedTy.isNull()) {
+      Diag(NewVD->getLocation(), diag::warn_illegal_constant_array_size);
+      NewVD->setType(FixedTy);
+    } else if (R->isVariableArrayType()) {
+      NewVD->setInvalidDecl();
+
+      const VariableArrayType *VAT = Context.getAsVariableArrayType(R);
+      // FIXME: This won't give the correct result for 
+      // int a[10][n];      
+      SourceRange SizeRange = VAT->getSizeExpr()->getSourceRange();
+
+      if (NewVD->isFileVarDecl())
+        Diag(NewVD->getLocation(), diag::err_vla_decl_in_file_scope)
+          << SizeRange;
+      else if (NewVD->getStorageClass() == VarDecl::Static)
+        Diag(NewVD->getLocation(), diag::err_vla_decl_has_static_storage)
+          << SizeRange;
+      else
+        Diag(NewVD->getLocation(), diag::err_vla_decl_has_extern_linkage)
+            << SizeRange;
+    } else {
+      InvalidDecl = true;
+      
+      if (NewVD->isFileVarDecl())
+        Diag(NewVD->getLocation(), diag::err_vm_decl_in_file_scope);
+      else
+        Diag(NewVD->getLocation(), diag::err_vm_decl_has_extern_linkage);
+    }
+  }
+
   // If name lookup finds a previous declaration that is not in the
   // same scope as the new declaration, this may still be an
   // acceptable redeclaration.
index fd7b40ea1bab7f3b5022d2dfb2afabb0f23f7f67..7714f488171530380bc8db49286ba7bca28e6ae0 100644 (file)
@@ -47,3 +47,6 @@ EVAL_EXPR(21, (__imag__ 2i) == 2 ? 1 : -1);
 
 EVAL_EXPR(22, (__real__ (2i+3)) == 3 ? 1 : -1);
 
+int g23[(int)(1.0 / 1.0)] = { 1 };
+int g24[(int)(1.0 / 1.0)] = { 1 , 2 }; // expected-warning {{excess elements in array initializer}}
+int g25[(int)(1.0 + 1.0)], g26 = sizeof(g25);