[PATCH] D111242: Add `TypeLoc`-related matchers.

James King via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 7 15:04:32 PDT 2021


jcking1034 added inline comments.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:6406-6414
+/// Matches reference `TypeLoc`s.
+///
+/// Given
+/// \code
+///   int x = 3;
+///   int& xx = x;
+/// \endcode
----------------
jcking1034 wrote:
> aaron.ballman wrote:
> > I'd appreciate more documentation on whether this is expected to match both lvalue and rvalue references. I suppose there's a secondary question of whether this matches member functions too:
> > ```
> > struct S {
> >   void func() &; // Can this match this as a reference type loc?
> > };
> > ```
> I've added an example to clarify that this matches both lvalue and rvalue references. Having some trouble addressing your second point, but will keep playing around with it.
After looking into it, it seems that this matcher will not match ref-qualified member functions. Essentially, this node isn't represented in a way that allows for it to be matched by `referenceTypeLoc`.

For a more detailed explaination: In this example, we are able to use `cxxMethodDecl` to match `void func() &`. If we wished to match the `Type` of the member function, we could use `cxxMethodDecl(hasType(functionProtoType().bind("t")))`, and from the `FunctionProtoType` node you could determine if the function is ref-qualified through a call to `getRefQualifier` (https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html). It's not possible to match using `cxxMethodDecl(hasType(referenceType().bind("t")))`. So it seems that the type of the member function is not a reference type, but instead a `FunctionProtoType` from which you'd programmatically have to determine if it's a reference type. In the realm of `TypeLoc`s, there is no `TypeLoc` that corresponds to the `FunctionProtoType` node, and so the best you could do may be something like `cxxMethodDecl(hasTypeLoc(loc(functionProtoType().bind("t"))))` and programmatically analyzing the bound node. For reference, please see https://godbolt.org/z/qxsEb6a5Y.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111242/new/

https://reviews.llvm.org/D111242



More information about the cfe-commits mailing list