r305022 - [ASTMatchers] Add clang-query support for equals matcher

Peter Wu via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 8 16:02:50 PDT 2017


Yes, mea culpa :(

I forgot to rebuild after doing the final revision of the patch (in
which two new tests were added). The failing tests are temporary
disabled in r305025 until a proper fix is developed.

Kind regards,
Peter

On Thu, Jun 08, 2017 at 03:58:01PM -0700, Kostya Serebryany wrote:
> The test seems to be failing:
> llvm/tools/clang/unittests/ASTMatchers/Dynamic/RegistryTest.cpp:533: Failure
> Value of: matches("double x = 1.2f;", DoubleStmt)
>   Actual: false (Could not find match in "double x = 1.2f;")
> Expected: true
> 
> 
> On Thu, Jun 8, 2017 at 3:00 PM, Peter Wu via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
> 
> > Author: lekensteyn
> > Date: Thu Jun  8 17:00:58 2017
> > New Revision: 305022
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=305022&view=rev
> > Log:
> > [ASTMatchers] Add clang-query support for equals matcher
> >
> > Summary:
> > This allows the clang-query tool to use matchers like
> > "integerLiteral(equals(32))". For this to work, an overloaded function
> > is added for each possible parameter type.
> >
> > Reviewed By: aaron.ballman
> >
> > Differential Revision: https://reviews.llvm.org/D33094
> >
> > Modified:
> >     cfe/trunk/docs/LibASTMatchersReference.html
> >     cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> >     cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
> >     cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
> >
> > Modified: cfe/trunk/docs/LibASTMatchersReference.html
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/
> > LibASTMatchersReference.html?rev=305022&r1=305021&r2=305022&view=diff
> > ============================================================
> > ==================
> > --- cfe/trunk/docs/LibASTMatchersReference.html (original)
> > +++ cfe/trunk/docs/LibASTMatchersReference.html Thu Jun  8 17:00:58 2017
> > @@ -1859,17 +1859,36 @@ Example matches a || b (matcher = binary
> >  </pre></td></tr>
> >
> >
> > -<tr><td>Matcher<CXXBoolLiteral></td><td class="name"
> > onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT
> > Value</td></tr>
> > -<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that
> > are equal to the given value.
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name"
> > onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that
> > are equal to the given value of type ValueT.
> >
> > -Example matches true (matcher = cxxBoolLiteral(equals(true)))
> > -  true
> > +Given
> > +  f('false, 3.14, 42);
> > +characterLiteral(equals(0))
> > +  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
> > +  match false
> > +floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
> > +  match 3.14
> > +integerLiteral(equals(42))
> > +  matches 42
> >
> > -Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<CXXBoolLiteral>,
> > +Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
> >             Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>>
> >  </pre></td></tr>
> >
> >
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name"
> > onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name"
> > onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name"
> > onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
> > +
> > +
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name"
> > onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">
> > isCatchAll</a></td><td></td></tr>
> >  <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch
> > statement that has a catch-all handler.
> >
> > @@ -2296,16 +2315,35 @@ Example: matches the implicit cast aroun
> >
> >
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name"
> > onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>ValueT
> > Value</td></tr>
> > -<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that
> > are equal to the given value.
> > +<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that
> > are equal to the given value of type ValueT.
> >
> > -Example matches true (matcher = cxxBoolLiteral(equals(true)))
> > -  true
> > +Given
> > +  f('false, 3.14, 42);
> > +characterLiteral(equals(0))
> > +  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
> > +  match false
> > +floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
> > +  match 3.14
> > +integerLiteral(equals(42))
> > +  matches 42
> >
> > -Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<CXXBoolLiteral>,
> > +Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
> >             Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>>
> >  </pre></td></tr>
> >
> >
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name"
> > onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name"
> > onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name"
> > onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
> > +
> > +
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td
> > class="name" onclick="toggle('templateArgumentCountIs0')"><a name="
> > templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned
> > N</td></tr>
> >  <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches
> > if the number of template arguments equals N.
> >
> > @@ -2533,16 +2571,27 @@ fieldDecl(isBitField())
> >
> >
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name"
> > onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>ValueT
> > Value</td></tr>
> > -<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that
> > are equal to the given value.
> > +<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that
> > are equal to the given value of type ValueT.
> >
> > -Example matches true (matcher = cxxBoolLiteral(equals(true)))
> > -  true
> > +Given
> > +  f('false, 3.14, 42);
> > +characterLiteral(equals(0))
> > +  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
> > +  match false
> > +floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
> > +  match 3.14
> > +integerLiteral(equals(42))
> > +  matches 42
> >
> > -Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<CXXBoolLiteral>,
> > +Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
> >             Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>>
> >  </pre></td></tr>
> >
> >
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name"
> > onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
> > +
> > +
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1FunctionDecl.html">FunctionDecl</a>></td><td class="name"
> > onclick="toggle('hasDynamicExceptionSpec0')"><a name="
> > hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a><
> > /td><td></td></tr>
> >  <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches
> > functions that have a dynamic exception specification.
> >
> > @@ -2805,16 +2854,35 @@ functionProtoType(parameterCountIs(3))
> >
> >
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name"
> > onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>ValueT
> > Value</td></tr>
> > -<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that
> > are equal to the given value.
> > +<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that
> > are equal to the given value of type ValueT.
> >
> > -Example matches true (matcher = cxxBoolLiteral(equals(true)))
> > -  true
> > +Given
> > +  f('false, 3.14, 42);
> > +characterLiteral(equals(0))
> > +  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
> > +  match false
> > +floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
> > +  match 3.14
> > +integerLiteral(equals(42))
> > +  matches 42
> >
> > -Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<CXXBoolLiteral>,
> > +Usable as: Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>,
> >             Matcher<<a href="http://clang.llvm.org/
> > doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>,
> > Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>>
> >  </pre></td></tr>
> >
> >
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name"
> > onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name"
> > onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
> > +
> > +
> > +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name"
> > onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned
> > Value</td></tr>
> > +<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
> > +
> > +
> >  <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_
> > 1MemberExpr.html">MemberExpr</a>></td><td class="name"
> > onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow<
> > /a></td><td></td></tr>
> >  <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member
> > expressions that are called with '->' as opposed
> >  to '.'.
> >
> > Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> > clang/ASTMatchers/ASTMatchers.h?rev=305022&r1=305021&r2=305022&view=diff
> > ============================================================
> > ==================
> > --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
> > +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Thu Jun  8 17:00:58
> > 2017
> > @@ -3806,14 +3806,22 @@ AST_MATCHER_P(CompoundStmt, statementCou
> >    return Node.size() == N;
> >  }
> >
> > -/// \brief Matches literals that are equal to the given value.
> > +/// \brief Matches literals that are equal to the given value of type
> > ValueT.
> >  ///
> > -/// Example matches true (matcher = cxxBoolLiteral(equals(true)))
> > +/// Given
> >  /// \code
> > -///   true
> > +///   f('\0', false, 3.14, 42);
> >  /// \endcode
> > +/// characterLiteral(equals(0))
> > +///   matches '\0'
> > +/// cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
> > +///   match false
> > +/// floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
> > +///   match 3.14
> > +/// integerLiteral(equals(42))
> > +///   matches 42
> >  ///
> > -/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>,
> > +/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
> >  ///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
> >  template <typename ValueT>
> >  internal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher,
> > ValueT>
> > @@ -3823,6 +3831,34 @@ equals(const ValueT &Value) {
> >      ValueT>(Value);
> >  }
> >
> > +AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
> > +                          AST_POLYMORPHIC_SUPPORTED_
> > TYPES(CharacterLiteral,
> > +
> > CXXBoolLiteralExpr,
> > +                                                          IntegerLiteral),
> > +                          bool, Value, 0) {
> > +  return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
> > +    .matchesNode(Node);
> > +}
> > +
> > +AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
> > +                          AST_POLYMORPHIC_SUPPORTED_
> > TYPES(CharacterLiteral,
> > +
> > CXXBoolLiteralExpr,
> > +                                                          IntegerLiteral),
> > +                          unsigned, Value, 1) {
> > +  return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
> > +    .matchesNode(Node);
> > +}
> > +
> > +AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
> > +                          AST_POLYMORPHIC_SUPPORTED_
> > TYPES(CharacterLiteral,
> > +
> > CXXBoolLiteralExpr,
> > +                                                          FloatingLiteral,
> > +                                                          IntegerLiteral),
> > +                          double, Value, 2) {
> > +  return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
> > +    .matchesNode(Node);
> > +}
> > +
> >  /// \brief Matches the operator Name of operator expressions (binary or
> >  /// unary).
> >  ///
> >
> > Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> > ASTMatchers/Dynamic/Registry.cpp?rev=305022&r1=305021&r2=305022&view=diff
> > ============================================================
> > ==================
> > --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original)
> > +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Thu Jun  8 17:00:58
> > 2017
> > @@ -56,20 +56,24 @@ void RegistryMaps::registerMatcher(
> >    registerMatcher(#name, internal::makeMatcherAutoMarshall(
> >       \
> >                               ::clang::ast_matchers::name, #name));
> >
> > +#define REGISTER_MATCHER_OVERLOAD(name)
> >       \
> > +  registerMatcher(#name,
> >      \
> > +      llvm::make_unique<internal::OverloadedMatcherDescriptor>(
> > name##Callbacks))
> > +
> >  #define SPECIFIC_MATCHER_OVERLOAD(name, Id)
> >       \
> >    static_cast<::clang::ast_matchers::name##_Type##Id>(
> >        \
> >        ::clang::ast_matchers::name)
> >
> > +#define MATCHER_OVERLOAD_ENTRY(name, Id)
> >      \
> > +        internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name,
> > Id), \
> > +                                          #name)
> > +
> >  #define REGISTER_OVERLOADED_2(name)
> >       \
> >    do {
> >      \
> > -    std::unique_ptr<MatcherDescriptor> Callbacks[] = {
> >        \
> > -        internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name,
> > 0),  \
> > -                                          #name),
> >       \
> > -        internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name,
> > 1),  \
> > -                                          #name)};
> >      \
> > -    registerMatcher(
> >      \
> > -        #name,
> >      \
> > -        llvm::make_unique<internal::OverloadedMatcherDescriptor>(Callbacks));
> > \
> > +    std::unique_ptr<MatcherDescriptor> name##Callbacks[] = {
> >        \
> > +        MATCHER_OVERLOAD_ENTRY(name, 0),
> >      \
> > +        MATCHER_OVERLOAD_ENTRY(name, 1)};
> >       \
> > +    REGISTER_MATCHER_OVERLOAD(name);
> >        \
> >    } while (0)
> >
> >  /// \brief Generate a registry map with all the known matchers.
> > @@ -83,7 +87,6 @@ RegistryMaps::RegistryMaps() {
> >    // findAll
> >    //
> >    // Other:
> > -  // equals
> >    // equalsNode
> >
> >    REGISTER_OVERLOADED_2(callee);
> > @@ -96,6 +99,13 @@ RegistryMaps::RegistryMaps() {
> >    REGISTER_OVERLOADED_2(references);
> >    REGISTER_OVERLOADED_2(thisPointerType);
> >
> > +  std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {
> > +      MATCHER_OVERLOAD_ENTRY(equals, 0),
> > +      MATCHER_OVERLOAD_ENTRY(equals, 1),
> > +      MATCHER_OVERLOAD_ENTRY(equals, 2),
> > +  };
> > +  REGISTER_MATCHER_OVERLOAD(equals);
> > +
> >    REGISTER_MATCHER(accessSpecDecl);
> >    REGISTER_MATCHER(addrLabelExpr);
> >    REGISTER_MATCHER(alignOfExpr);
> >
> > Modified: cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/
> > ASTMatchers/Dynamic/RegistryTest.cpp?rev=305022&
> > r1=305021&r2=305022&view=diff
> > ============================================================
> > ==================
> > --- cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp (original)
> > +++ cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp Thu Jun  8
> > 17:00:58 2017
> > @@ -511,6 +511,46 @@ TEST_F(RegistryTest, ParenExpr) {
> >    EXPECT_FALSE(matches("int i = 1;", Value));
> >  }
> >
> > +TEST_F(RegistryTest, EqualsMatcher) {
> > +  Matcher<Stmt> BooleanStmt = constructMatcher(
> > +      "cxxBoolLiteral", constructMatcher("equals", VariantValue(true)))
> > +      .getTypedMatcher<Stmt>();
> > +  EXPECT_TRUE(matches("bool x = true;", BooleanStmt));
> > +  EXPECT_FALSE(matches("bool x = false;", BooleanStmt));
> > +  EXPECT_FALSE(matches("bool x = 0;", BooleanStmt));
> > +
> > +  BooleanStmt = constructMatcher(
> > +      "cxxBoolLiteral", constructMatcher("equals", VariantValue(0)))
> > +      .getTypedMatcher<Stmt>();
> > +  EXPECT_TRUE(matches("bool x = false;", BooleanStmt));
> > +  EXPECT_FALSE(matches("bool x = true;", BooleanStmt));
> > +  EXPECT_FALSE(matches("bool x = 0;", BooleanStmt));
> > +
> > +  Matcher<Stmt> DoubleStmt = constructMatcher(
> > +      "floatLiteral", constructMatcher("equals", VariantValue(1.2)))
> > +      .getTypedMatcher<Stmt>();
> > +  EXPECT_TRUE(matches("double x = 1.2;", DoubleStmt));
> > +  EXPECT_TRUE(matches("double x = 1.2f;", DoubleStmt));
> > +  EXPECT_TRUE(matches("double x = 1.2l;", DoubleStmt));
> > +  EXPECT_TRUE(matches("double x = 12e-1;", DoubleStmt));
> > +  EXPECT_FALSE(matches("double x = 1.23;", DoubleStmt));
> > +
> > +  Matcher<Stmt> IntegerStmt = constructMatcher(
> > +      "integerLiteral", constructMatcher("equals", VariantValue(42)))
> > +      .getTypedMatcher<Stmt>();
> > +  EXPECT_TRUE(matches("int x = 42;", IntegerStmt));
> > +  EXPECT_FALSE(matches("int x = 1;", IntegerStmt));
> > +
> > +  Matcher<Stmt> CharStmt = constructMatcher(
> > +      "characterLiteral", constructMatcher("equals", VariantValue('x')))
> > +      .getTypedMatcher<Stmt>();
> > +  EXPECT_TRUE(matches("int x = 'x';", CharStmt));
> > +  EXPECT_TRUE(matches("int x = L'x';", CharStmt));
> > +  EXPECT_TRUE(matches("int x = u'x';", CharStmt));
> > +  EXPECT_TRUE(matches("int x = U'x';", CharStmt));
> > +  EXPECT_FALSE(matches("int x = 120;", CharStmt));
> > +}
> > +
> >  } // end anonymous namespace
> >  } // end namespace dynamic
> >  } // end namespace ast_matchers
> >


More information about the cfe-commits mailing list