diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 07bcf9e..3257664 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -1955,7 +1955,8 @@ enum CXTypeKind {
   CXType_ObjCInterface = 108,
   CXType_ObjCObjectPointer = 109,
   CXType_FunctionNoProto = 110,
-  CXType_FunctionProto = 111
+  CXType_FunctionProto = 111,
+  CXType_ConstantArray = 112
 };
 
 /**
@@ -2047,6 +2048,20 @@ CINDEX_LINKAGE CXType clang_getCursorResultType(CXCursor C);
 CINDEX_LINKAGE unsigned clang_isPODType(CXType T);
 
 /**
+ * \brief Return the element type of an array type.
+ *
+ * If a non-array type is passed in, an invalid type is returned.
+ */
+CINDEX_LINKAGE CXType clang_getArrayElementType(CXType T);
+
+/**
+ * \brief Return the the array size of a constant array.
+ *
+ * If a non-array type is passed in, -1 is returned.
+ */
+CINDEX_LINKAGE int clang_getArraySize(CXType T);
+
+/**
  * \brief Returns 1 if the base class specified by the cursor with kind
  *   CX_CXXBaseSpecifier is virtual.
  */
diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp
index 45c7346..2a20298 100644
--- a/tools/libclang/CXType.cpp
+++ b/tools/libclang/CXType.cpp
@@ -84,6 +84,7 @@ static CXTypeKind GetTypeKind(QualType T) {
     TKCASE(ObjCObjectPointer);
     TKCASE(FunctionNoProto);
     TKCASE(FunctionProto);
+    TKCASE(ConstantArray);
     default:
       return CXType_Unexposed;
   }
@@ -330,6 +331,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
     TKIND(ObjCObjectPointer);
     TKIND(FunctionNoProto);
     TKIND(FunctionProto);
+    TKIND(ConstantArray);
   }
 #undef TKIND
   return cxstring::createCXString(s);
@@ -373,6 +375,46 @@ unsigned clang_isPODType(CXType X) {
   return T.isPODType(AU->getASTContext()) ? 1 : 0;
 }
 
+CXType clang_getArrayElementType(CXType X)
+{
+	CXTranslationUnit TU = GetTU(X);
+	QualType ET = QualType();
+	QualType T = GetQualType(X);
+	const Type *TP = T.getTypePtrOrNull();
+
+	if (TP) {
+		switch (TP->getTypeClass()) {
+		case Type::ConstantArray:
+			ET = cast<ConstantArrayType>(TP)->getElementType();
+			break;
+		default:
+			break;
+		}
+	}
+	return MakeCXType(ET, TU);
+}
+
+int clang_getArraySize(CXType X)
+{
+	int result = -1;
+	QualType T = GetQualType(X);
+	const Type *TP = T.getTypePtrOrNull();
+
+	if (TP) {
+		switch (TP->getTypeClass()) {
+		case Type::ConstantArray:
+			{
+				llvm::APInt size = cast<ConstantArrayType>(TP)->getSize();
+				result = size.getSExtValue();
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	return result;
+}
+
 CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
   if ((C.kind < CXCursor_FirstDecl) || (C.kind > CXCursor_LastDecl))
     return cxstring::createCXString("");
diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports
index ea7aaf0..cc6c326 100644
--- a/tools/libclang/libclang.exports
+++ b/tools/libclang/libclang.exports
@@ -42,6 +42,8 @@ clang_equalRanges
 clang_equalTypes
 clang_executeOnThread
 clang_formatDiagnostic
+clang_getArrayElementType
+clang_getArraySize
 clang_getCString
 clang_getCXTUResourceUsage
 clang_getCXXAccessSpecifier
