diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 3257664..adc89d7 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -2062,6 +2062,23 @@ CINDEX_LINKAGE CXType clang_getArrayElementType(CXType T);
 CINDEX_LINKAGE int clang_getArraySize(CXType T);
 
 /**
+ * \brief Return the number of arguments for a function with a
+ * prototype.
+ *
+ * If an invalid type is passed in, -1 is returned.
+ */
+CINDEX_LINKAGE int clang_getFunctionArgumentCount(CXType T);
+
+/**
+ * \brief Return the type of the i-th argument for a function with a
+ * prototype.
+ *
+ * If an invalid type or index is passed in, an invalid type is returned.
+ */
+CINDEX_LINKAGE CXType clang_getFunctionArgumentType(CXType T, unsigned i);
+
+
+/**
  * \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 2a20298..18a8d0f 100644
--- a/tools/libclang/CXType.cpp
+++ b/tools/libclang/CXType.cpp
@@ -72,6 +72,8 @@ static CXTypeKind GetTypeKind(QualType T) {
   switch (TP->getTypeClass()) {
     case Type::Builtin:
       return GetBuiltinTypeKind(cast<BuiltinType>(TP));
+    case Type::Paren:
+      return GetTypeKind(cast<ParenType>(TP)->getInnerType());
     TKCASE(Complex);
     TKCASE(Pointer);
     TKCASE(BlockPointer);
@@ -415,6 +417,50 @@ int clang_getArraySize(CXType X)
 	return result;
 }
 
+int clang_getFunctionArgumentCount(CXType X)
+{
+	int result = -1;
+	QualType T = GetQualType(X);
+	const Type *TP = T.getTypePtrOrNull();
+
+	if (TP) {
+		switch (TP->getTypeClass()) {
+		case Type::FunctionProto:
+			{
+				result = (int) cast<FunctionProtoType>(TP)->getNumArgs();
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	return result;
+}
+
+CXType clang_getFunctionArgumentType(CXType X, unsigned i)
+{
+	CXTranslationUnit TU = GetTU(X);
+	QualType T = GetQualType(X);
+	QualType AT = QualType();
+	const Type *TP = T.getTypePtrOrNull();
+
+	if (TP) {
+		switch (TP->getTypeClass()) {
+		case Type::FunctionProto:
+			{
+				const FunctionProtoType * FP = cast<FunctionProtoType>(TP);
+
+				if (i < FP->getNumArgs())
+					AT = FP->getArgType(i);
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	return MakeCXType(AT, TU);
+}
+
 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 cc6c326..06d7efa 100644
--- a/tools/libclang/libclang.exports
+++ b/tools/libclang/libclang.exports
@@ -89,6 +89,8 @@ clang_getDiagnosticSpelling
 clang_getFile
 clang_getFileName
 clang_getFileTime
+clang_getFunctionArgumentCount
+clang_getFunctionArgumentType
 clang_getIBOutletCollectionType
 clang_getIncludedFile
 clang_getInclusions
