Oh, my bad...Fixed. Thanks! On Fri, Jul 29, 2016 at 6:32 PM, Benjamin Kramer <benny....@gmail.com> wrote:
> Sorry for being overly dense, you misspelled 'typename' in the docs. > > On Fri, Jul 29, 2016 at 5:59 PM, Haojian Wu <hok...@google.com> wrote: > > No, this is not templateName patch. The templateName one is in r277155. > > > > On Fri, Jul 29, 2016 at 4:45 PM, Benjamin Kramer <benny....@gmail.com> > > wrote: > >> > >> On Fri, Jul 29, 2016 at 3:57 PM, Haojian Wu via cfe-commits > >> <cfe-commits@lists.llvm.org> wrote: > >> > Author: hokein > >> > Date: Fri Jul 29 08:57:27 2016 > >> > New Revision: 277142 > >> > > >> > URL: http://llvm.org/viewvc/llvm-project?rev=277142&view=rev > >> > Log: > >> > [ASTMatcher] Add hasTemplateArgument/hasAnyTemplateArgument support in > >> > functionDecl. > >> > > >> > Reviewers: klimek > >> > > >> > Subscribers: klimek, cfe-commits > >> > > >> > Differential Revision: https://reviews.llvm.org/D22957 > >> > > >> > Modified: > >> > cfe/trunk/docs/LibASTMatchersReference.html > >> > cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h > >> > cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h > >> > cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp > >> > > >> > Modified: cfe/trunk/docs/LibASTMatchersReference.html > >> > URL: > >> > > http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=277142&r1=277141&r2=277142&view=diff > >> > > >> > > ============================================================================== > >> > --- cfe/trunk/docs/LibASTMatchersReference.html (original) > >> > +++ cfe/trunk/docs/LibASTMatchersReference.html Fri Jul 29 08:57:27 > 2016 > >> > @@ -4240,30 +4240,44 @@ caseStmt(hasCaseConstant(integerLiteral( > >> > > >> > > >> > <tr><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html > ">ClassTemplateSpecializationDecl</a>></td><td > >> > class="name" onclick="toggle('hasAnyTemplateArgument0')"><a > >> > > name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > -<tr><td colspan="4" class="doc" > >> > id="hasAnyTemplateArgument0"><pre>Matches > classTemplateSpecializations that > >> > have at least one > >> > -TemplateArgument matching the given InnerMatcher. > >> > +<tr><td colspan="4" class="doc" > >> > id="hasAnyTemplateArgument0"><pre>Matches > classTemplateSpecializations, > >> > templateSpecializationType and > >> > +functionDecl that have at least one TemplateArgument matching the > given > >> > +InnerMatcher. > >> > > >> > Given > >> > template<typename T> class A {}; > >> > template<> class A<double> {}; > >> > A<int> a; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > + > >> > classTemplateSpecializationDecl(hasAnyTemplateArgument( > >> > refersToType(asString("int")))) > >> > matches the specialization A<int> > >> > + > >> > +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > </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('hasTemplateArgument0')"><a > >> > > name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned > >> > N, Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > -<tr><td colspan="4" class="doc" > id="hasTemplateArgument0"><pre>Matches > >> > classTemplateSpecializations where the n'th TemplateArgument > >> > -matches the given InnerMatcher. > >> > +<tr><td colspan="4" class="doc" > id="hasTemplateArgument0"><pre>Matches > >> > classTemplateSpecializations, templateSpecializationType and > >> > +functionDecl where the n'th TemplateArgument matches the given > >> > InnerMatcher. > >> > > >> > Given > >> > template<typename T, typename U> class A {}; > >> > A<bool, int> b; > >> > A<int, bool> c; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > classTemplateSpecializationDecl(hasTemplateArgument( > >> > 1, refersToType(asString("int")))) > >> > matches the specialization A<bool, int> > >> > + > >> > +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > </pre></td></tr> > >> > > >> > > >> > @@ -4679,6 +4693,28 @@ with hasAnyParameter(...) > >> > </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('hasAnyTemplateArgument2')"><a > >> > > name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > +<tr><td colspan="4" class="doc" > >> > id="hasAnyTemplateArgument2"><pre>Matches > classTemplateSpecializations, > >> > templateSpecializationType and > >> > +functionDecl that have at least one TemplateArgument matching the > given > >> > +InnerMatcher. > >> > + > >> > +Given > >> > + template<typename T> class A {}; > >> > + template<> class A<double> {}; > >> > + A<int> a; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > + > >> > +classTemplateSpecializationDecl(hasAnyTemplateArgument( > >> > + refersToType(asString("int")))) > >> > + matches the specialization A<int> > >> > + > >> > +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > +</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('hasBody4')"><a > >> > name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a > >> > href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html > ">Stmt</a>> > >> > InnerMatcher</td></tr> > >> > <tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', > >> > 'while', 'do while' statement or a function > >> > definition that has a given body. > >> > @@ -4704,6 +4740,26 @@ with hasParameter(...) > >> > </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('hasTemplateArgument2')"><a > >> > > name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned > >> > N, Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > +<tr><td colspan="4" class="doc" > id="hasTemplateArgument2"><pre>Matches > >> > classTemplateSpecializations, templateSpecializationType and > >> > +functionDecl where the n'th TemplateArgument matches the given > >> > InnerMatcher. > >> > + > >> > +Given > >> > + template<typename T, typename U> class A {}; > >> > + A<bool, int> b; > >> > + A<int, bool> c; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > +classTemplateSpecializationDecl(hasTemplateArgument( > >> > + 1, refersToType(asString("int")))) > >> > + matches the specialization A<bool, int> > >> > + > >> > +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > +</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('returns0')"><a > >> > name="returns0Anchor">returns</a></td><td>Matcher<<a > >> > href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html > ">QualType</a>> > >> > InnerMatcher</td></tr> > >> > <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return > >> > type of a function declaration. > >> > > >> > @@ -5311,16 +5367,24 @@ classTemplateSpecializationDecl(hasAnyTe > >> > > >> > > >> > <tr><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html > ">TemplateSpecializationType</a>></td><td > >> > class="name" onclick="toggle('hasAnyTemplateArgument1')"><a > >> > > name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > -<tr><td colspan="4" class="doc" > >> > id="hasAnyTemplateArgument1"><pre>Matches > classTemplateSpecializations that > >> > have at least one > >> > -TemplateArgument matching the given InnerMatcher. > >> > +<tr><td colspan="4" class="doc" > >> > id="hasAnyTemplateArgument1"><pre>Matches > classTemplateSpecializations, > >> > templateSpecializationType and > >> > +functionDecl that have at least one TemplateArgument matching the > given > >> > +InnerMatcher. > >> > > >> > Given > >> > template<typename T> class A {}; > >> > template<> class A<double> {}; > >> > A<int> a; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > + > >> > classTemplateSpecializationDecl(hasAnyTemplateArgument( > >> > refersToType(asString("int")))) > >> > matches the specialization A<int> > >> > + > >> > +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > </pre></td></tr> > >> > > >> > > >> > @@ -5347,16 +5411,22 @@ Usable as: Matcher<<a href="http://cl > >> > > >> > > >> > <tr><td>Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html > ">TemplateSpecializationType</a>></td><td > >> > class="name" onclick="toggle('hasTemplateArgument1')"><a > >> > > name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned > >> > N, Matcher<<a > >> > href=" > http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html > ">TemplateArgument</a>> > >> > InnerMatcher</td></tr> > >> > -<tr><td colspan="4" class="doc" > id="hasTemplateArgument1"><pre>Matches > >> > classTemplateSpecializations where the n'th TemplateArgument > >> > -matches the given InnerMatcher. > >> > +<tr><td colspan="4" class="doc" > id="hasTemplateArgument1"><pre>Matches > >> > classTemplateSpecializations, templateSpecializationType and > >> > +functionDecl where the n'th TemplateArgument matches the given > >> > InnerMatcher. > >> > > >> > Given > >> > template<typename T, typename U> class A {}; > >> > A<bool, int> b; > >> > A<int, bool> c; > >> > + > >> > + template<typenmae T> f() {}; > >> > + void func() { f<int>(); }; > >> > classTemplateSpecializationDecl(hasTemplateArgument( > >> > 1, refersToType(asString("int")))) > >> > matches the specialization A<bool, int> > >> > + > >> > +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) > >> > + matches the specialization f<int> > >> > </pre></td></tr> > >> > > >> > > >> > > >> > Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h > >> > URL: > >> > > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=277142&r1=277141&r2=277142&view=diff > >> > > >> > > ============================================================================== > >> > --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) > >> > +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Fri Jul 29 > >> > 08:57:27 2016 > >> > @@ -556,22 +556,32 @@ AST_MATCHER(Decl, isImplicit) { > >> > return Node.isImplicit(); > >> > } > >> > > >> > -/// \brief Matches classTemplateSpecializations that have at least > one > >> > -/// TemplateArgument matching the given InnerMatcher. > >> > +/// \brief Matches classTemplateSpecializations, > >> > templateSpecializationType and > >> > +/// functionDecl that have at least one TemplateArgument matching the > >> > given > >> > +/// InnerMatcher. > >> > /// > >> > /// Given > >> > /// \code > >> > /// template<typename T> class A {}; > >> > /// template<> class A<double> {}; > >> > /// A<int> a; > >> > +/// > >> > +/// template<typenmae T> f() {}; > >> > >> typenmae? > >> > >> > +/// void func() { f<int>(); }; > >> > +/// \endcode > >> > +/// > >> > /// \endcode > >> > /// classTemplateSpecializationDecl(hasAnyTemplateArgument( > >> > /// refersToType(asString("int")))) > >> > /// matches the specialization \c A<int> > >> > +/// > >> > +/// > functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) > >> > +/// matches the specialization \c f<int> > >> > AST_POLYMORPHIC_MATCHER_P( > >> > hasAnyTemplateArgument, > >> > AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl, > >> > - TemplateSpecializationType), > >> > + TemplateSpecializationType, > >> > + FunctionDecl), > >> > internal::Matcher<TemplateArgument>, InnerMatcher) { > >> > ArrayRef<TemplateArgument> List = > >> > internal::getTemplateSpecializationArgs(Node); > >> > @@ -698,22 +708,29 @@ AST_MATCHER_P(QualType, ignoringParens, > >> > return InnerMatcher.matches(Node.IgnoreParens(), Finder, Builder); > >> > } > >> > > >> > -/// \brief Matches classTemplateSpecializations where the n'th > >> > TemplateArgument > >> > -/// matches the given InnerMatcher. > >> > +/// \brief Matches classTemplateSpecializations, > >> > templateSpecializationType and > >> > +/// functionDecl where the n'th TemplateArgument matches the given > >> > InnerMatcher. > >> > /// > >> > /// Given > >> > /// \code > >> > /// template<typename T, typename U> class A {}; > >> > /// A<bool, int> b; > >> > /// A<int, bool> c; > >> > +/// > >> > +/// template<typenmae T> f() {}; > >> > +/// void func() { f<int>(); }; > >> > /// \endcode > >> > /// classTemplateSpecializationDecl(hasTemplateArgument( > >> > /// 1, refersToType(asString("int")))) > >> > /// matches the specialization \c A<bool, int> > >> > +/// > >> > +/// functionDecl(hasTemplateArgument(0, > refersToType(asString("int")))) > >> > +/// matches the specialization \c f<int> > >> > AST_POLYMORPHIC_MATCHER_P2( > >> > hasTemplateArgument, > >> > AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl, > >> > - TemplateSpecializationType), > >> > + TemplateSpecializationType, > >> > + FunctionDecl), > >> > unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) { > >> > ArrayRef<TemplateArgument> List = > >> > internal::getTemplateSpecializationArgs(Node); > >> > > >> > Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h > >> > URL: > >> > > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=277142&r1=277141&r2=277142&view=diff > >> > > >> > > ============================================================================== > >> > --- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h > (original) > >> > +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Fri Jul > 29 > >> > 08:57:27 2016 > >> > @@ -1638,6 +1638,13 @@ getTemplateSpecializationArgs(const Temp > >> > return llvm::makeArrayRef(T.getArgs(), T.getNumArgs()); > >> > } > >> > > >> > +inline ArrayRef<TemplateArgument> > >> > +getTemplateSpecializationArgs(const FunctionDecl &FD) { > >> > + if (const auto* TemplateArgs = FD.getTemplateSpecializationArgs()) > >> > + return TemplateArgs->asArray(); > >> > + return ArrayRef<TemplateArgument>(); > >> > +} > >> > + > >> > struct NotEqualsBoundNodePredicate { > >> > bool operator()(const internal::BoundNodesMap &Nodes) const { > >> > return Nodes.getNode(ID) != Node; > >> > > >> > Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp > >> > URL: > >> > > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=277142&r1=277141&r2=277142&view=diff > >> > > >> > > ============================================================================== > >> > --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp > >> > (original) > >> > +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Fri > Jul > >> > 29 08:57:27 2016 > >> > @@ -594,6 +594,14 @@ TEST(Matcher, MatchesSpecificArgument) { > >> > "A<int, bool> a;", > >> > templateSpecializationType(hasTemplateArgument( > >> > 1, refersToType(asString("int")))))); > >> > + > >> > + EXPECT_TRUE(matches( > >> > + "template<typename T> void f() {};" > >> > + "void func() { f<int>(); }", > >> > + functionDecl(hasTemplateArgument(0, > >> > refersToType(asString("int")))))); > >> > + EXPECT_TRUE(notMatches( > >> > + "template<typename T> void f() {};", > >> > + functionDecl(hasTemplateArgument(0, > >> > refersToType(asString("int")))))); > >> > } > >> > > >> > TEST(TemplateArgument, Matches) { > >> > @@ -603,6 +611,11 @@ TEST(TemplateArgument, Matches) { > >> > EXPECT_TRUE(matches( > >> > "template<typename T> struct C {}; C<int> c;", > >> > > >> > > templateSpecializationType(hasAnyTemplateArgument(templateArgument())))); > >> > + > >> > + EXPECT_TRUE(matches( > >> > + "template<typename T> void f() {};" > >> > + "void func() { f<int>(); }", > >> > + functionDecl(hasAnyTemplateArgument(templateArgument())))); > >> > } > >> > > >> > TEST(RefersToIntegralType, Matches) { > >> > > >> > > >> > _______________________________________________ > >> > cfe-commits mailing list > >> > cfe-commits@lists.llvm.org > >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits