diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h
index 28c36e9..670133b 100644
--- a/include/clang/ASTMatchers/ASTMatchers.h
+++ b/include/clang/ASTMatchers/ASTMatchers.h
@@ -184,6 +184,19 @@ AST_MATCHER_P(ClassTemplateSpecializationDecl, hasAnyTemplateArgument,
   return false;
 }
 
+/// \brief Matches expressions that match InnerMatcher after implicit casts are
+/// stripped off.
+AST_MATCHER_P(Expr, ignoreImplicitCasts,
+              internal::Matcher<Expr>, InnerMatcher) {
+  return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
+}
+
+/// \brief Matches expressions that match InnerMatcher after parenthesized casts
+/// are stripped off.
+AST_MATCHER_P(Expr, ignoreParenCasts, internal::Matcher<Expr>, InnerMatcher) {
+  return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
+}
+
 /// \brief Matches classTemplateSpecializations where the n'th TemplateArgument
 /// matches the given Matcher.
 ///
diff --git a/unittests/ASTMatchers/ASTMatchersTest.cpp b/unittests/ASTMatchers/ASTMatchersTest.cpp
index 0075fca..d9ce859 100644
--- a/unittests/ASTMatchers/ASTMatchersTest.cpp
+++ b/unittests/ASTMatchers/ASTMatchersTest.cpp
@@ -2020,6 +2029,23 @@ TEST(HasDestinationType, MatchesSimpleCase) {
                               pointsTo(TypeMatcher(anything())))))));
 }
 
+TEST(ImplicitCast, MatchesSimpleCase) {
+  EXPECT_TRUE(matches("int x = 0; const int y = x;",
+                      variable(hasInitializer(implicitCast(expression())))));
+}
+
+TEST(ImplicitCast, MatchesIgnoreImplicitCast) {
+  EXPECT_TRUE(matches("int x = 0; const int y = x;",
+                      variable(hasInitializer(
+                          ignoreImplicitCasts(expression())))));
+}
+
+TEST(ImplicitCast, MatchesIgnoreParenCast) {
+  EXPECT_TRUE(matches("int x = 0; const int y = (const int) x;",
+                      variable(hasInitializer(
+                          ignoreParenCasts(expression())))));
+}
+
 TEST(HasSourceExpression, MatchesSimpleCase) {
   EXPECT_TRUE(matches("class string {}; class URL { public: URL(string s); };"
                       "void r() {string a_string; URL url = a_string; }",

