Removed Sema::VerifyConstantArrayType(). With the new Array/ConstantArray/VariableArray nodes, this
routine was causing more trouble than it was worth. Anders/Chris noticed that it could return an error code
without emiting a diagnostic (which results in an silent invalid decl, which should *never* happen). In addition,
this routine didn't work well for typedefs and field decls. Lastly, it didn't consider that initializers aren't
in place yet.

Added Type::getAsConstantArrayType(), Type::getAsVariableArrayType(), Type::getAsVariablyModifiedType(),
and Type::isVariablyModifiedType();

Modified Sema::ParseDeclarator() and Sema::ParseField() to use the new predicates. Also added a FIXME for
the initializer omission. Also added a missing test for "static" @ file scope.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41647 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Type.cpp b/AST/Type.cpp
index 4bca030..26bfbe2 100644
--- a/AST/Type.cpp
+++ b/AST/Type.cpp
@@ -125,7 +125,7 @@
 }
 
 const ArrayType *Type::getAsArrayType() const {
-  // If this is directly a reference type, return it.
+  // If this is directly an array type, return it.
   if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
     return ATy;
   
@@ -136,6 +136,48 @@
   return 0;
 }
 
+const ConstantArrayType *Type::getAsConstantArrayType() const {
+  // If this is directly a constant array type, return it.
+  if (const ConstantArrayType *ATy = dyn_cast<ConstantArrayType>(this))
+    return ATy;
+  
+  // If this is a typedef for an array type, strip the typedef off without
+  // losing all typedef information.
+  if (isa<ConstantArrayType>(CanonicalType))
+    return cast<ConstantArrayType>(cast<TypedefType>(this)->LookThroughTypedefs());
+  return 0;
+}
+
+const VariableArrayType *Type::getAsVariableArrayType() const {
+  // If this is directly a variable array type, return it.
+  if (const VariableArrayType *ATy = dyn_cast<VariableArrayType>(this))
+    return ATy;
+  
+  // If this is a typedef for an array type, strip the typedef off without
+  // losing all typedef information.
+  if (isa<VariableArrayType>(CanonicalType))
+    return cast<VariableArrayType>(cast<TypedefType>(this)->LookThroughTypedefs());
+  return 0;
+}
+
+/// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array
+/// types that have a non-constant expression. This does not include "[]".
+bool Type::isVariablyModifiedType() const {
+  if (const VariableArrayType *VAT = getAsVariableArrayType()) {
+    if (VAT->getSizeExpr())
+      return true;
+  }
+  return false;
+}
+
+const VariableArrayType *Type::getAsVariablyModifiedType() const {
+  if (const VariableArrayType *VAT = getAsVariableArrayType()) {
+    if (VAT->getSizeExpr())
+      return VAT;
+  }
+  return 0;
+}
+
 const RecordType *Type::getAsRecordType() const {
   // If this is directly a reference type, return it.
   if (const RecordType *RTy = dyn_cast<RecordType>(this))