diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h
index ac3ff73..28c36e9 100644
--- a/include/clang/ASTMatchers/ASTMatchers.h
+++ b/include/clang/ASTMatchers/ASTMatchers.h
@@ -1614,6 +1648,18 @@ inline internal::Matcher<MemberExpr> isArrow() {
   return makeMatcher(new internal::IsArrowMatcher());
 }
 
+/// \brief Matches QualType nodes that are of integer type.
+/// 
+/// Given
+///   void a(int);
+///   void b(long);
+///   void c(double);
+/// function(hasAnyParameter(hasType(isInteger())))
+/// matches "a(int)", "b(long)", but not "c(double)".
+inline internal::Matcher<clang::QualType> isInteger() {
+  return makeMatcher(new internal::IsIntegerMatcher());
+}
+
 /// \brief Matches QualType nodes that are const-qualified, i.e., that
 /// include "top-level" const.
 ///
diff --git a/include/clang/ASTMatchers/ASTMatchersInternal.h b/include/clang/ASTMatchers/ASTMatchersInternal.h
index d9e4c21..4dd2b93 100644
--- a/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -852,6 +852,13 @@ public:
   }
 };
 
+class IsIntegerMatcher : public SingleNodeMatcherInterface<clang::QualType> {
+ public:
+  virtual bool matchesNode(const clang::QualType &Node) const {
+    return Node->isIntegerType();
+  }
+};
+
 class IsConstQualifiedMatcher
     : public SingleNodeMatcherInterface<QualType> {
  public:
diff --git a/unittests/ASTMatchers/ASTMatchersTest.cpp b/unittests/ASTMatchers/ASTMatchersTest.cpp
index a529459..0075fca 100644
--- a/unittests/ASTMatchers/ASTMatchersTest.cpp
+++ b/unittests/ASTMatchers/ASTMatchersTest.cpp
@@ -898,6 +907,20 @@ TEST(MemberExpression, MatchesStaticVariable) {
               memberExpression()));
 }
 
+TEST(IsInteger, MatchesIntegers) {
+  EXPECT_TRUE(matches("int i = 0;", variable(hasType(isInteger()))));
+  EXPECT_TRUE(matches("long long i = 0; void f(long long) { }; void g() {f(i);}",
+                      call(hasArgument(0, declarationReference(
+                          to(variable(hasType(isInteger()))))))));
+}
+
+TEST(IsInteger, ReportsNoFalsePositives) {
+  EXPECT_FALSE(matches("int *i = NULL;", variable(hasType(isInteger()))));
+  EXPECT_FALSE(matches("struct T {}; T t; void f(T *) { }; void g() {f(&t);}",
+                      call(hasArgument(0, declarationReference(
+                          to(variable(hasType(isInteger()))))))));
+}
+
 TEST(IsArrow, MatchesMemberVariablesViaArrow) {
   EXPECT_TRUE(matches("class Y { void x() { this->y; } int y; };",
               memberExpression(isArrow())));
