2015-11-20 15:57:46 +08:00
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
< html >
< head >
< title > AST Matcher Reference< / title >
< link type = "text/css" rel = "stylesheet" href = "../menu.css" / >
< link type = "text/css" rel = "stylesheet" href = "../content.css" / >
< style type = "text/css" >
td {
padding: .33em;
}
td.doc {
display: none;
border-bottom: 1px solid black;
}
td.name:hover {
color: blue;
cursor: pointer;
}
2020-11-18 00:50:53 +08:00
span.mono { font-family: monospace; }
.traverse_compare, .traverse_compare td, .traverse_compare th {
border: 1px solid black;
border-collapse: collapse;
}
2015-11-20 15:57:46 +08:00
< / style >
< script type = "text/javascript" >
function toggle(id) {
if (!id) return;
row = document.getElementById(id);
if (row.style.display != 'table-cell')
row.style.display = 'table-cell';
else
row.style.display = 'none';
}
< / script >
< / head >
< body onLoad = "toggle(location.hash.substring(1, location.hash.length - 6))" >
<!-- #include virtual="../menu.html.incl" -->
< div id = "content" >
< h1 > AST Matcher Reference< / h1 >
< p > This document shows all currently implemented matchers. The matchers are grouped
by category and node type they match. You can click on matcher names to show the
matcher's source documentation.< / p >
< p > There are three different basic categories of matchers:
< ul >
< li > < a href = "#decl-matchers" > Node Matchers:< / a > Matchers that match a specific type of AST node.< / li >
< li > < a href = "#narrowing-matchers" > Narrowing Matchers:< / a > Matchers that match attributes on AST nodes.< / li >
< li > < a href = "#traversal-matchers" > Traversal Matchers:< / a > Matchers that allow traversal between AST nodes.< / li >
< / ul >
< / p >
< p > Within each category the matchers are ordered by node type they match on.
2020-01-27 11:37:43 +08:00
Note that if a matcher can match multiple node types, it will appear
2015-11-20 15:57:46 +08:00
multiple times. This means that by searching for Matcher< Stmt> you can
find all matchers that can be used to match on Stmt nodes.< / p >
< p > The exception to that rule are matchers that can match on any node. Those
are marked with a * and are listed in the beginning of each category.< / p >
< p > Note that the categorization of matchers is a great help when you combine
them into matcher expressions. You will usually want to form matcher expressions
that read like english sentences by alternating between node matchers and
narrowing or traversal matchers, like this:
< pre >
recordDecl(hasDescendant(
ifStmt(hasTrueExpression(
expr(hasDescendant(
ifStmt()))))))
< / pre >
< / p >
2020-11-18 00:50:53 +08:00
<!-- ======================================================================= -->
< h2 id = "traverse-mode" > Traverse Mode< / h2 >
<!-- ======================================================================= -->
< p > The default mode of operation of AST Matchers visits all nodes in the AST,
even if they are not spelled in the source. This is
< span class = "mono" > AsIs< / span > mode. This mode requires writing AST matchers
that explicitly traverse or ignore implicit nodes, such as parentheses
surrounding an expression or expressions with cleanups. These implicit
nodes are not always obvious from the syntax of the source code, and so this
mode requires careful consideration and testing to get the desired behavior
from an AST matcher.
< / p >
2020-12-02 09:02:46 +08:00
< p > In addition, because template instantiations are matched in the default mode,
2020-11-18 00:50:53 +08:00
transformations can be accidentally made to template declarations. Finally,
because implicit nodes are matched by default, transformations can be made on
entirely incorrect places in the code.< / p >
< p > For these reasons, it is possible to ignore AST nodes which are not spelled
in the source using the < span class = "mono" > IgnoreUnlessSpelledInSource< / span >
mode. This is likely to be far less error-prone for users who are not already
very familiar with where implicit nodes appear in the AST. It is also likely
to be less error-prone for experienced AST users, as difficult cases do not
need to be encountered and matcher expressions adjusted for these cases.< / p >
< p > In clang-query, the mode can be changed with
< pre >
set traversal IgnoreUnlessSpelledInSource
< / pre >
< / p >
This affects both matchers and AST dump output in results.
< p > When using the C++ API such as in clang-tidy checks, the
< span class = "mono" > traverse()< / span > matcher is used to set the mode:
< pre >
Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
returnStmt(hasReturnArgument(integerLiteral(equals(0))))
), this);
< / pre >
< / p >
< p > The following table compares the < span class = "mono" > AsIs< / span > mode with
the < span class = "mono" > IgnoreUnlessSpelledInSource< / span > mode:< / p >
< table class = "traverse_compare" >
< tr >
< th > < / th >
< th > < span class = "mono" > AsIs< / span > < / th >
< th > < span class = "mono" > IgnoreUnlessSpelledInSource< / span > < / th >
< / tr >
< tr >
< td > AST dump of < span class = "mono" > func1< / span > :
< pre >
struct B {
B(int);
};
B func1() { return 42; }
< / pre >
< / td >
< td >
C++98 dialect:
< pre >
FunctionDecl
`-CompoundStmt
`-ReturnStmt
`-ExprWithCleanups
`-CXXConstructExpr
`-MaterializeTemporaryExpr
`-ImplicitCastExpr
`-ImplicitCastExpr
`-CXXConstructExpr
`-IntegerLiteral 'int' 42
< / pre >
C++11, C++14 dialect:
< pre >
FunctionDecl
`-CompoundStmt
`-ReturnStmt
`-ExprWithCleanups
`-CXXConstructExpr
`-MaterializeTemporaryExpr
`-ImplicitCastExpr
`-CXXConstructExpr
`-IntegerLiteral 'int' 42
< / pre >
C++17, C++20 dialect:
< pre >
FunctionDecl
`-CompoundStmt
`-ReturnStmt
`-ImplicitCastExpr
`-CXXConstructExpr
`-IntegerLiteral 'int' 42
< / pre >
< / td >
< td >
All dialects:
< pre >
FunctionDecl
`-CompoundStmt
`-ReturnStmt
`-IntegerLiteral 'int' 42
< / pre > < / td >
< / tr >
< tr >
< td > Matcher for returned < span class = "mono" > 42< / span > :
< pre >
struct B {
B(int);
};
B func1() { return 42; }
< / pre >
< / td >
< td >
All dialects:
< pre >
returnStmt(hasReturnValue(
ignoringImplicit(
ignoringElidableConstructorCall(
ignoringImplicit(
cxxConstructExpr(hasArgument(0,
ignoringImplicit(
integerLiteral().bind("returnVal")
)
))
)
)
)
))
< / pre > < / td >
< td >
All dialects:
< pre >
returnStmt(hasReturnValue(
integerLiteral().bind("returnVal")
))
< / pre > < / td >
< / tr >
< tr >
< td > Match result for
< pre > implicitCastExpr()< / pre >
given:
< pre >
struct B {
B(int);
};
B func1() { return 42; }
< / pre >
< / td >
< td >
Match found.< / td >
< td >
No match.< / td >
< / tr >
< tr >
< td > Match result for:
< pre >
cxxConstructorDecl(
isCopyConstructor()
).bind("prepend_explicit")
< / pre >
given:
< pre >
struct Other {};
struct Copyable {
Other m_o;
Copyable();
};
< / pre >
< / td >
< td >
Match found. Insertion produces incorrect output:
< pre >
struct Other {};
struct explicit Copyable {
Other m_o;
Copyable();
};
< / pre >
< / td >
< td >
No match found. Incorrect replacement not possible.
< / td >
< / tr >
< tr >
< td > Replacement of < span class = "mono" > begin()< / span >
with < span class = "mono" > cbegin()< / span > :
< pre >
cxxMemberCallExpr(
on(ConstContainerExpr),
callee(cxxMethodDecl(hasName("begin")))
).bind("replace_with_cbegin")
< / pre >
given:
< pre >
void foo() {
const Container c;
c.begin();
for (auto i : c) {
}
}
< / pre >
< / td >
< td >
2 matches found. Replacement produces incorrect output:
< pre >
void foo() {
const Container c;
c.cbegin();
for (auto i :.cbegin() c) {
}
}
< / pre >
< / td >
< td >
1 match found. Replacement produces correct output:
< pre >
void foo() {
const Container c;
c.cbegin();
for (auto i : c) {
}
}
< / pre >
< / td >
< / tr >
< tr >
< td > Replacement of < span class = "mono" > int< / span > member
with < span class = "mono" > safe_int< / span > :
< pre >
fieldDecl(
hasType(asString("int"))
).bind("use_safe_int")
< / pre >
given:
< pre >
struct S {
int m_i;
};
template < typename T> struct TemplStruct {
TemplStruct() {}
~TemplStruct() {}
private:
T m_t;
};
void instantiate() { TemplStruct< int> ti; }
< / pre >
< / td >
< td >
2 matches found. Replacement produces incorrect output:
< pre >
struct S {
safe_int m_i;
};
template < typename T> struct TemplStruct {
TemplStruct() {}
~TemplStruct() {}
private:
safe_int m_t;
};
void instantiate() { TemplStruct< int> ti; }
< / pre >
< / td >
< td >
1 match found. Replacement produces correct output:
< pre >
struct S {
safe_int m_i;
};
template < typename T> struct TemplStruct {
TemplStruct() {}
~TemplStruct() {}
private:
T m_t;
};
void instantiate() { TemplStruct< int> ti; }
< / pre >
< / td >
< / tr >
< tr >
< td > Add prefix to member initializer
< pre >
cxxCtorInitializer(
forField(fieldDecl())
).bind("add_prefix")
< / pre >
given:
< pre >
struct Simple {};
struct Record {
Record() : i(42) {}
private:
int i;
Simple s;
};
< / pre >
< / td >
< td >
2 matches found. Replacement produces incorrect output:
< pre >
struct Simple {};
struct Record {
m_Record() : m_i(42) {}
private:
int i;
Simple s;
};
< / pre >
< / td >
< td >
1 match found. Replacement produces correct output:
< pre >
struct Simple {};
struct Record {
Record() : m_i(42) {}
private:
int i;
Simple s;
};
< / pre >
< / td >
< / tr >
< tr >
< td > Ignored default arguments
< pre >
callExpr(
callee(functionDecl(
hasName("hasDefaultArg")
)),
argumentCountIs(1)
).bind("add_prefix")
< / pre >
given:
< pre >
void hasDefaultArg(int i, int j = 0) {}
void callDefaultArg() { hasDefaultArg(42); }
< / pre >
< / td >
< td >
No match.
< / td >
< td >
1 match found.
< / td >
< / tr >
< tr >
< td > Lambda fields
< pre >
fieldDecl(
hasType(asString("int"))
).bind("make_safe")
< / pre >
given:
< pre >
struct S {
int m_i;
};
void func() {
int a = 0;
int c = 0;
auto l = [a, b = c](int d) { int e = d; };
l(43);
}
< / pre >
< / td >
< td >
2 matches found. Replacement produces incorrect output:
< pre >
struct S {
safe_int m_i;
};
void func() {
int a = 0;
int c = 0;
auto l = [safe_a, safe_b = c](int d) { int e = d; };
l(43);
}
< / pre >
< / td >
< td >
1 match found. Replacement produces correct output:
< pre >
struct S {
safe_int m_i;
};
void func() {
int a = 0;
int c = 0;
auto l = [a, b = c](int d) { int e = d; };
l(43);
}
< / pre >
< / td >
< / tr >
2021-01-06 07:04:31 +08:00
< tr >
< td > Rewritten binary operators
< pre >
binaryOperator(
hasOperatorName("< "),
2021-02-14 21:45:56 +08:00
hasRHS(hasDescendant(integerLiteral(equals(0))))
2021-01-06 07:04:31 +08:00
)
< / pre >
given:
< pre >
#include < compare>
class HasSpaceship {
public:
int x;
bool operator==(const HasSpaceship& ) const = default;
std::strong_ordering operator< =>(const HasSpaceship& ) const = default;
};
bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
return a < b ;
}
< / pre >
< / td >
< td >
1 match found.
2021-02-14 21:45:56 +08:00
< pre >
return a < b ;
^~~~~
< / pre >
2021-01-06 07:04:31 +08:00
< / td >
< td >
No match found.
< / td >
< / tr >
2020-11-18 00:50:53 +08:00
< / table >
2015-11-20 15:57:46 +08:00
<!-- ======================================================================= -->
< h2 id = "decl-matchers" > Node Matchers< / h2 >
<!-- ======================================================================= -->
< p > Node matchers are at the core of matcher expressions - they specify the type
of node that is expected. Every match expression starts with a node matcher,
which can then be further refined with a narrowing or traversal matcher. All
traversal matchers take node matchers as their arguments.< / p >
< p > For convenience, all node matchers take an arbitrary number of arguments
and implicitly act as allOf matchers.< / p >
< p > Node matchers are the only matchers that support the bind("id") call to
bind the matched node to the given string, to be later retrieved from the
match callback.< / p >
< p > It is important to remember that the arguments to node matchers are
predicates on the same node, just with additional information about the type.
This is often useful to make matcher expression more readable by inlining bind
calls into redundant node matchers inside another node matcher:
< pre >
// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
// the same node.
recordDecl(decl().bind("id"), hasName("::MyClass"))
< / pre >
< / p >
< table >
< tr style = "text-align:left" > < th > Return type< / th > < th > Name< / th > < th > Parameters< / th > < / tr >
2015-11-20 15:46:19 +08:00
<!-- START_DECL_MATCHERS -->
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('cxxBaseSpecifier0')" > < a name = "cxxBaseSpecifier0Anchor" > cxxBaseSpecifier< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "cxxBaseSpecifier0" > < pre > Matches class bases.
Examples matches public virtual B.
class B {};
class C : public virtual B {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('cxxCtorInitializer0')" > < a name = "cxxCtorInitializer0Anchor" > cxxCtorInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxCtorInitializer0" > < pre > Matches constructor initializers.
Examples matches i(42).
class C {
C() : i(42) {}
int i;
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('accessSpecDecl0')" > < a name = "accessSpecDecl0Anchor" > accessSpecDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html" > AccessSpecDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "accessSpecDecl0" > < pre > Matches C++ access specifier declarations.
Given
class C {
public:
int a;
};
accessSpecDecl()
matches 'public:'
< / pre > < / td > < / tr >
2021-01-30 23:50:44 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('bindingDecl0')" > < a name = "bindingDecl0Anchor" > bindingDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html" > BindingDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "bindingDecl0" > < pre > Matches binding declarations
Example matches foo and bar
(matcher = bindingDecl()
auto [foo, bar] = std::make_pair{42, 42};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('blockDecl0')" > < a name = "blockDecl0Anchor" > blockDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html" > BlockDecl< / a > > ...< / td > < / tr >
2018-05-17 06:47:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "blockDecl0" > < pre > Matches block declarations.
Example matches the declaration of the nameless block printing an input
integer.
myFunc(^(int p) {
printf("%d", p);
})
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('classTemplateDecl0')" > < a name = "classTemplateDecl0Anchor" > classTemplateDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html" > ClassTemplateDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "classTemplateDecl0" > < pre > Matches C++ class template declarations.
Example matches Z
template< class T> class Z {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('classTemplatePartialSpecializationDecl0')" > < a name = "classTemplatePartialSpecializationDecl0Anchor" > classTemplatePartialSpecializationDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html" > ClassTemplatePartialSpecializationDecl< / a > > ...< / td > < / tr >
2018-10-09 16:24:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "classTemplatePartialSpecializationDecl0" > < pre > Matches C++ class template partial specializations.
Given
template< class T1, class T2, int I>
class A {};
template< class T, int I>
class A< T, T*, I> {};
template< >
class A< int, int, 1> {};
classTemplatePartialSpecializationDecl()
matches the specialization A< T,T*,I> but not A< int,int,1>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('classTemplateSpecializationDecl0')" > < a name = "classTemplateSpecializationDecl0Anchor" > classTemplateSpecializationDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html" > ClassTemplateSpecializationDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "classTemplateSpecializationDecl0" > < pre > Matches C++ class template specializations.
Given
template< typename T> class A {};
template< > class A< double> {};
A< int> a;
classTemplateSpecializationDecl()
matches the specializations A< int> and A< double>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxConstructorDecl0')" > < a name = "cxxConstructorDecl0Anchor" > cxxConstructorDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxConstructorDecl0" > < pre > Matches C++ constructor declarations.
Example matches Foo::Foo() and Foo::Foo(int)
class Foo {
public:
Foo();
Foo(int);
int DoSomething();
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxConversionDecl0')" > < a name = "cxxConversionDecl0Anchor" > cxxConversionDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html" > CXXConversionDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxConversionDecl0" > < pre > Matches conversion operator declarations.
Example matches the operator.
class X { operator int() const; };
< / pre > < / td > < / tr >
2019-06-20 02:27:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxDeductionGuideDecl0')" > < a name = "cxxDeductionGuideDecl0Anchor" > cxxDeductionGuideDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html" > CXXDeductionGuideDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "cxxDeductionGuideDecl0" > < pre > Matches user-defined and implicitly generated deduction guide.
Example matches the deduction guide.
template< typename T>
class X { X(int) };
X(int) -> X< int> ;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxDestructorDecl0')" > < a name = "cxxDestructorDecl0Anchor" > cxxDestructorDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html" > CXXDestructorDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxDestructorDecl0" > < pre > Matches explicit C++ destructor declarations.
Example matches Foo::~Foo()
class Foo {
public:
virtual ~Foo();
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxMethodDecl0')" > < a name = "cxxMethodDecl0Anchor" > cxxMethodDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxMethodDecl0" > < pre > Matches method declarations.
Example matches y
class X { void y(); };
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('cxxRecordDecl0')" > < a name = "cxxRecordDecl0Anchor" > cxxRecordDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxRecordDecl0" > < pre > Matches C++ class declarations.
Example matches X, Z
class X;
template< class T> class Z {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('decl0')" > < a name = "decl0Anchor" > decl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "decl0" > < pre > Matches declarations.
Examples matches X, C, and the friend declaration inside C;
void X();
class C {
friend X;
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('declaratorDecl0')" > < a name = "declaratorDecl0Anchor" > declaratorDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html" > DeclaratorDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "declaratorDecl0" > < pre > Matches declarator declarations (field, variable, function
and non-type template parameter declarations).
Given
class X { int y; };
declaratorDecl()
matches int y.
< / pre > < / td > < / tr >
2021-02-02 05:23:14 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('decompositionDecl0')" > < a name = "decompositionDecl0Anchor" > decompositionDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html" > DecompositionDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "decompositionDecl0" > < pre > Matches decomposition-declarations.
Examples matches the declaration node with foo and bar, but not
number.
(matcher = declStmt(has(decompositionDecl())))
int number = 42;
auto [foo, bar] = std::make_pair{42, 42};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('enumConstantDecl0')" > < a name = "enumConstantDecl0Anchor" > enumConstantDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html" > EnumConstantDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "enumConstantDecl0" > < pre > Matches enum constants.
Example matches A, B, C
enum X {
A, B, C
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('enumDecl0')" > < a name = "enumDecl0Anchor" > enumDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html" > EnumDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "enumDecl0" > < pre > Matches enum declarations.
Example matches X
enum X {
A, B, C
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('fieldDecl0')" > < a name = "fieldDecl0Anchor" > fieldDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html" > FieldDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "fieldDecl0" > < pre > Matches field declarations.
Given
class X { int m; };
fieldDecl()
matches 'm'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('friendDecl0')" > < a name = "friendDecl0Anchor" > friendDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "friendDecl0" > < pre > Matches friend declarations.
Given
class X { friend void foo(); };
friendDecl()
matches 'friend void foo()'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('functionDecl0')" > < a name = "functionDecl0Anchor" > functionDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "functionDecl0" > < pre > Matches function declarations.
Example matches f
void f();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('functionTemplateDecl0')" > < a name = "functionTemplateDecl0Anchor" > functionTemplateDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html" > FunctionTemplateDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "functionTemplateDecl0" > < pre > Matches C++ function template declarations.
Example matches f
template< class T> void f(T t) {}
< / pre > < / td > < / tr >
2018-12-17 20:42:12 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('indirectFieldDecl0')" > < a name = "indirectFieldDecl0Anchor" > indirectFieldDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html" > IndirectFieldDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "indirectFieldDecl0" > < pre > Matches indirect field declarations.
Given
struct X { struct { int a; }; };
indirectFieldDecl()
matches 'a'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('labelDecl0')" > < a name = "labelDecl0Anchor" > labelDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html" > LabelDecl< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "labelDecl0" > < pre > Matches a declaration of label.
Given
goto FOO;
FOO: bar();
labelDecl()
matches 'FOO:'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('linkageSpecDecl0')" > < a name = "linkageSpecDecl0Anchor" > linkageSpecDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html" > LinkageSpecDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "linkageSpecDecl0" > < pre > Matches a declaration of a linkage specification.
Given
extern "C" {}
linkageSpecDecl()
matches "extern "C" {}"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('namedDecl0')" > < a name = "namedDecl0Anchor" > namedDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "namedDecl0" > < pre > Matches a declaration of anything that could have a name.
Example matches X, S, the anonymous union type, i, and U;
typedef int X;
struct S {
union {
int i;
} U;
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('namespaceAliasDecl0')" > < a name = "namespaceAliasDecl0Anchor" > namespaceAliasDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html" > NamespaceAliasDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "namespaceAliasDecl0" > < pre > Matches a declaration of a namespace alias.
Given
namespace test {}
namespace alias = ::test;
namespaceAliasDecl()
matches "namespace alias" but not "namespace test"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('namespaceDecl0')" > < a name = "namespaceDecl0Anchor" > namespaceDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html" > NamespaceDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "namespaceDecl0" > < pre > Matches a declaration of a namespace.
Given
namespace {}
namespace test {}
namespaceDecl()
matches "namespace {}" and "namespace test {}"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('nonTypeTemplateParmDecl0')" > < a name = "nonTypeTemplateParmDecl0Anchor" > nonTypeTemplateParmDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html" > NonTypeTemplateParmDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "nonTypeTemplateParmDecl0" > < pre > Matches non-type template parameter declarations.
Given
template < typename T, int N> struct C {};
nonTypeTemplateParmDecl()
matches 'N', but not 'T'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcCategoryDecl0')" > < a name = "objcCategoryDecl0Anchor" > objcCategoryDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html" > ObjCCategoryDecl< / a > > ...< / td > < / tr >
2017-03-16 04:14:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcCategoryDecl0" > < pre > Matches Objective-C category declarations.
Example matches Foo (Additions)
@interface Foo (Additions)
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcCategoryImplDecl0')" > < a name = "objcCategoryImplDecl0Anchor" > objcCategoryImplDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html" > ObjCCategoryImplDecl< / a > > ...< / td > < / tr >
2017-10-26 23:53:37 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcCategoryImplDecl0" > < pre > Matches Objective-C category definitions.
Example matches Foo (Additions)
@implementation Foo (Additions)
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcImplementationDecl0')" > < a name = "objcImplementationDecl0Anchor" > objcImplementationDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html" > ObjCImplementationDecl< / a > > ...< / td > < / tr >
2017-09-11 05:00:15 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcImplementationDecl0" > < pre > Matches Objective-C implementation declarations.
Example matches Foo
@implementation Foo
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcInterfaceDecl0')" > < a name = "objcInterfaceDecl0Anchor" > objcInterfaceDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcInterfaceDecl0" > < pre > Matches Objective-C interface declarations.
Example matches Foo
@interface Foo
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcIvarDecl0')" > < a name = "objcIvarDecl0Anchor" > objcIvarDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html" > ObjCIvarDecl< / a > > ...< / td > < / tr >
2017-03-16 04:14:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcIvarDecl0" > < pre > Matches Objective-C instance variable declarations.
Example matches _enabled
@implementation Foo {
BOOL _enabled;
}
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcMethodDecl0')" > < a name = "objcMethodDecl0Anchor" > objcMethodDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > ...< / td > < / tr >
2017-03-16 04:14:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcMethodDecl0" > < pre > Matches Objective-C method declarations.
Example matches both declaration and definition of -[Foo method]
@interface Foo
- (void)method;
@end
@implementation Foo
- (void)method {}
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcPropertyDecl0')" > < a name = "objcPropertyDecl0Anchor" > objcPropertyDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html" > ObjCPropertyDecl< / a > > ...< / td > < / tr >
2017-03-16 04:14:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcPropertyDecl0" > < pre > Matches Objective-C property declarations.
Example matches enabled
@interface Foo
@property BOOL enabled;
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('objcProtocolDecl0')" > < a name = "objcProtocolDecl0Anchor" > objcProtocolDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html" > ObjCProtocolDecl< / a > > ...< / td > < / tr >
2017-03-16 04:14:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcProtocolDecl0" > < pre > Matches Objective-C protocol declarations.
Example matches FooDelegate
@protocol FooDelegate
@end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('parmVarDecl0')" > < a name = "parmVarDecl0Anchor" > parmVarDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "parmVarDecl0" > < pre > Matches parameter variable declarations.
Given
void f(int x);
parmVarDecl()
matches int x.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('recordDecl0')" > < a name = "recordDecl0Anchor" > recordDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html" > RecordDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "recordDecl0" > < pre > Matches class, struct, and union declarations.
Example matches X, Z, U, and S
class X;
template< class T> class Z {};
struct S {};
union U {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('staticAssertDecl0')" > < a name = "staticAssertDecl0Anchor" > staticAssertDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html" > StaticAssertDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "staticAssertDecl0" > < pre > Matches a C++ static_assert declaration.
Example:
staticAssertExpr()
matches
static_assert(sizeof(S) == sizeof(int))
in
struct S {
int x;
};
static_assert(sizeof(S) == sizeof(int));
< / pre > < / td > < / tr >
2020-01-29 20:57:27 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('tagDecl0')" > < a name = "tagDecl0Anchor" > tagDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "tagDecl0" > < pre > Matches tag declarations.
Example matches X, Z, U, S, E
class X;
template< class T> class Z {};
struct S {};
union U {};
enum E {
A, B, C
};
< / pre > < / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('templateTemplateParmDecl0')" > < a name = "templateTemplateParmDecl0Anchor" > templateTemplateParmDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html" > TemplateTemplateParmDecl< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "templateTemplateParmDecl0" > < pre > Matches template template parameter declarations.
Given
template < template < typename> class Z, int N> struct C {};
templateTypeParmDecl()
matches 'Z', but not 'N'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('templateTypeParmDecl0')" > < a name = "templateTypeParmDecl0Anchor" > templateTypeParmDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html" > TemplateTypeParmDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateTypeParmDecl0" > < pre > Matches template type parameter declarations.
Given
template < typename T, int N> struct C {};
templateTypeParmDecl()
matches 'T', but not 'N'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('translationUnitDecl0')" > < a name = "translationUnitDecl0Anchor" > translationUnitDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html" > TranslationUnitDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "translationUnitDecl0" > < pre > Matches the top declaration context.
Given
int X;
namespace NS {
int Y;
2018-12-12 03:30:49 +08:00
} // namespace NS
2015-11-20 15:46:19 +08:00
decl(hasDeclContext(translationUnitDecl()))
matches "int X", but not "int Y".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('typeAliasDecl0')" > < a name = "typeAliasDecl0Anchor" > typeAliasDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html" > TypeAliasDecl< / a > > ...< / td > < / tr >
2016-04-15 00:05:45 +08:00
< tr > < td colspan = "4" class = "doc" id = "typeAliasDecl0" > < pre > Matches type alias declarations.
Given
typedef int X;
2016-05-05 04:45:00 +08:00
using Y = int;
2016-04-15 00:05:45 +08:00
typeAliasDecl()
matches "using Y = int", but not "typedef int X"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('typeAliasTemplateDecl0')" > < a name = "typeAliasTemplateDecl0Anchor" > typeAliasTemplateDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html" > TypeAliasTemplateDecl< / a > > ...< / td > < / tr >
2017-03-28 20:56:47 +08:00
< tr > < td colspan = "4" class = "doc" id = "typeAliasTemplateDecl0" > < pre > Matches type alias template declarations.
typeAliasTemplateDecl() matches
template < typename T>
using Y = X< T> ;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('typedefDecl0')" > < a name = "typedefDecl0Anchor" > typedefDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html" > TypedefDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "typedefDecl0" > < pre > Matches typedef declarations.
Given
typedef int X;
2016-05-05 04:45:00 +08:00
using Y = int;
2015-11-20 15:46:19 +08:00
typedefDecl()
2016-04-15 00:05:45 +08:00
matches "typedef int X", but not "using Y = int"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('typedefNameDecl0')" > < a name = "typedefNameDecl0Anchor" > typedefNameDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html" > TypedefNameDecl< / a > > ...< / td > < / tr >
2016-04-15 00:05:45 +08:00
< tr > < td colspan = "4" class = "doc" id = "typedefNameDecl0" > < pre > Matches typedef name declarations.
Given
typedef int X;
2016-05-05 04:45:00 +08:00
using Y = int;
2016-04-15 00:05:45 +08:00
typedefNameDecl()
matches "typedef int X" and "using Y = int"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('unresolvedUsingTypenameDecl0')" > < a name = "unresolvedUsingTypenameDecl0Anchor" > unresolvedUsingTypenameDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html" > UnresolvedUsingTypenameDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "unresolvedUsingTypenameDecl0" > < pre > Matches unresolved using value declarations that involve the
typename.
Given
template < typename T>
struct Base { typedef T Foo; };
template< typename T>
struct S : private Base< T> {
using typename Base< T> ::Foo;
};
unresolvedUsingTypenameDecl()
matches using Base< T> ::Foo < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('unresolvedUsingValueDecl0')" > < a name = "unresolvedUsingValueDecl0Anchor" > unresolvedUsingValueDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html" > UnresolvedUsingValueDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "unresolvedUsingValueDecl0" > < pre > Matches unresolved using value declarations.
Given
template< typename X>
class C : private X {
using X::x;
};
unresolvedUsingValueDecl()
matches using X::x < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('usingDecl0')" > < a name = "usingDecl0Anchor" > usingDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html" > UsingDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "usingDecl0" > < pre > Matches using declarations.
Given
namespace X { int x; }
using X::x;
usingDecl()
matches using X::x < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('usingDirectiveDecl0')" > < a name = "usingDirectiveDecl0Anchor" > usingDirectiveDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html" > UsingDirectiveDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "usingDirectiveDecl0" > < pre > Matches using namespace declarations.
Given
namespace X { int x; }
using namespace X;
usingDirectiveDecl()
matches using namespace X < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('valueDecl0')" > < a name = "valueDecl0Anchor" > valueDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "valueDecl0" > < pre > Matches any value declaration.
Example matches A, B, C and F
enum X { A, B, C };
void F();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('varDecl0')" > < a name = "varDecl0Anchor" > varDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "varDecl0" > < pre > Matches variable declarations.
Note: this does not match declarations of member variables, which are
"field" declarations in Clang parlance.
Example matches a
int a;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > < / td > < td class = "name" onclick = "toggle('nestedNameSpecifierLoc0')" > < a name = "nestedNameSpecifierLoc0Anchor" > nestedNameSpecifierLoc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "nestedNameSpecifierLoc0" > < pre > Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('nestedNameSpecifier0')" > < a name = "nestedNameSpecifier0Anchor" > nestedNameSpecifier< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "nestedNameSpecifier0" > < pre > Matches nested name specifiers.
Given
namespace ns {
struct A { static void f(); };
void A::f() {}
void g() { A::f(); }
}
ns::A a;
nestedNameSpecifier()
matches "ns::" and both "A::"
< / pre > < / td > < / tr >
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html" > OMPClause< / a > > < / td > < td class = "name" onclick = "toggle('ompDefaultClause0')" > < a name = "ompDefaultClause0Anchor" > ompDefaultClause< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html" > OMPDefaultClause< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "ompDefaultClause0" > < pre > Matches OpenMP ``default`` clause.
Given
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
2020-07-13 11:19:40 +08:00
#pragma omp parallel default(firstprivate)
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
#pragma omp parallel
2020-08-10 08:37:18 +08:00
``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
``default(firstprivate)``
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('qualType0')" > < a name = "qualType0Anchor" > qualType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "qualType0" > < pre > Matches QualTypes in the clang AST.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('addrLabelExpr0')" > < a name = "addrLabelExpr0Anchor" > addrLabelExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "addrLabelExpr0" > < pre > Matches address of label statements (GNU extension).
Given
FOO: bar();
void *ptr = & & FOO;
goto *bar;
addrLabelExpr()
matches '& & FOO'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('arraySubscriptExpr0')" > < a name = "arraySubscriptExpr0Anchor" > arraySubscriptExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html" > ArraySubscriptExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "arraySubscriptExpr0" > < pre > Matches array subscript expressions.
Given
int i = a[1];
arraySubscriptExpr()
matches "a[1]"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('asmStmt0')" > < a name = "asmStmt0Anchor" > asmStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html" > AsmStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "asmStmt0" > < pre > Matches asm statements.
int i = 100;
__asm("mov al, 2");
asmStmt()
matches '__asm("mov al, 2")'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('atomicExpr0')" > < a name = "atomicExpr0Anchor" > atomicExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html" > AtomicExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "atomicExpr0" > < pre > Matches atomic builtins.
Example matches __atomic_load_n(ptr, 1)
void foo() { int *ptr; __atomic_load_n(ptr, 1); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('autoreleasePoolStmt0')" > < a name = "autoreleasePoolStmt0Anchor" > autoreleasePoolStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html" > ObjCAutoreleasePoolStmt< / a > > ...< / td > < / tr >
2018-07-07 05:36:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "autoreleasePoolStmt0" > < pre > Matches an Objective-C autorelease pool statement.
Given
@autoreleasepool {
int x = 0;
}
autoreleasePoolStmt(stmt()) matches the declaration of "x"
inside the autorelease pool.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('binaryConditionalOperator0')" > < a name = "binaryConditionalOperator0Anchor" > binaryConditionalOperator< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html" > BinaryConditionalOperator< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "binaryConditionalOperator0" > < pre > Matches binary conditional operator expressions (GNU extension).
Example matches a ?: b
(a ?: b) + 42;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('binaryOperator0')" > < a name = "binaryOperator0Anchor" > binaryOperator< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "binaryOperator0" > < pre > Matches binary operator expressions.
Example matches a || b
!(a || b)
2021-01-05 09:33:13 +08:00
See also the binaryOperation() matcher for more-general matching.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-12-13 11:35:10 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('blockExpr0')" > < a name = "blockExpr0Anchor" > blockExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html" > BlockExpr< / a > > ...< / td > < / tr >
2019-01-07 22:14:36 +08:00
< tr > < td colspan = "4" class = "doc" id = "blockExpr0" > < pre > Matches a reference to a block.
2018-12-13 11:35:10 +08:00
Example: matches "^{}":
void f() { ^{}(); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('breakStmt0')" > < a name = "breakStmt0Anchor" > breakStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html" > BreakStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "breakStmt0" > < pre > Matches break statements.
Given
while (true) { break; }
breakStmt()
matches 'break'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cStyleCastExpr0')" > < a name = "cStyleCastExpr0Anchor" > cStyleCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html" > CStyleCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cStyleCastExpr0" > < pre > Matches a C-style cast expression.
2016-11-12 06:34:53 +08:00
Example: Matches (int) 2.2f in
2015-11-20 15:46:19 +08:00
int i = (int) 2.2f;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('callExpr0')" > < a name = "callExpr0Anchor" > callExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "callExpr0" > < pre > Matches call expressions.
Example matches x.y() and y()
X x;
x.y();
y();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('caseStmt0')" > < a name = "caseStmt0Anchor" > caseStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html" > CaseStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "caseStmt0" > < pre > Matches case statements inside switch statements.
Given
switch(a) { case 42: break; default: break; }
caseStmt()
2018-01-23 06:34:15 +08:00
matches 'case 42:'.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('castExpr0')" > < a name = "castExpr0Anchor" > castExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html" > CastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "castExpr0" > < pre > Matches any cast nodes of Clang's AST.
Example: castExpr() matches each of the following:
(int) 3;
const_cast< Expr *> (SubExpr);
char c = 0;
but does not match
int i = (0);
int k = 0;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('characterLiteral0')" > < a name = "characterLiteral0Anchor" > characterLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "characterLiteral0" > < pre > Matches character literals (also matches wchar_t).
Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
though.
Example matches 'a', L'a'
2016-05-12 12:20:04 +08:00
char ch = 'a';
wchar_t chw = L'a';
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
[ASTImporter] Add support for importing ChooseExpr AST nodes.
Summary:
This allows ASTs to be merged when they contain ChooseExpr (the GNU
__builtin_choose_expr construction). This is needed, for example, for
cross-CTU analysis of C code that makes use of __builtin_choose_expr.
The node is already supported in the AST, but it didn't have a matcher
in ASTMatchers. So, this change adds the matcher and adds support to
ASTImporter.
This was originally reviewed and approved in
https://reviews.llvm.org/D58292 and submitted as r354832. It was
reverted in r354839 due to failures on the Windows CI builds.
This version fixes the test failures on Windows, which were caused by
differences in template expansion between versions of clang on different
OSes. The version of clang built with MSVC and running on Windows never
expands the template in the C++ test in ImportExpr.ImportChooseExpr in
clang/unittests/AST/ASTImporter.cpp, but the version on Linux does for
the empty arguments and -fms-compatibility.
So, this version of the patch drops the C++ test for
__builtin_choose_expr, since that version was written to catch
regressions of the logic for isConditionTrue() in the AST import code
for ChooseExpr, and those regressions are also caught by
ASTImporterOptionSpecificTestBase.ImportChooseExpr, which does work on
Windows.
Reviewers: shafik, a_sidorin, martong, aaron.ballman, rnk, a.sidorin
Subscribers: cfe-commits, jdoerfert, rnkovacs, aaron.ballman
Tags: #clang
Differential Revision: https://reviews.llvm.org/D58663
llvm-svn: 354916
2019-02-27 03:26:41 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('chooseExpr0')" > < a name = "chooseExpr0Anchor" > chooseExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html" > ChooseExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "chooseExpr0" > < pre > Matches GNU __builtin_choose_expr.
< / pre > < / td > < / tr >
2021-03-22 10:25:32 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('coawaitExpr0')" > < a name = "coawaitExpr0Anchor" > coawaitExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html" > CoawaitExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "coawaitExpr0" > < pre > Matches co_await expressions.
Given
co_await 1;
coawaitExpr()
matches 'co_await 1'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('compoundLiteralExpr0')" > < a name = "compoundLiteralExpr0Anchor" > compoundLiteralExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html" > CompoundLiteralExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "compoundLiteralExpr0" > < pre > Matches compound (i.e. non-scalar) literals
Example match: {1}, (1, 2)
2016-05-12 12:20:04 +08:00
int array[4] = {1};
vector int myvec = (vector int)(1, 2);
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('compoundStmt0')" > < a name = "compoundStmt0Anchor" > compoundStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html" > CompoundStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "compoundStmt0" > < pre > Matches compound statements.
2018-01-23 06:34:15 +08:00
Example matches '{}' and '{{}}' in 'for (;;) {{}}'
2015-11-20 15:46:19 +08:00
for (;;) {{}}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('conditionalOperator0')" > < a name = "conditionalOperator0Anchor" > conditionalOperator< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html" > ConditionalOperator< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "conditionalOperator0" > < pre > Matches conditional operator expressions.
Example matches a ? b : c
(a ? b : c) + 42
< / pre > < / td > < / tr >
2018-11-22 18:44:36 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('constantExpr0')" > < a name = "constantExpr0Anchor" > constantExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html" > ConstantExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "constantExpr0" > < pre > Matches a constant expression wrapper.
Example matches the constant in the case statement:
(matcher = constantExpr())
switch (a) {
case 37: break;
}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('continueStmt0')" > < a name = "continueStmt0Anchor" > continueStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html" > ContinueStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "continueStmt0" > < pre > Matches continue statements.
Given
while (true) { continue; }
continueStmt()
matches 'continue'
< / pre > < / td > < / tr >
2021-03-22 10:25:32 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('coreturnStmt0')" > < a name = "coreturnStmt0Anchor" > coreturnStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html" > CoreturnStmt< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "coreturnStmt0" > < pre > Matches co_return statements.
Given
while (true) { co_return; }
coreturnStmt()
matches 'co_return'
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('coyieldExpr0')" > < a name = "coyieldExpr0Anchor" > coyieldExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html" > CoyieldExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "coyieldExpr0" > < pre > Matches co_yield expressions.
Given
co_yield 1;
coyieldExpr()
matches 'co_yield 1'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cudaKernelCallExpr0')" > < a name = "cudaKernelCallExpr0Anchor" > cudaKernelCallExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html" > CUDAKernelCallExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cudaKernelCallExpr0" > < pre > Matches CUDA kernel call expression.
Example matches,
kernel< < < i,j> > > ();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxBindTemporaryExpr0')" > < a name = "cxxBindTemporaryExpr0Anchor" > cxxBindTemporaryExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html" > CXXBindTemporaryExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxBindTemporaryExpr0" > < pre > Matches nodes where temporaries are created.
Example matches FunctionTakesString(GetStringByValue())
(matcher = cxxBindTemporaryExpr())
FunctionTakesString(GetStringByValue());
FunctionTakesStringByPointer(GetStringPointer());
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxBoolLiteral0')" > < a name = "cxxBoolLiteral0Anchor" > cxxBoolLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxBoolLiteral0" > < pre > Matches bool literals.
Example matches true
true
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxCatchStmt0')" > < a name = "cxxCatchStmt0Anchor" > cxxCatchStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html" > CXXCatchStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxCatchStmt0" > < pre > Matches catch statements.
try {} catch(int i) {}
cxxCatchStmt()
matches 'catch(int i)'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxConstCastExpr0')" > < a name = "cxxConstCastExpr0Anchor" > cxxConstCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html" > CXXConstCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxConstCastExpr0" > < pre > Matches a const_cast expression.
Example: Matches const_cast< int*> (& r) in
int n = 42;
const int & r(n);
int* p = const_cast< int*> (& r);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxConstructExpr0')" > < a name = "cxxConstructExpr0Anchor" > cxxConstructExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxConstructExpr0" > < pre > Matches constructor call expressions (including implicit ones).
Example matches string(ptr, n) and ptr within arguments of f
(matcher = cxxConstructExpr())
void f(const string & a, const string & b);
char *ptr;
int n;
f(string(ptr, n), ptr);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxDefaultArgExpr0')" > < a name = "cxxDefaultArgExpr0Anchor" > cxxDefaultArgExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html" > CXXDefaultArgExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxDefaultArgExpr0" > < pre > Matches the value of a default argument at the call site.
Example matches the CXXDefaultArgExpr placeholder inserted for the
default value of the second parameter in the call expression f(42)
(matcher = cxxDefaultArgExpr())
void f(int x, int y = 0);
f(42);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxDeleteExpr0')" > < a name = "cxxDeleteExpr0Anchor" > cxxDeleteExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html" > CXXDeleteExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxDeleteExpr0" > < pre > Matches delete expressions.
Given
delete X;
cxxDeleteExpr()
matches 'delete X'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxDependentScopeMemberExpr0')" > < a name = "cxxDependentScopeMemberExpr0Anchor" > cxxDependentScopeMemberExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html" > CXXDependentScopeMemberExpr< / a > > ...< / td > < / tr >
2018-08-13 01:34:36 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxDependentScopeMemberExpr0" > < pre > Matches member expressions where the actual member referenced could not be
resolved because the base expression or the member name was dependent.
Given
template < class T> void f() { T t; t.g(); }
cxxDependentScopeMemberExpr()
matches t.g
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxDynamicCastExpr0')" > < a name = "cxxDynamicCastExpr0Anchor" > cxxDynamicCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html" > CXXDynamicCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxDynamicCastExpr0" > < pre > Matches a dynamic_cast expression.
Example:
cxxDynamicCastExpr()
matches
dynamic_cast< D*> (& b);
in
struct B { virtual ~B() {} }; struct D : B {};
B b;
D* p = dynamic_cast< D*> (& b);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxForRangeStmt0')" > < a name = "cxxForRangeStmt0Anchor" > cxxForRangeStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html" > CXXForRangeStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxForRangeStmt0" > < pre > Matches range-based for statements.
cxxForRangeStmt() matches 'for (auto a : i)'
int i[] = {1, 2, 3}; for (auto a : i);
for(int j = 0; j < 5; ++j);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxFunctionalCastExpr0')" > < a name = "cxxFunctionalCastExpr0Anchor" > cxxFunctionalCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html" > CXXFunctionalCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxFunctionalCastExpr0" > < pre > Matches functional cast expressions
Example: Matches Foo(bar);
Foo f = bar;
Foo g = (Foo) bar;
Foo h = Foo(bar);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxMemberCallExpr0')" > < a name = "cxxMemberCallExpr0Anchor" > cxxMemberCallExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html" > CXXMemberCallExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxMemberCallExpr0" > < pre > Matches member call expressions.
Example matches x.y()
X x;
x.y();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxNewExpr0')" > < a name = "cxxNewExpr0Anchor" > cxxNewExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxNewExpr0" > < pre > Matches new expressions.
Given
new X;
cxxNewExpr()
matches 'new X'.
< / pre > < / td > < / tr >
2020-01-28 21:12:08 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxNoexceptExpr0')" > < a name = "cxxNoexceptExpr0Anchor" > cxxNoexceptExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html" > CXXNoexceptExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "cxxNoexceptExpr0" > < pre > Matches noexcept expressions.
Given
bool a() noexcept;
bool b() noexcept(true);
bool c() noexcept(false);
bool d() noexcept(noexcept(a()));
bool e = noexcept(b()) || noexcept(c());
cxxNoexceptExpr()
matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
doesn't match the noexcept specifier in the declarations a, b, c or d.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxNullPtrLiteralExpr0')" > < a name = "cxxNullPtrLiteralExpr0Anchor" > cxxNullPtrLiteralExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html" > CXXNullPtrLiteralExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxNullPtrLiteralExpr0" > < pre > Matches nullptr literal.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxOperatorCallExpr0')" > < a name = "cxxOperatorCallExpr0Anchor" > cxxOperatorCallExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxOperatorCallExpr0" > < pre > Matches overloaded operator calls.
Note that if an operator isn't overloaded, it won't match. Instead, use
binaryOperator matcher.
Currently it does not match operators such as new delete.
FIXME: figure out why these do not match?
Example matches both operator< < ((o < < b), c) and operator< < (o, b)
(matcher = cxxOperatorCallExpr())
ostream & operator< < (ostream & out, int i) { };
ostream & o; int b = 1, c = 1;
o < < b < < c;
2021-01-05 09:33:13 +08:00
See also the binaryOperation() matcher for more-general matching of binary
uses of this AST node.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxReinterpretCastExpr0')" > < a name = "cxxReinterpretCastExpr0Anchor" > cxxReinterpretCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html" > CXXReinterpretCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxReinterpretCastExpr0" > < pre > Matches a reinterpret_cast expression.
Either the source expression or the destination type can be matched
using has(), but hasDestinationType() is more specific and can be
more readable.
Example matches reinterpret_cast< char*> (& p) in
void* p = reinterpret_cast< char*> (& p);
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxRewrittenBinaryOperator0')" > < a name = "cxxRewrittenBinaryOperator0Anchor" > cxxRewrittenBinaryOperator< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "cxxRewrittenBinaryOperator0" > < pre > Matches rewritten binary operators
Example matches use of "< ":
#include < compare>
struct HasSpaceshipMem {
int a;
constexpr auto operator< => (const HasSpaceshipMem& ) const = default;
};
void compare() {
HasSpaceshipMem hs1, hs2;
if (hs1 < hs2)
return;
}
See also the binaryOperation() matcher for more-general matching
of this AST node.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxStaticCastExpr0')" > < a name = "cxxStaticCastExpr0Anchor" > cxxStaticCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html" > CXXStaticCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxStaticCastExpr0" > < pre > Matches a C++ static_cast expression.
2016-01-21 23:18:25 +08:00
See also: hasDestinationType
See also: reinterpretCast
2015-11-20 15:46:19 +08:00
Example:
cxxStaticCastExpr()
matches
static_cast< long> (8)
in
long eight(static_cast< long> (8));
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxStdInitializerListExpr0')" > < a name = "cxxStdInitializerListExpr0Anchor" > cxxStdInitializerListExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html" > CXXStdInitializerListExpr< / a > > ...< / td > < / tr >
2017-05-06 05:01:12 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxStdInitializerListExpr0" > < pre > Matches C++ initializer list expressions.
Given
std::vector< int> a({ 1, 2, 3 });
std::vector< int> b = { 4, 5 };
int c[] = { 6, 7 };
std::pair< int, int> d = { 8, 9 };
cxxStdInitializerListExpr()
matches "{ 1, 2, 3 }" and "{ 4, 5 }"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxTemporaryObjectExpr0')" > < a name = "cxxTemporaryObjectExpr0Anchor" > cxxTemporaryObjectExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html" > CXXTemporaryObjectExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxTemporaryObjectExpr0" > < pre > Matches functional cast expressions having N != 1 arguments
Example: Matches Foo(bar, bar)
Foo h = Foo(bar, bar);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxThisExpr0')" > < a name = "cxxThisExpr0Anchor" > cxxThisExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html" > CXXThisExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxThisExpr0" > < pre > Matches implicit and explicit this expressions.
Example matches the implicit this expression in "return i".
(matcher = cxxThisExpr())
struct foo {
int i;
int f() { return i; }
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxThrowExpr0')" > < a name = "cxxThrowExpr0Anchor" > cxxThrowExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html" > CXXThrowExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxThrowExpr0" > < pre > Matches throw expressions.
try { throw 5; } catch(int i) {}
cxxThrowExpr()
matches 'throw 5'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxTryStmt0')" > < a name = "cxxTryStmt0Anchor" > cxxTryStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html" > CXXTryStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxTryStmt0" > < pre > Matches try statements.
try {} catch(int i) {}
cxxTryStmt()
matches 'try {}'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('cxxUnresolvedConstructExpr0')" > < a name = "cxxUnresolvedConstructExpr0Anchor" > cxxUnresolvedConstructExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html" > CXXUnresolvedConstructExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "cxxUnresolvedConstructExpr0" > < pre > Matches unresolved constructor call expressions.
Example matches T(t) in return statement of f
(matcher = cxxUnresolvedConstructExpr())
template < typename T>
void f(const T& t) { return T(t); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('declRefExpr0')" > < a name = "declRefExpr0Anchor" > declRefExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "declRefExpr0" > < pre > Matches expressions that refer to declarations.
Example matches x in if (x)
bool x;
if (x) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('declStmt0')" > < a name = "declStmt0Anchor" > declStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html" > DeclStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "declStmt0" > < pre > Matches declaration statements.
Given
int a;
declStmt()
matches 'int a'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('defaultStmt0')" > < a name = "defaultStmt0Anchor" > defaultStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html" > DefaultStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "defaultStmt0" > < pre > Matches default statements inside switch statements.
Given
switch(a) { case 42: break; default: break; }
defaultStmt()
2018-01-23 06:34:15 +08:00
matches 'default:'.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2021-03-22 10:25:32 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('dependentCoawaitExpr0')" > < a name = "dependentCoawaitExpr0Anchor" > dependentCoawaitExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html" > DependentCoawaitExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "dependentCoawaitExpr0" > < pre > Matches co_await expressions where the type of the promise is dependent
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('designatedInitExpr0')" > < a name = "designatedInitExpr0Anchor" > designatedInitExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html" > DesignatedInitExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "designatedInitExpr0" > < pre > Matches C99 designated initializer expressions [C99 6.7.8].
Example: Matches { [2].y = 1.0, [0].x = 1.0 }
point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('doStmt0')" > < a name = "doStmt0Anchor" > doStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html" > DoStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "doStmt0" > < pre > Matches do statements.
Given
do {} while (true);
doStmt()
matches 'do {} while(true)'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('explicitCastExpr0')" > < a name = "explicitCastExpr0Anchor" > explicitCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html" > ExplicitCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "explicitCastExpr0" > < pre > Matches explicit cast expressions.
Matches any cast expression written in user code, whether it be a
C-style cast, a functional-style cast, or a keyword cast.
Does not match implicit conversions.
Note: the name "explicitCast" is chosen to match Clang's terminology, as
Clang uses the term "cast" to apply to implicit conversions as well as to
actual cast expressions.
2016-01-21 23:18:25 +08:00
See also: hasDestinationType.
2015-11-20 15:46:19 +08:00
Example: matches all five of the casts in
int((int)(reinterpret_cast< int> (static_cast< int> (const_cast< int> (42)))))
but does not match the implicit conversion in
long ell = 42;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('expr0')" > < a name = "expr0Anchor" > expr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "expr0" > < pre > Matches expressions.
Example matches x()
void f() { x(); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('exprWithCleanups0')" > < a name = "exprWithCleanups0Anchor" > exprWithCleanups< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html" > ExprWithCleanups< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "exprWithCleanups0" > < pre > Matches expressions that introduce cleanups to be run at the end
of the sub-expression's evaluation.
Example matches std::string()
const std::string str = std::string();
< / pre > < / td > < / tr >
2020-06-22 17:56:04 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('fixedPointLiteral0')" > < a name = "fixedPointLiteral0Anchor" > fixedPointLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html" > FixedPointLiteral< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "fixedPointLiteral0" > < pre > Matches fixed point literals
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('floatLiteral0')" > < a name = "floatLiteral0Anchor" > floatLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > ...< / td > < / tr >
2018-12-12 03:30:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "floatLiteral0" > < pre > Matches float literals of all sizes / encodings, e.g.
2015-11-20 15:46:19 +08:00
1.0, 1.0f, 1.0L and 1e10.
Does not match implicit conversions such as
float a = 10;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('forStmt0')" > < a name = "forStmt0Anchor" > forStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html" > ForStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "forStmt0" > < pre > Matches for statements.
Example matches 'for (;;) {}'
for (;;) {}
int i[] = {1, 2, 3}; for (auto a : i);
< / pre > < / td > < / tr >
2020-12-02 09:23:55 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('genericSelectionExpr0')" > < a name = "genericSelectionExpr0Anchor" > genericSelectionExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html" > GenericSelectionExpr< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "genericSelectionExpr0" > < pre > Matches C11 _Generic expression.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('gnuNullExpr0')" > < a name = "gnuNullExpr0Anchor" > gnuNullExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html" > GNUNullExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "gnuNullExpr0" > < pre > Matches GNU __null expression.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('gotoStmt0')" > < a name = "gotoStmt0Anchor" > gotoStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html" > GotoStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "gotoStmt0" > < pre > Matches goto statements.
Given
goto FOO;
FOO: bar();
gotoStmt()
matches 'goto FOO'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('ifStmt0')" > < a name = "ifStmt0Anchor" > ifStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ifStmt0" > < pre > Matches if statements.
Example matches 'if (x) {}'
if (x) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('imaginaryLiteral0')" > < a name = "imaginaryLiteral0Anchor" > imaginaryLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html" > ImaginaryLiteral< / a > > ...< / td > < / tr >
2018-10-09 16:24:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "imaginaryLiteral0" > < pre > Matches imaginary literals, which are based on integer and floating
point literals e.g.: 1i, 1.0i
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('implicitCastExpr0')" > < a name = "implicitCastExpr0Anchor" > implicitCastExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html" > ImplicitCastExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "implicitCastExpr0" > < pre > Matches the implicit cast nodes of Clang's AST.
This matches many different places, including function call return value
eliding, as well as any type conversions.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('implicitValueInitExpr0')" > < a name = "implicitValueInitExpr0Anchor" > implicitValueInitExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html" > ImplicitValueInitExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "implicitValueInitExpr0" > < pre > Matches implicit initializers of init list expressions.
Given
point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
implicitValueInitExpr()
matches "[0].y" (implicitly)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('initListExpr0')" > < a name = "initListExpr0Anchor" > initListExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html" > InitListExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "initListExpr0" > < pre > Matches init list expressions.
Given
int a[] = { 1, 2 };
struct B { int x, y; };
B b = { 5, 6 };
initListExpr()
matches "{ 1, 2 }" and "{ 5, 6 }"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('integerLiteral0')" > < a name = "integerLiteral0Anchor" > integerLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > > ...< / td > < / tr >
2018-12-12 03:30:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "integerLiteral0" > < pre > Matches integer literals of all sizes / encodings, e.g.
2015-11-20 15:46:19 +08:00
1, 1L, 0x1 and 1U.
Does not match character-encoded integers such as L'a'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('labelStmt0')" > < a name = "labelStmt0Anchor" > labelStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "labelStmt0" > < pre > Matches label statements.
Given
goto FOO;
FOO: bar();
labelStmt()
matches 'FOO:'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('lambdaExpr0')" > < a name = "lambdaExpr0Anchor" > lambdaExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html" > LambdaExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "lambdaExpr0" > < pre > Matches lambda expressions.
Example matches [& ](){return 5;}
[& ](){return 5;}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('materializeTemporaryExpr0')" > < a name = "materializeTemporaryExpr0Anchor" > materializeTemporaryExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html" > MaterializeTemporaryExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "materializeTemporaryExpr0" > < pre > Matches nodes where temporaries are materialized.
Example: Given
2017-05-06 05:01:12 +08:00
struct T {void func();};
2015-11-20 15:46:19 +08:00
T f();
void g(T);
materializeTemporaryExpr() matches 'f()' in these statements
T u(f());
g(f());
2018-01-23 06:34:15 +08:00
f().func();
2015-11-20 15:46:19 +08:00
but does not match
f();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('memberExpr0')" > < a name = "memberExpr0Anchor" > memberExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "memberExpr0" > < pre > Matches member expressions.
Given
class Y {
void x() { this-> x(); x(); Y y; y.x(); a; this-> b; Y::b; }
int a; static int b;
};
memberExpr()
matches this-> x, x, y.x, a, this-> b
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('nullStmt0')" > < a name = "nullStmt0Anchor" > nullStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html" > NullStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "nullStmt0" > < pre > Matches null statements.
foo();;
nullStmt()
matches the second ';'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcCatchStmt0')" > < a name = "objcCatchStmt0Anchor" > objcCatchStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html" > ObjCAtCatchStmt< / a > > ...< / td > < / tr >
2017-11-12 06:46:15 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcCatchStmt0" > < pre > Matches Objective-C @catch statements.
Example matches @catch
@try {}
@catch (...) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcFinallyStmt0')" > < a name = "objcFinallyStmt0Anchor" > objcFinallyStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html" > ObjCAtFinallyStmt< / a > > ...< / td > < / tr >
2017-11-12 06:46:15 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcFinallyStmt0" > < pre > Matches Objective-C @finally statements.
Example matches @finally
@try {}
@finally {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcIvarRefExpr0')" > < a name = "objcIvarRefExpr0Anchor" > objcIvarRefExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html" > ObjCIvarRefExpr< / a > > ...< / td > < / tr >
2018-07-28 01:26:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcIvarRefExpr0" > < pre > Matches a reference to an ObjCIvar.
Example: matches "a" in "init" method:
@implementation A {
NSString *a;
}
- (void) init {
a = @"hello";
}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcMessageExpr0')" > < a name = "objcMessageExpr0Anchor" > objcMessageExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcMessageExpr0" > < pre > Matches ObjectiveC Message invocation expressions.
The innermost message send invokes the "alloc" class method on the
NSString class, while the outermost message send invokes the
"initWithString" instance method on the object returned from
NSString's "alloc". This matcher should match both message sends.
[[NSString alloc] initWithString:@"Hello"]
< / pre > < / td > < / tr >
2016-01-21 23:18:25 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcThrowStmt0')" > < a name = "objcThrowStmt0Anchor" > objcThrowStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html" > ObjCAtThrowStmt< / a > > ...< / td > < / tr >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcThrowStmt0" > < pre > Matches Objective-C statements.
2017-11-12 06:46:15 +08:00
2018-01-18 00:50:14 +08:00
Example matches @throw obj;
2017-11-12 06:46:15 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('objcTryStmt0')" > < a name = "objcTryStmt0Anchor" > objcTryStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html" > ObjCAtTryStmt< / a > > ...< / td > < / tr >
2017-11-12 06:46:15 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcTryStmt0" > < pre > Matches Objective-C @try statements.
Example matches @try
@try {}
@catch (...) {}
< / pre > < / td > < / tr >
2019-03-21 23:33:10 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('ompExecutableDirective0')" > < a name = "ompExecutableDirective0Anchor" > ompExecutableDirective< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html" > OMPExecutableDirective< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "ompExecutableDirective0" > < pre > Matches any ``#pragma omp`` executable directive.
Given
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp taskyield
``ompExecutableDirective()`` matches ``omp parallel``,
``omp parallel default(none)`` and ``omp taskyield``.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('opaqueValueExpr0')" > < a name = "opaqueValueExpr0Anchor" > opaqueValueExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html" > OpaqueValueExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "opaqueValueExpr0" > < pre > Matches opaque value expressions. They are used as helpers
to reference another expressions and can be met
in BinaryConditionalOperators, for example.
Example matches 'a'
(a ?: c) + 42;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('parenExpr0')" > < a name = "parenExpr0Anchor" > parenExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html" > ParenExpr< / a > > ...< / td > < / tr >
2016-01-21 00:17:39 +08:00
< tr > < td colspan = "4" class = "doc" id = "parenExpr0" > < pre > Matches parentheses used in expressions.
2016-01-21 23:18:25 +08:00
Example matches (foo() + 1)
2016-01-21 00:17:39 +08:00
int foo() { return 1; }
int a = (foo() + 1);
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2016-01-21 23:18:25 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('parenListExpr0')" > < a name = "parenListExpr0Anchor" > parenListExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html" > ParenListExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "parenListExpr0" > < pre > Matches paren list expressions.
ParenListExprs don't have a predefined type and are used for late parsing.
In the final AST, they can be met in template declarations.
Given
template< typename T> class X {
void f() {
X x(*this);
int a = 0, b = 1; int i = (a, b);
}
};
parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
has a predefined type and is a ParenExpr, not a ParenListExpr.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('predefinedExpr0')" > < a name = "predefinedExpr0Anchor" > predefinedExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html" > PredefinedExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "predefinedExpr0" > < pre > Matches predefined identifier expressions [C99 6.4.2.2].
Example: Matches __func__
printf("%s", __func__);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('returnStmt0')" > < a name = "returnStmt0Anchor" > returnStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html" > ReturnStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "returnStmt0" > < pre > Matches return statements.
Given
return 1;
returnStmt()
matches 'return 1'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('stmt0')" > < a name = "stmt0Anchor" > stmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "stmt0" > < pre > Matches statements.
Given
{ ++a; }
stmt()
matches both the compound statement '{ ++a; }' and '++a'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('stmtExpr0')" > < a name = "stmtExpr0Anchor" > stmtExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html" > StmtExpr< / a > > ...< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "stmtExpr0" > < pre > Matches statement expression (GNU extension).
Example match: ({ int X = 4; X; })
int C = ({ int X = 4; X; });
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('stringLiteral0')" > < a name = "stringLiteral0Anchor" > stringLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html" > StringLiteral< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "stringLiteral0" > < pre > Matches string literals (also matches wide string literals).
Example matches "abcd", L"abcd"
2016-05-12 12:20:04 +08:00
char *s = "abcd";
wchar_t *ws = L"abcd";
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('substNonTypeTemplateParmExpr0')" > < a name = "substNonTypeTemplateParmExpr0Anchor" > substNonTypeTemplateParmExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html" > SubstNonTypeTemplateParmExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "substNonTypeTemplateParmExpr0" > < pre > Matches substitutions of non-type template parameters.
Given
template < int N>
struct A { static const int n = N; };
struct B : public A< 42> {};
substNonTypeTemplateParmExpr()
matches "N" in the right-hand side of "static const int n = N;"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('switchCase0')" > < a name = "switchCase0Anchor" > switchCase< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html" > SwitchCase< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "switchCase0" > < pre > Matches case and default statements inside switch statements.
Given
switch(a) { case 42: break; default: break; }
switchCase()
2018-01-23 06:34:15 +08:00
matches 'case 42:' and 'default:'.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('switchStmt0')" > < a name = "switchStmt0Anchor" > switchStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html" > SwitchStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "switchStmt0" > < pre > Matches switch statements.
Given
switch(a) { case 42: break; default: break; }
switchStmt()
matches 'switch(a)'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('unaryExprOrTypeTraitExpr0')" > < a name = "unaryExprOrTypeTraitExpr0Anchor" > unaryExprOrTypeTraitExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" > UnaryExprOrTypeTraitExpr< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "unaryExprOrTypeTraitExpr0" > < pre > Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
Given
Foo x = bar;
int y = sizeof(x) + alignof(x);
unaryExprOrTypeTraitExpr()
matches sizeof(x) and alignof(x)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('unaryOperator0')" > < a name = "unaryOperator0Anchor" > unaryOperator< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html" > UnaryOperator< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "unaryOperator0" > < pre > Matches unary operator expressions.
Example matches !a
!a || b
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('unresolvedLookupExpr0')" > < a name = "unresolvedLookupExpr0Anchor" > unresolvedLookupExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html" > UnresolvedLookupExpr< / a > > ...< / td > < / tr >
2016-05-18 20:53:59 +08:00
< tr > < td colspan = "4" class = "doc" id = "unresolvedLookupExpr0" > < pre > Matches reference to a name that can be looked up during parsing
but could not be resolved to a specific declaration.
Given
template< typename T>
T foo() { T a; return a; }
template< typename T>
void bar() {
foo< T> ();
}
unresolvedLookupExpr()
matches foo< T> () < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('unresolvedMemberExpr0')" > < a name = "unresolvedMemberExpr0Anchor" > unresolvedMemberExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html" > UnresolvedMemberExpr< / a > > ...< / td > < / tr >
2018-08-13 01:34:36 +08:00
< tr > < td colspan = "4" class = "doc" id = "unresolvedMemberExpr0" > < pre > Matches unresolved member expressions.
Given
struct X {
template < class T> void f();
void g();
};
template < class T> void h() { X x; x.f< T> (); x.g(); }
unresolvedMemberExpr()
matches x.f< T>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('userDefinedLiteral0')" > < a name = "userDefinedLiteral0Anchor" > userDefinedLiteral< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html" > UserDefinedLiteral< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "userDefinedLiteral0" > < pre > Matches user defined literal operator call.
Example match: "foo"_suffix
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('whileStmt0')" > < a name = "whileStmt0Anchor" > whileStmt< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html" > WhileStmt< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "whileStmt0" > < pre > Matches while statements.
Given
while (true) {}
whileStmt()
matches 'while (true) {}'.
< / pre > < / td > < / tr >
2020-08-10 08:37:18 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html" > TemplateArgumentLoc< / a > > < / td > < td class = "name" onclick = "toggle('templateArgumentLoc0')" > < a name = "templateArgumentLoc0Anchor" > templateArgumentLoc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html" > TemplateArgumentLoc< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "templateArgumentLoc0" > < pre > Matches template arguments (with location info).
Given
template < typename T> struct C {};
C< int> c;
templateArgumentLoc()
matches 'int' in C< int> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('templateArgument0')" > < a name = "templateArgument0Anchor" > templateArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateArgument0" > < pre > Matches template arguments.
Given
template < typename T> struct C {};
C< int> c;
templateArgument()
matches 'int' in C< int> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html" > TemplateName< / a > > < / td > < td class = "name" onclick = "toggle('templateName0')" > < a name = "templateName0Anchor" > templateName< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html" > TemplateName< / a > > ...< / td > < / tr >
2016-07-29 23:45:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateName0" > < pre > Matches template name.
Given
template < typename T> class X { };
X< int> xi;
templateName()
matches 'X' in X< int> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('typeLoc0')" > < a name = "typeLoc0Anchor" > typeLoc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "typeLoc0" > < pre > Matches TypeLocs in the clang AST.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('arrayType0')" > < a name = "arrayType0Anchor" > arrayType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html" > ArrayType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "arrayType0" > < pre > Matches all kinds of arrays.
Given
int a[] = { 2, 3 };
int b[4];
void f() { int c[a[0]]; }
arrayType()
matches "int a[]", "int b[4]" and "int c[a[0]]";
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('atomicType0')" > < a name = "atomicType0Anchor" > atomicType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html" > AtomicType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "atomicType0" > < pre > Matches atomic types.
Given
_Atomic(int) i;
atomicType()
matches "_Atomic(int) i"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('autoType0')" > < a name = "autoType0Anchor" > autoType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AutoType.html" > AutoType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "autoType0" > < pre > Matches types nodes representing C++11 auto types.
Given:
auto n = 4;
int v[] = { 2, 3 }
for (auto i : v) { }
autoType()
matches "auto n" and "auto i"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('blockPointerType0')" > < a name = "blockPointerType0Anchor" > blockPointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "blockPointerType0" > < pre > Matches block pointer types, i.e. types syntactically represented as
"void (^)(int)".
The pointee is always required to be a FunctionType.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('builtinType0')" > < a name = "builtinType0Anchor" > builtinType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html" > BuiltinType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "builtinType0" > < pre > Matches builtin Types.
Given
struct A {};
A a;
int b;
float c;
bool d;
builtinType()
matches "int b", "float c" and "bool d"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('complexType0')" > < a name = "complexType0Anchor" > complexType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html" > ComplexType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "complexType0" > < pre > Matches C99 complex types.
Given
_Complex float f;
complexType()
matches "_Complex float f"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('constantArrayType0')" > < a name = "constantArrayType0Anchor" > constantArrayType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html" > ConstantArrayType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "constantArrayType0" > < pre > Matches C arrays with a specified constant size.
Given
void() {
int a[2];
int b[] = { 2, 3 };
int c[b[0]];
}
constantArrayType()
matches "int a[2]"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('decayedType0')" > < a name = "decayedType0Anchor" > decayedType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html" > DecayedType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "decayedType0" > < pre > Matches decayed type
Example matches i[] in declaration of f.
(matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
Example matches i[1].
(matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
void f(int i[]) {
i[1] = 0;
}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('decltypeType0')" > < a name = "decltypeType0Anchor" > decltypeType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html" > DecltypeType< / a > > ...< / td > < / tr >
2018-07-26 21:02:05 +08:00
< tr > < td colspan = "4" class = "doc" id = "decltypeType0" > < pre > Matches types nodes representing C++11 decltype(< expr> ) types.
Given:
short i = 1;
int j = 42;
decltype(i + j) result = i + j;
2018-08-13 01:34:36 +08:00
decltypeType()
2018-07-26 21:02:05 +08:00
matches "decltype(i + j)"
< / pre > < / td > < / tr >
2020-02-03 19:10:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('deducedTemplateSpecializationType0')" > < a name = "deducedTemplateSpecializationType0Anchor" > deducedTemplateSpecializationType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html" > DeducedTemplateSpecializationType< / a > > ...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "deducedTemplateSpecializationType0" > < pre > Matches C++17 deduced template specialization types, e.g. deduced class
template types.
Given
template < typename T>
class C { public: C(T); };
C c(123);
deducedTemplateSpecializationType() matches the type in the declaration
of the variable c.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('dependentSizedArrayType0')" > < a name = "dependentSizedArrayType0Anchor" > dependentSizedArrayType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html" > DependentSizedArrayType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "dependentSizedArrayType0" > < pre > Matches C++ arrays whose size is a value-dependent expression.
Given
template< typename T, int Size>
class array {
T data[Size];
};
dependentSizedArrayType
matches "T data[Size]"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('elaboratedType0')" > < a name = "elaboratedType0Anchor" > elaboratedType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html" > ElaboratedType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "elaboratedType0" > < pre > Matches types specified with an elaborated type keyword or with a
qualified name.
Given
namespace N {
namespace M {
class D {};
}
}
class C {};
class C c;
N::M::D d;
elaboratedType() matches the type of the variable declarations of both
c and d.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('enumType0')" > < a name = "enumType0Anchor" > enumType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > ...< / td > < / tr >
2016-06-30 15:50:01 +08:00
< tr > < td colspan = "4" class = "doc" id = "enumType0" > < pre > Matches enum types.
Given
enum C { Green };
2016-07-07 02:25:16 +08:00
enum class S { Red };
2016-06-30 15:50:01 +08:00
C c;
S s;
enumType() matches the type of the variable declarations of both c and
s.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('functionProtoType0')" > < a name = "functionProtoType0Anchor" > functionProtoType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html" > FunctionProtoType< / a > > ...< / td > < / tr >
2016-02-01 22:11:47 +08:00
< tr > < td colspan = "4" class = "doc" id = "functionProtoType0" > < pre > Matches FunctionProtoType nodes.
Given
int (*f)(int);
void g();
functionProtoType()
matches "int (*f)(int)" and the type of "g" in C++ mode.
In C mode, "g" is not matched because it does not contain a prototype.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('functionType0')" > < a name = "functionType0Anchor" > functionType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html" > FunctionType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "functionType0" > < pre > Matches FunctionType nodes.
Given
int (*f)(int);
void g();
functionType()
matches "int (*f)(int)" and the type of "g".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('incompleteArrayType0')" > < a name = "incompleteArrayType0Anchor" > incompleteArrayType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html" > IncompleteArrayType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "incompleteArrayType0" > < pre > Matches C arrays with unspecified size.
Given
int a[] = { 2, 3 };
int b[42];
void f(int c[]) { int d[a[0]]; };
incompleteArrayType()
matches "int a[]" and "int c[]"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('injectedClassNameType0')" > < a name = "injectedClassNameType0Anchor" > injectedClassNameType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "injectedClassNameType0" > < pre > Matches injected class name types.
Example matches S s, but not S< T> s.
(matcher = parmVarDecl(hasType(injectedClassNameType())))
template < typename T> struct S {
void f(S s);
void g(S< T> s);
};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('lValueReferenceType0')" > < a name = "lValueReferenceType0Anchor" > lValueReferenceType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html" > LValueReferenceType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "lValueReferenceType0" > < pre > Matches lvalue reference types.
Given:
int *a;
int & b = *a;
int & & c = 1;
auto & d = b;
auto & & e = c;
auto & & f = 2;
int g = 5;
lValueReferenceType() matches the types of b, d, and e. e is
matched since the type is deduced as int& by reference collapsing rules.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('memberPointerType0')" > < a name = "memberPointerType0Anchor" > memberPointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "memberPointerType0" > < pre > Matches member pointer types.
Given
struct A { int i; }
A::* ptr = A::i;
memberPointerType()
matches "A::* ptr"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('objcObjectPointerType0')" > < a name = "objcObjectPointerType0Anchor" > objcObjectPointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html" > ObjCObjectPointerType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "objcObjectPointerType0" > < pre > Matches an Objective-C object pointer type, which is different from
a pointer type, despite being syntactically similar.
Given
int *a;
@interface Foo
@end
Foo *f;
pointerType()
matches "Foo *f", but does not match "int *a".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('parenType0')" > < a name = "parenType0Anchor" > parenType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParenType.html" > ParenType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "parenType0" > < pre > Matches ParenType nodes.
Given
int (*ptr_to_array)[4];
int *array_of_ptrs[4];
varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
array_of_ptrs.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('pointerType0')" > < a name = "pointerType0Anchor" > pointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointerType0" > < pre > Matches pointer types, but does not match Objective-C object pointer
types.
Given
int *a;
int & b = *a;
int c = 5;
@interface Foo
@end
Foo *f;
pointerType()
matches "int *a", but does not match "Foo *f".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('rValueReferenceType0')" > < a name = "rValueReferenceType0Anchor" > rValueReferenceType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html" > RValueReferenceType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "rValueReferenceType0" > < pre > Matches rvalue reference types.
Given:
int *a;
int & b = *a;
int & & c = 1;
auto & d = b;
auto & & e = c;
auto & & f = 2;
int g = 5;
rValueReferenceType() matches the types of c and f. e is not
matched as it is deduced to int& by reference collapsing rules.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('recordType0')" > < a name = "recordType0Anchor" > recordType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "recordType0" > < pre > Matches record types (e.g. structs, classes).
Given
class C {};
struct S {};
C c;
S s;
recordType() matches the type of the variable declarations of both c
and s.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('referenceType0')" > < a name = "referenceType0Anchor" > referenceType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "referenceType0" > < pre > Matches both lvalue and rvalue reference types.
Given
int *a;
int & b = *a;
int & & c = 1;
auto & d = b;
auto & & e = c;
auto & & f = 2;
int g = 5;
referenceType() matches the types of b, c, d, e, and f.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('substTemplateTypeParmType0')" > < a name = "substTemplateTypeParmType0Anchor" > substTemplateTypeParmType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html" > SubstTemplateTypeParmType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "substTemplateTypeParmType0" > < pre > Matches types that represent the result of substituting a type for a
template type parameter.
Given
template < typename T>
void F(T t) {
int i = 1 + t;
}
substTemplateTypeParmType() matches the type of 't' but not '1'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('tagType0')" > < a name = "tagType0Anchor" > tagType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > ...< / td > < / tr >
2017-08-02 21:04:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "tagType0" > < pre > Matches tag types (record and enum types).
Given
enum E {};
class C {};
E e;
C c;
tagType() matches the type of the variable declarations of both e
and c.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('templateSpecializationType0')" > < a name = "templateSpecializationType0Anchor" > templateSpecializationType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateSpecializationType0" > < pre > Matches template specialization types.
Given
template < typename T>
class C { };
2018-12-12 03:30:49 +08:00
template class C< int> ; // A
C< char> var; // B
2015-11-20 15:46:19 +08:00
templateSpecializationType() matches the type of the explicit
instantiation in A and the type of the variable declaration in B.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('templateTypeParmType0')" > < a name = "templateTypeParmType0Anchor" > templateTypeParmType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateTypeParmType0" > < pre > Matches template type parameter types.
Example matches T, but not int.
(matcher = templateTypeParmType())
template < typename T> void f(int i);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('type0')" > < a name = "type0Anchor" > type< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "type0" > < pre > Matches Types in the clang AST.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('typedefType0')" > < a name = "typedefType0Anchor" > typedefType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "typedefType0" > < pre > Matches typedef types.
Given
typedef int X;
typedefType()
matches "typedef int X"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('unaryTransformType0')" > < a name = "unaryTransformType0Anchor" > unaryTransformType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html" > UnaryTransformType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "unaryTransformType0" > < pre > Matches types nodes representing unary type transformations.
Given:
typedef __underlying_type(T) type;
unaryTransformType()
matches "__underlying_type(T)"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('variableArrayType0')" > < a name = "variableArrayType0Anchor" > variableArrayType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html" > VariableArrayType< / a > > ...< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "variableArrayType0" > < pre > Matches C arrays with a specified size that is not an
integer-constant-expression.
Given
void f() {
int a[] = { 2, 3 }
int b[42];
int c[a[0]];
}
variableArrayType()
matches "int c[a[0]]"
< / pre > < / td > < / tr >
2015-11-20 15:57:46 +08:00
<!-- END_DECL_MATCHERS -->
< / table >
<!-- ======================================================================= -->
< h2 id = "narrowing-matchers" > Narrowing Matchers< / h2 >
<!-- ======================================================================= -->
< p > Narrowing matchers match certain attributes on the current node, thus
narrowing down the set of nodes of the current type to match on.< / p >
< p > There are special logical narrowing matchers (allOf, anyOf, anything and unless)
which allow users to create more powerful match expressions.< / p >
< table >
< tr style = "text-align:left" > < th > Return type< / th > < th > Name< / th > < th > Parameters< / th > < / tr >
2015-11-20 15:46:19 +08:00
<!-- START_NARROWING_MATCHERS -->
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('allOf0')" > < a name = "allOf0Anchor" > allOf< / a > < / td > < td > Matcher< *> , ..., Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "allOf0" > < pre > Matches if all given matchers match.
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('anyOf0')" > < a name = "anyOf0Anchor" > anyOf< / a > < / td > < td > Matcher< *> , ..., Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "anyOf0" > < pre > Matches if any of the given matchers matches.
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('anything0')" > < a name = "anything0Anchor" > anything< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "anything0" > < pre > Matches any node.
Useful when another matcher requires a child matcher, but there's no
additional constraint. This will often be used with an explicit conversion
to an internal::Matcher< > type such as TypeMatcher.
Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
"int* p" and "void f()" in
int* p;
void f();
Usable as: Any Matcher
< / pre > < / td > < / tr >
2021-01-02 07:18:43 +08:00
< tr > < td > < em > unspecified< / em > < / td > < td class = "name" onclick = "toggle('mapAnyOf0')" > < a name = "mapAnyOf0Anchor" > mapAnyOf< / a > < / td > < td > nodeMatcherFunction...< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "mapAnyOf0" > < pre > Matches any of the NodeMatchers with InnerMatchers nested within
Given
if (true);
for (; true; );
with the matcher
mapAnyOf(ifStmt, forStmt).with(
hasCondition(cxxBoolLiteralExpr(equals(true)))
).bind("trueCond")
matches the if and the for. It is equivalent to:
auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
anyOf(
ifStmt(trueCond).bind("trueCond"),
forStmt(trueCond).bind("trueCond")
);
The with() chain-call accepts zero or more matchers which are combined
as-if with allOf() in each of the node matchers.
Usable as: Any Matcher
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('unless0')" > < a name = "unless0Anchor" > unless< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "unless0" > < pre > Matches if the provided matcher does not match.
Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
class X {};
class Y {};
Usable as: Any Matcher
< / pre > < / td > < / tr >
2020-02-25 15:51:07 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOperatorName0')" > < a name = "hasAnyOperatorName0Anchor" > hasAnyOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOperatorName0" > < pre > Matches operator expressions (binary or unary) that have any of the
specified names.
hasAnyOperatorName("+", "-")
Is equivalent to
anyOf(hasOperatorName("+"), hasOperatorName("-"))
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasOperatorName0')" > < a name = "hasOperatorName0Anchor" > hasOperatorName< / a > < / td > < td > std::string Name< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasOperatorName0" > < pre > Matches the operator Name of operator expressions (binary or
unary).
Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
!(a || b)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('isAssignmentOperator0')" > < a name = "isAssignmentOperator0Anchor" > isAssignmentOperator< / a > < / td > < td > < / td > < / tr >
2018-03-27 20:11:46 +08:00
< tr > < td colspan = "4" class = "doc" id = "isAssignmentOperator0" > < pre > Matches all kinds of assignment operators.
Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
if (a == b)
a += b;
2018-05-01 02:12:15 +08:00
Example 2: matches s1 = s2
(matcher = cxxOperatorCallExpr(isAssignmentOperator()))
struct S { S& operator=(const S& ); };
2020-03-07 17:51:43 +08:00
void x() { S s1, s2; s1 = s2; }
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('isComparisonOperator0')" > < a name = "isComparisonOperator0Anchor" > isComparisonOperator< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isComparisonOperator0" > < pre > Matches comparison operators.
Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
if (a == b)
a += b;
Example 2: matches s1 < s2
(matcher = cxxOperatorCallExpr(isComparisonOperator()))
struct S { bool operator< (const S& other); };
void x(S s1, S s2) { bool b1 = s1 < s2; }
2018-03-27 20:11:46 +08:00
< / pre > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('isPrivate1')" > < a name = "isPrivate1Anchor" > isPrivate< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isPrivate1" > < pre > Matches private C++ declarations and C++ base specifers that specify private
inheritance.
Examples:
class C {
public: int a;
protected: int b;
private: int c; // fieldDecl(isPrivate()) matches 'c'
};
struct Base {};
struct Derived1 : private Base {}; // matches 'Base'
class Derived2 : Base {}; // matches 'Base'
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('isProtected1')" > < a name = "isProtected1Anchor" > isProtected< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isProtected1" > < pre > Matches protected C++ declarations and C++ base specifers that specify
protected inheritance.
Examples:
class C {
public: int a;
protected: int b; // fieldDecl(isProtected()) matches 'b'
private: int c;
};
class Base {};
class Derived : protected Base {}; // matches 'Base'
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('isPublic1')" > < a name = "isPublic1Anchor" > isPublic< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isPublic1" > < pre > Matches public C++ declarations and C++ base specifers that specify public
inheritance.
Examples:
class C {
public: int a; // fieldDecl(isPublic()) matches 'a'
protected: int b;
private: int c;
};
class Base {};
class Derived1 : public Base {}; // matches 'Base'
struct Derived2 : Base {}; // matches 'Base'
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('isVirtual1')" > < a name = "isVirtual1Anchor" > isVirtual< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isVirtual1" > < pre > Matches declarations of virtual methods and C++ base specifers that specify
virtual inheritance.
Example:
class A {
public:
virtual void x(); // matches x
};
Example:
class Base {};
class DirectlyDerived : virtual Base {}; // matches Base
class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals5" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > < / td > < td class = "name" onclick = "toggle('equals2')" > < a name = "equals2Anchor" > equals< / a > < / td > < td > const ValueT Value< / td > < / tr >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals2" > < pre > Matches literals that are equal to the given value of type ValueT.
2015-11-20 15:46:19 +08:00
2017-06-09 06:00:58 +08:00
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
2015-11-20 15:46:19 +08:00
2017-07-11 23:45:22 +08:00
Note that you cannot directly match a negative numeric literal because the
minus sign is not part of the literal: It is a unary operator whose operand
is the positive numeric literal. Instead, you must use a unaryOperator()
matcher to match the minus sign:
unaryOperator(hasOperatorName("-"),
hasUnaryOperand(integerLiteral(equals(13))))
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals11" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals8" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isCatchAll0" > < pre > Matches a C++ catch statement that has a catch-all handler.
Given
try {
2018-12-12 03:30:49 +08:00
// ...
2015-11-20 15:46:19 +08:00
} catch (int) {
2018-12-12 03:30:49 +08:00
// ...
2015-11-20 15:46:19 +08:00
} catch (...) {
2018-12-12 03:30:49 +08:00
// ...
2015-11-20 15:46:19 +08:00
}
cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('argumentCountIs1')" > < a name = "argumentCountIs1Anchor" > argumentCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "argumentCountIs1" > < pre > Checks that a call expression or a constructor call expression has
a specific number of arguments (including absent default arguments).
Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
void f(int x, int y);
f(0, 0);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('isListInitialization0')" > < a name = "isListInitialization0Anchor" > isListInitialization< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isListInitialization0" > < pre > Matches a constructor call expression which uses list initialization.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('requiresZeroInitialization0')" > < a name = "requiresZeroInitialization0Anchor" > requiresZeroInitialization< / a > < / td > < td > < / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "requiresZeroInitialization0" > < pre > Matches a constructor call expression which requires
zero initialization.
Given
void foo() {
struct point { double x; double y; };
point pt[2] = { { 1.0, 2.0 } };
}
initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
will match the implicit array filler for pt[1].
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('isCopyConstructor0')" > < a name = "isCopyConstructor0Anchor" > isCopyConstructor< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isCopyConstructor0" > < pre > Matches constructor declarations that are copy constructors.
Given
struct S {
2018-12-12 03:30:49 +08:00
S(); // #1
S(const S & ); // #2
S(S & & ); // #3
2015-11-20 15:46:19 +08:00
};
cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefaultConstructor0')" > < a name = "isDefaultConstructor0Anchor" > isDefaultConstructor< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefaultConstructor0" > < pre > Matches constructor declarations that are default constructors.
Given
struct S {
2018-12-12 03:30:49 +08:00
S(); // #1
S(const S & ); // #2
S(S & & ); // #3
2015-11-20 15:46:19 +08:00
};
cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDelegatingConstructor0')" > < a name = "isDelegatingConstructor0Anchor" > isDelegatingConstructor< / a > < / td > < td > < / td > < / tr >
2016-04-13 19:13:08 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDelegatingConstructor0" > < pre > Matches constructors that delegate to another constructor.
Given
struct S {
2018-12-12 03:30:49 +08:00
S(); // #1
S(int) {} // #2
S(S & & ) : S() {} // #3
2016-04-13 19:13:08 +08:00
};
2018-12-12 03:30:49 +08:00
S::S() : S(0) {} // #4
2016-04-13 19:13:08 +08:00
cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
#1 or #2.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicit0')" > < a name = "isExplicit0Anchor" > isExplicit< / a > < / td > < td > < / td > < / tr >
2019-06-20 02:27:56 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExplicit0" > < pre > Matches constructor, conversion function, and deduction guide declarations
that have an explicit specifier if this explicit specifier is resolved to
true.
2015-11-20 15:46:19 +08:00
Given
2019-06-20 02:27:56 +08:00
template< bool b>
2015-11-20 15:46:19 +08:00
struct S {
2018-12-12 03:30:49 +08:00
S(int); // #1
explicit S(double); // #2
operator int(); // #3
explicit operator bool(); // #4
2019-06-20 02:27:56 +08:00
explicit(false) S(bool) // # 7
explicit(true) S(char) // # 8
explicit(b) S(S) // # 9
2015-11-20 15:46:19 +08:00
};
2019-06-20 02:27:56 +08:00
S(int) -> S< true> // #5
explicit S(double) -> S< false> // #6
cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2015-11-20 15:46:19 +08:00
cxxConversionDecl(isExplicit()) will match #4, but not #3.
2019-06-20 02:27:56 +08:00
cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('isMoveConstructor0')" > < a name = "isMoveConstructor0Anchor" > isMoveConstructor< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isMoveConstructor0" > < pre > Matches constructor declarations that are move constructors.
Given
struct S {
2018-12-12 03:30:49 +08:00
S(); // #1
S(const S & ); // #2
S(S & & ); // #3
2015-11-20 15:46:19 +08:00
};
cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html" > CXXConversionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicit1')" > < a name = "isExplicit1Anchor" > isExplicit< / a > < / td > < td > < / td > < / tr >
2019-06-20 02:27:56 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExplicit1" > < pre > Matches constructor, conversion function, and deduction guide declarations
that have an explicit specifier if this explicit specifier is resolved to
true.
2015-11-20 15:46:19 +08:00
Given
2019-06-20 02:27:56 +08:00
template< bool b>
2015-11-20 15:46:19 +08:00
struct S {
2018-12-12 03:30:49 +08:00
S(int); // #1
explicit S(double); // #2
operator int(); // #3
explicit operator bool(); // #4
2019-06-20 02:27:56 +08:00
explicit(false) S(bool) // # 7
explicit(true) S(char) // # 8
explicit(b) S(S) // # 9
2015-11-20 15:46:19 +08:00
};
2019-06-20 02:27:56 +08:00
S(int) -> S< true> // #5
explicit S(double) -> S< false> // #6
cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2015-11-20 15:46:19 +08:00
cxxConversionDecl(isExplicit()) will match #4, but not #3.
2019-06-20 02:27:56 +08:00
cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('isBaseInitializer0')" > < a name = "isBaseInitializer0Anchor" > isBaseInitializer< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isBaseInitializer0" > < pre > Matches a constructor initializer if it is initializing a base, as
opposed to a member.
Given
struct B {};
struct D : B {
int I;
D(int i) : I(i) {}
};
struct E : B {
E() : B() {}
};
cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
will match E(), but not match D(int).
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('isMemberInitializer0')" > < a name = "isMemberInitializer0Anchor" > isMemberInitializer< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isMemberInitializer0" > < pre > Matches a constructor initializer if it is initializing a member, as
opposed to a base.
Given
struct B {};
struct D : B {
int I;
D(int i) : I(i) {}
};
struct E : B {
E() : B() {}
};
cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
will match D(int), but not match E().
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('isWritten0')" > < a name = "isWritten0Anchor" > isWritten< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isWritten0" > < pre > Matches a constructor initializer if it is explicitly written in
code (as opposed to implicitly added by the compiler).
Given
struct Foo {
Foo() { }
Foo(int) : foo_("A") { }
string foo_;
};
cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
will match Foo(int), but not Foo()
< / pre > < / td > < / tr >
2019-06-20 02:27:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html" > CXXDeductionGuideDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicit2')" > < a name = "isExplicit2Anchor" > isExplicit< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isExplicit2" > < pre > Matches constructor, conversion function, and deduction guide declarations
that have an explicit specifier if this explicit specifier is resolved to
true.
Given
template< bool b>
struct S {
S(int); // #1
explicit S(double); // #2
operator int(); // #3
explicit operator bool(); // #4
explicit(false) S(bool) // # 7
explicit(true) S(char) // # 8
explicit(b) S(S) // # 9
};
S(int) -> S< true> // #5
explicit S(double) -> S< false> // #6
cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
cxxConversionDecl(isExplicit()) will match #4, but not #3.
cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html" > CXXDependentScopeMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasMemberName0')" > < a name = "hasMemberName0Anchor" > hasMemberName< / a > < / td > < td > std::string N< / td > < / tr >
2021-01-02 07:18:43 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasMemberName0" > < pre > Matches template-dependent, but known, member names.
2020-10-31 08:41:16 +08:00
In template declarations, dependent members are not resolved and so can
not be matched to particular named declarations.
This matcher allows to match on the known name of members.
Given
template < typename T>
struct S {
void mem();
};
template < typename T>
void x() {
S< T> s;
s.mem();
}
cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html" > CXXDependentScopeMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('isArrow2')" > < a name = "isArrow2Anchor" > isArrow< / a > < / td > < td > < / td > < / tr >
2018-09-18 02:48:43 +08:00
< tr > < td colspan = "4" class = "doc" id = "isArrow2" > < pre > Matches member expressions that are called with '-> ' as opposed
to '.'.
Member calls on the implicit this pointer match as called with '-> '.
Given
class Y {
void x() { this-> x(); x(); Y y; y.x(); a; this-> b; Y::b; }
template < class T> void f() { this-> f< T> (); f< T> (); }
int a;
static int b;
};
template < class T>
class Z {
void x() { this-> m; }
};
memberExpr(isArrow())
matches this-> x, x, y.x, a, this-> b
cxxDependentScopeMemberExpr(isArrow())
matches this-> m
unresolvedMemberExpr(isArrow())
matches this-> f< T> , f< T>
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html" > CXXDependentScopeMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('memberHasSameNameAsBoundNode0')" > < a name = "memberHasSameNameAsBoundNode0Anchor" > memberHasSameNameAsBoundNode< / a > < / td > < td > std::string BindingID< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "memberHasSameNameAsBoundNode0" > < pre > Matches template-dependent, but known, member names against an already-bound
node
In template declarations, dependent members are not resolved and so can
not be matched to particular named declarations.
This matcher allows to match on the name of already-bound VarDecl, FieldDecl
and CXXMethodDecl nodes.
Given
template < typename T>
struct S {
void mem();
};
template < typename T>
void x() {
S< T> s;
s.mem();
}
The matcher
@code
cxxDependentScopeMemberExpr(
hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
cxxMethodDecl(hasName("mem")).bind("templMem")
)))))
)))),
memberHasSameNameAsBoundNode("templMem")
)
@endcode
first matches and binds the @c mem member of the @c S template, then
compares its name to the usage in @c s.mem() in the @c x function template
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isConst0')" > < a name = "isConst0Anchor" > isConst< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isConst0" > < pre > Matches if the given method declaration is const.
Given
struct A {
void foo() const;
void bar();
};
cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isCopyAssignmentOperator0')" > < a name = "isCopyAssignmentOperator0Anchor" > isCopyAssignmentOperator< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isCopyAssignmentOperator0" > < pre > Matches if the given method declaration declares a copy assignment
operator.
Given
struct A {
A & operator=(const A & );
A & operator=(A & & );
};
cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
the second one.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isFinal1')" > < a name = "isFinal1Anchor" > isFinal< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isFinal1" > < pre > Matches if the given method or class declaration is final.
Given:
class A final {};
struct B {
virtual void f();
};
struct C : B {
void f() final;
};
matches A and C::f, but not B, C, or B::f
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isMoveAssignmentOperator0')" > < a name = "isMoveAssignmentOperator0Anchor" > isMoveAssignmentOperator< / a > < / td > < td > < / td > < / tr >
2016-01-23 06:37:09 +08:00
< tr > < td colspan = "4" class = "doc" id = "isMoveAssignmentOperator0" > < pre > Matches if the given method declaration declares a move assignment
operator.
Given
2016-01-24 01:49:18 +08:00
struct A {
A & operator=(const A & );
A & operator=(A & & );
};
cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
the first one.
2016-01-23 06:37:09 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isOverride0')" > < a name = "isOverride0Anchor" > isOverride< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isOverride0" > < pre > Matches if the given method declaration overrides another method.
Given
class A {
public:
virtual void x();
};
class B : public A {
public:
virtual void x();
};
matches B::x
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isPure0')" > < a name = "isPure0Anchor" > isPure< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isPure0" > < pre > Matches if the given method declaration is pure.
Given
class A {
public:
virtual void x() = 0;
};
matches A::x
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isUserProvided0')" > < a name = "isUserProvided0Anchor" > isUserProvided< / a > < / td > < td > < / td > < / tr >
2016-04-13 19:13:08 +08:00
< tr > < td colspan = "4" class = "doc" id = "isUserProvided0" > < pre > Matches method declarations that are user-provided.
Given
struct S {
2018-12-12 03:30:49 +08:00
S(); // #1
S(const S & ) = default; // #2
S(S & & ) = delete; // #3
2016-04-13 19:13:08 +08:00
};
cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isVirtual0')" > < a name = "isVirtual0Anchor" > isVirtual< / a > < / td > < td > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isVirtual0" > < pre > Matches declarations of virtual methods and C++ base specifers that specify
virtual inheritance.
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Example:
2015-11-20 15:46:19 +08:00
class A {
public:
2020-04-29 11:00:49 +08:00
virtual void x(); // matches x
2015-11-20 15:46:19 +08:00
};
2020-04-29 11:00:49 +08:00
Example:
class Base {};
class DirectlyDerived : virtual Base {}; // matches Base
class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2016-01-23 07:15:00 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isVirtualAsWritten0')" > < a name = "isVirtualAsWritten0Anchor" > isVirtualAsWritten< / a > < / td > < td > < / td > < / tr >
2016-01-22 01:56:24 +08:00
< tr > < td colspan = "4" class = "doc" id = "isVirtualAsWritten0" > < pre > Matches if the given method declaration has an explicit "virtual".
Given
class A {
public:
virtual void x();
};
class B : public A {
public:
void x();
};
matches A::x but not B::x
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2016-01-23 07:15:00 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > < / td > < td class = "name" onclick = "toggle('isArray0')" > < a name = "isArray0Anchor" > isArray< / a > < / td > < td > < / td > < / tr >
2017-11-23 20:43:20 +08:00
< tr > < td colspan = "4" class = "doc" id = "isArray0" > < pre > Matches array new expressions.
Given:
MyClass *p1 = new MyClass[10];
cxxNewExpr(isArray())
matches the expression 'new MyClass[10]'.
< / pre > < / td > < / tr >
2021-01-02 08:01:03 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOperatorName1')" > < a name = "hasAnyOperatorName1Anchor" > hasAnyOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOperatorName1" > < pre > Matches operator expressions (binary or unary) that have any of the
specified names.
hasAnyOperatorName("+", "-")
Is equivalent to
anyOf(hasOperatorName("+"), hasOperatorName("-"))
< / pre > < / td > < / tr >
2020-03-09 19:16:50 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOverloadedOperatorName0')" > < a name = "hasAnyOverloadedOperatorName0Anchor" > hasAnyOverloadedOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOverloadedOperatorName0" > < pre > Matches overloaded operator names.
Matches overloaded operator names specified in strings without the
"operator" prefix: e.g. "< < ".
2020-11-18 20:48:59 +08:00
hasAnyOverloadedOperatorName("+", "-")
2020-03-09 19:16:50 +08:00
Is equivalent to
anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
< / pre > < / td > < / tr >
2021-01-02 08:01:03 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasOperatorName1')" > < a name = "hasOperatorName1Anchor" > hasOperatorName< / a > < / td > < td > std::string Name< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasOperatorName1" > < pre > Matches the operator Name of operator expressions (binary or
unary).
Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
!(a || b)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasOverloadedOperatorName1')" > < a name = "hasOverloadedOperatorName1Anchor" > hasOverloadedOperatorName< / a > < / td > < td > StringRef Name< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasOverloadedOperatorName1" > < pre > Matches overloaded operator names.
Matches overloaded operator names specified in strings without the
"operator" prefix: e.g. "< < ".
Given:
class A { int operator*(); };
const A & operator< < (const A & a, const A & b);
A a;
2018-12-12 03:30:49 +08:00
a < < a; // < -- This matches
2015-11-20 15:46:19 +08:00
cxxOperatorCallExpr(hasOverloadedOperatorName("< < "))) matches the
specified line and
cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
matches the declaration of A.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('isAssignmentOperator1')" > < a name = "isAssignmentOperator1Anchor" > isAssignmentOperator< / a > < / td > < td > < / td > < / tr >
2018-03-27 20:11:46 +08:00
< tr > < td colspan = "4" class = "doc" id = "isAssignmentOperator1" > < pre > Matches all kinds of assignment operators.
Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
if (a == b)
a += b;
2018-05-01 02:12:15 +08:00
Example 2: matches s1 = s2
(matcher = cxxOperatorCallExpr(isAssignmentOperator()))
struct S { S& operator=(const S& ); };
2020-03-07 17:51:43 +08:00
void x() { S s1, s2; s1 = s2; }
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('isComparisonOperator1')" > < a name = "isComparisonOperator1Anchor" > isComparisonOperator< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isComparisonOperator1" > < pre > Matches comparison operators.
Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
if (a == b)
a += b;
Example 2: matches s1 < s2
(matcher = cxxOperatorCallExpr(isComparisonOperator()))
struct S { bool operator< (const S& other); };
void x(S s1, S s2) { bool b1 = s1 < s2; }
2018-03-27 20:11:46 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasDefinition0')" > < a name = "hasDefinition0Anchor" > hasDefinition< / a > < / td > < td > < / td > < / tr >
2017-11-30 05:21:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDefinition0" > < pre > Matches a class declaration that is defined.
Example matches x (matcher = cxxRecordDecl(hasDefinition()))
class x {};
class y;
< / pre > < / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDerivedFrom2')" > < a name = "isDerivedFrom2Anchor" > isDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDerivedFrom2" > < pre > Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDirectlyDerivedFrom2')" > < a name = "isDirectlyDerivedFrom2Anchor" > isDirectlyDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDirectlyDerivedFrom2" > < pre > Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2019-07-25 19:54:13 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicitTemplateSpecialization2')" > < a name = "isExplicitTemplateSpecialization2Anchor" > isExplicitTemplateSpecialization< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExplicitTemplateSpecialization2" > < pre > Matches explicit template specializations of function, class, or
static member variable template instantiations.
Given
template< typename T> void A(T t) { }
template< > void A(int N) { }
functionDecl(isExplicitTemplateSpecialization())
matches the specialization A< int> ().
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isFinal0')" > < a name = "isFinal0Anchor" > isFinal< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isFinal0" > < pre > Matches if the given method or class declaration is final.
Given:
class A final {};
struct B {
virtual void f();
};
struct C : B {
void f() final;
};
matches A and C::f, but not B, C, or B::f
< / pre > < / td > < / tr >
2016-06-28 22:08:56 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isLambda0')" > < a name = "isLambda0Anchor" > isLambda< / a > < / td > < td > < / td > < / tr >
2016-06-28 22:08:56 +08:00
< tr > < td colspan = "4" class = "doc" id = "isLambda0" > < pre > Matches the generated class of lambda expressions.
Given:
auto x = []{};
cxxRecordDecl(isLambda()) matches the implicit class declaration of
decltype(x)
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2019-08-13 07:23:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isSameOrDerivedFrom2')" > < a name = "isSameOrDerivedFrom2Anchor" > isSameOrDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isSameOrDerivedFrom2" > < pre > Overloaded method as shortcut for
2015-11-20 15:46:19 +08:00
isSameOrDerivedFrom(hasName(...)).
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isTemplateInstantiation2')" > < a name = "isTemplateInstantiation2Anchor" > isTemplateInstantiation< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isTemplateInstantiation2" > < pre > Matches template instantiations of function, class, or static
member variable template instantiations.
Given
template < typename T> class X {}; class A {}; X< A> x;
or
template < typename T> class X {}; class A {}; template class X< A> ;
2018-02-21 22:22:42 +08:00
or
template < typename T> class X {}; class A {}; extern template class X< A> ;
2015-11-20 15:46:19 +08:00
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
matches the template instantiation of X< A> .
But given
template < typename T> class X {}; class A {};
template < > class X< A> {}; X< A> x;
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
does not match, as X< A> is an explicit template specialization.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOperatorName2')" > < a name = "hasAnyOperatorName2Anchor" > hasAnyOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOperatorName2" > < pre > Matches operator expressions (binary or unary) that have any of the
specified names.
hasAnyOperatorName("+", "-")
Is equivalent to
anyOf(hasOperatorName("+"), hasOperatorName("-"))
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasOperatorName2')" > < a name = "hasOperatorName2Anchor" > hasOperatorName< / a > < / td > < td > std::string Name< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasOperatorName2" > < pre > Matches the operator Name of operator expressions (binary or
unary).
Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
!(a || b)
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('isAssignmentOperator2')" > < a name = "isAssignmentOperator2Anchor" > isAssignmentOperator< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isAssignmentOperator2" > < pre > Matches all kinds of assignment operators.
Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
if (a == b)
a += b;
Example 2: matches s1 = s2
(matcher = cxxOperatorCallExpr(isAssignmentOperator()))
struct S { S& operator=(const S& ); };
void x() { S s1, s2; s1 = s2; }
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('isComparisonOperator2')" > < a name = "isComparisonOperator2Anchor" > isComparisonOperator< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isComparisonOperator2" > < pre > Matches comparison operators.
Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
if (a == b)
a += b;
Example 2: matches s1 < s2
(matcher = cxxOperatorCallExpr(isComparisonOperator()))
struct S { bool operator< (const S& other); };
void x(S s1, S s2) { bool b1 = s1 < s2; }
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html" > CXXUnresolvedConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('argumentCountIs2')" > < a name = "argumentCountIs2Anchor" > argumentCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "argumentCountIs2" > < pre > Checks that a call expression or a constructor call expression has
a specific number of arguments (including absent default arguments).
Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
void f(int x, int y);
f(0, 0);
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('argumentCountIs0')" > < a name = "argumentCountIs0Anchor" > argumentCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "argumentCountIs0" > < pre > Checks that a call expression or a constructor call expression has
a specific number of arguments (including absent default arguments).
Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
void f(int x, int y);
f(0, 0);
< / pre > < / td > < / tr >
[AST] Store "UsesADL" information in CallExpr.
Summary:
Currently the Clang AST doesn't store information about how the callee of a CallExpr was found. Specifically if it was found using ADL.
However, this information is invaluable to tooling. Consider a tool which renames usages of a function. If the originally CallExpr was formed using ADL, then the tooling may need to additionally qualify the replacement.
Without information about how the callee was found, the tooling is left scratching it's head. Additionally, we want to be able to match ADL calls as quickly as possible, which means avoiding computing the answer on the fly.
This patch changes `CallExpr` to store whether it's callee was found using ADL. It does not change the size of any AST nodes.
Reviewers: fowles, rsmith, klimek, shafik
Reviewed By: rsmith
Subscribers: aaron.ballman, riccibruno, calabrese, titus, cfe-commits
Differential Revision: https://reviews.llvm.org/D55534
llvm-svn: 348977
2018-12-13 05:50:55 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('usesADL0')" > < a name = "usesADL0Anchor" > usesADL< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "usesADL0" > < pre > Matches call expressions which were resolved using ADL.
Example matches y(x) but not y(42) or NS::y(x).
namespace NS {
struct X {};
void y(X);
}
void y(...);
void test() {
NS::X x;
y(x); // Matches
NS::y(x); // Doesn't match
y(42); // Doesn't match
using NS::y;
y(x); // Found by both unqualified lookup and ADL, doesn't match
}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html" > CastExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasCastKind0')" > < a name = "hasCastKind0Anchor" > hasCastKind< / a > < / td > < td > CastKind Kind< / td > < / tr >
2016-05-14 03:36:55 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCastKind0" > < pre > Matches casts that has a given cast kind.
Example: matches the implicit cast around 0
(matcher = castExpr(hasCastKind(CK_NullToPointer)))
int *p = 0;
2019-03-21 23:33:43 +08:00
If the matcher is use from clang-query, CastKind parameter
2020-04-07 03:08:21 +08:00
should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
2016-05-14 03:36:55 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals4" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > < / td > < td class = "name" onclick = "toggle('equals3')" > < a name = "equals3Anchor" > equals< / a > < / td > < td > const ValueT Value< / td > < / tr >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals3" > < pre > Matches literals that are equal to the given value of type ValueT.
2015-11-20 15:46:19 +08:00
2017-06-09 06:00:58 +08:00
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
2015-11-20 15:46:19 +08:00
2017-07-11 23:45:22 +08:00
Note that you cannot directly match a negative numeric literal because the
minus sign is not part of the literal: It is a unary operator whose operand
is the positive numeric literal. Instead, you must use a unaryOperator()
matcher to match the minus sign:
unaryOperator(hasOperatorName("-"),
hasUnaryOperand(integerLiteral(equals(13))))
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals10" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals7" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateArgumentCountIs0" > < pre > Matches if the number of template arguments equals N.
Given
template< typename T> struct C {};
C< int> c;
classTemplateSpecializationDecl(templateArgumentCountIs(1))
matches C< int> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html" > CompoundStmt< / a > > < / td > < td class = "name" onclick = "toggle('statementCountIs0')" > < a name = "statementCountIs0Anchor" > statementCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "statementCountIs0" > < pre > Checks that a compound statement contains a specific number of
child statements.
Example: Given
{ for (;;) {} }
compoundStmt(statementCountIs(0)))
matches '{}'
but does not match the outer compound statement.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html" > ConstantArrayType< / a > > < / td > < td class = "name" onclick = "toggle('hasSize0')" > < a name = "hasSize0Anchor" > hasSize< / a > < / td > < td > unsigned N< / td > < / tr >
2016-05-12 12:20:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSize0" > < pre > Matches nodes that have the specified size.
2015-11-20 15:46:19 +08:00
Given
int a[42];
int b[2 * 21];
int c[41], d[43];
2016-05-12 12:20:04 +08:00
char *s = "abcd";
wchar_t *ws = L"abcd";
char *w = "a";
2015-11-20 15:46:19 +08:00
constantArrayType(hasSize(42))
matches "int a[42]" and "int b[2 * 21]"
2016-05-12 12:20:04 +08:00
stringLiteral(hasSize(4))
matches "abcd", L"abcd"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html" > DeclStmt< / a > > < / td > < td class = "name" onclick = "toggle('declCountIs0')" > < a name = "declCountIs0Anchor" > declCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "declCountIs0" > < pre > Matches declaration statements that contain a specific number of
declarations.
Example: Given
int a, b;
int c;
int d = 2, e;
declCountIs(2)
matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('equalsBoundNode1')" > < a name = "equalsBoundNode1Anchor" > equalsBoundNode< / a > < / td > < td > std::string ID< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsBoundNode1" > < pre > Matches if a node equals a previously bound node.
Matches a node if it equals the node previously bound to ID.
Given
class X { int a; int b; };
cxxRecordDecl(
has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
matches the class X, as a and b have the same type.
Note that when multiple matches are involved via forEach* matchers,
equalsBoundNodes acts as a filter.
For example:
compoundStmt(
forEachDescendant(varDecl().bind("d")),
forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
will trigger a match for each combination of variable declaration
and reference to that variable declaration within a compound statement.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('equalsNode0')" > < a name = "equalsNode0Anchor" > equalsNode< / a > < / td > < td > const Decl* Other< / td > < / tr >
2016-05-05 04:45:00 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsNode0" > < pre > Matches if a node equals another node.
Decl has pointer identity in the AST.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('hasAttr0')" > < a name = "hasAttr0Anchor" > hasAttr< / a > < / td > < td > attr::Kind AttrKind< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAttr0" > < pre > Matches declaration that has a given attribute.
Given
__attribute__((device)) void f() { ... }
decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2019-04-03 21:37:56 +08:00
f. If the matcher is used from clang-query, attr::Kind parameter should be
2015-11-20 15:46:19 +08:00
passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
< / pre > < / td > < / tr >
2020-11-03 22:36:50 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isExpandedFromMacro0')" > < a name = "isExpandedFromMacro0Anchor" > isExpandedFromMacro< / a > < / td > < td > std::string MacroName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isExpandedFromMacro0" > < pre > Matches statements that are (transitively) expanded from the named macro.
Does not match if only part of the statement is expanded from that macro or
if different parts of the the statement are expanded from different
appearances of the macro.
< / pre > < / td > < / tr >
2020-07-02 21:52:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInFileMatching0')" > < a name = "isExpansionInFileMatching0Anchor" > isExpansionInFileMatching< / a > < / td > < td > StringRef RegExp, Regex::RegexFlags Flags = NoFlags< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInFileMatching0" > < pre > Matches AST nodes that were expanded within files whose name is
partially matching a given regex.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
#include "ASTMatcher.h"
class X {};
ASTMatcher.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2020-07-02 21:52:24 +08:00
If the matcher is used in clang-query, RegexFlags parameter
should be passed as a quoted string. e.g: "NoFlags".
Flags can be combined with '|' example "IgnoreCase | BasicRegex"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInMainFile0')" > < a name = "isExpansionInMainFile0Anchor" > isExpansionInMainFile< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInMainFile0" > < pre > Matches AST nodes that were expanded within the main-file.
Example matches X but not Y
(matcher = cxxRecordDecl(isExpansionInMainFile())
#include < Y.h>
class X {};
Y.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInSystemHeader0')" > < a name = "isExpansionInSystemHeader0Anchor" > isExpansionInSystemHeader< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInSystemHeader0" > < pre > Matches AST nodes that were expanded within system-header-files.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInSystemHeader())
#include < SystemHeader.h>
class X {};
SystemHeader.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isImplicit0')" > < a name = "isImplicit0Anchor" > isImplicit< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isImplicit0" > < pre > Matches a declaration that has been implicitly added
2018-12-12 03:30:49 +08:00
by the compiler (eg. implicit default/copy constructors).
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2019-05-03 20:50:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isInStdNamespace0')" > < a name = "isInStdNamespace0Anchor" > isInStdNamespace< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isInStdNamespace0" > < pre > Matches declarations in the namespace `std`, but not in nested namespaces.
Given
class vector {};
namespace foo {
class vector {};
namespace std {
class vector {};
}
}
namespace std {
inline namespace __1 {
class vector {}; // #1
namespace experimental {
class vector {};
}
}
}
cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isInstantiated0')" > < a name = "isInstantiated0Anchor" > isInstantiated< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isInstantiated0" > < pre > Matches declarations that are template instantiations or are inside
template instantiations.
Given
template< typename T> void A(T t) { T i; }
A(0);
A(0U);
functionDecl(isInstantiated())
matches 'A(int) {...};' and 'A(unsigned) {...}'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isPrivate0')" > < a name = "isPrivate0Anchor" > isPrivate< / a > < / td > < td > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isPrivate0" > < pre > Matches private C++ declarations and C++ base specifers that specify private
inheritance.
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Examples:
2015-11-20 15:46:19 +08:00
class C {
public: int a;
protected: int b;
2020-04-29 11:00:49 +08:00
private: int c; // fieldDecl(isPrivate()) matches 'c'
2015-11-20 15:46:19 +08:00
};
2020-04-29 11:00:49 +08:00
struct Base {};
struct Derived1 : private Base {}; // matches 'Base'
class Derived2 : Base {}; // matches 'Base'
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isProtected0')" > < a name = "isProtected0Anchor" > isProtected< / a > < / td > < td > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isProtected0" > < pre > Matches protected C++ declarations and C++ base specifers that specify
protected inheritance.
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Examples:
2015-11-20 15:46:19 +08:00
class C {
public: int a;
2020-04-29 11:00:49 +08:00
protected: int b; // fieldDecl(isProtected()) matches 'b'
2015-11-20 15:46:19 +08:00
private: int c;
};
2020-04-29 11:00:49 +08:00
class Base {};
class Derived : protected Base {}; // matches 'Base'
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('isPublic0')" > < a name = "isPublic0Anchor" > isPublic< / a > < / td > < td > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isPublic0" > < pre > Matches public C++ declarations and C++ base specifers that specify public
inheritance.
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Examples:
2015-11-20 15:46:19 +08:00
class C {
2020-04-29 11:00:49 +08:00
public: int a; // fieldDecl(isPublic()) matches 'a'
2015-11-20 15:46:19 +08:00
protected: int b;
private: int c;
};
2020-04-29 11:00:49 +08:00
class Base {};
class Derived1 : public Base {}; // matches 'Base'
struct Derived2 : Base {}; // matches 'Base'
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html" > DesignatedInitExpr< / a > > < / td > < td class = "name" onclick = "toggle('designatorCountIs0')" > < a name = "designatorCountIs0Anchor" > designatorCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "designatorCountIs0" > < pre > Matches designated initializer expressions that contain
a specific number of designators.
Example: Given
point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
designatorCountIs(2)
matches '{ [2].y = 1.0, [0].x = 1.0 }',
but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html" > EnumDecl< / a > > < / td > < td class = "name" onclick = "toggle('isScoped0')" > < a name = "isScoped0Anchor" > isScoped< / a > < / td > < td > < / td > < / tr >
2018-01-18 17:47:57 +08:00
< tr > < td colspan = "4" class = "doc" id = "isScoped0" > < pre > Matches C++11 scoped enum declaration.
Example matches Y (matcher = enumDecl(isScoped()))
enum X {};
enum class Y {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('isInstantiationDependent0')" > < a name = "isInstantiationDependent0Anchor" > isInstantiationDependent< / a > < / td > < td > < / td > < / tr >
2018-09-12 00:09:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isInstantiationDependent0" > < pre > Matches expressions that are instantiation-dependent even if it is
neither type- nor value-dependent.
In the following example, the expression sizeof(sizeof(T() + T()))
is instantiation-dependent (since it involves a template parameter T),
but is neither type- nor value-dependent, since the type of the inner
sizeof is known (std::size_t) and therefore the size of the outer
sizeof is known.
template< typename T>
void f(T x, T y) { sizeof(sizeof(T() + T()); }
expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('isTypeDependent0')" > < a name = "isTypeDependent0Anchor" > isTypeDependent< / a > < / td > < td > < / td > < / tr >
2018-09-12 00:09:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isTypeDependent0" > < pre > Matches expressions that are type-dependent because the template type
is not yet instantiated.
For example, the expressions "x" and "x + y" are type-dependent in
the following code, but "y" is not type-dependent:
template< typename T>
void add(T x, int y) {
x + y;
}
expr(isTypeDependent()) matches x + y
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('isValueDependent0')" > < a name = "isValueDependent0Anchor" > isValueDependent< / a > < / td > < td > < / td > < / tr >
2018-09-12 00:09:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isValueDependent0" > < pre > Matches expression that are value-dependent because they contain a
non-type template parameter.
For example, the array bound of "Chars" in the following example is
value-dependent.
template< int Size> int f() { return Size; }
expr(isValueDependent()) matches return Size
< / pre > < / td > < / tr >
2020-01-03 02:37:41 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('nullPointerConstant0')" > < a name = "nullPointerConstant0Anchor" > nullPointerConstant< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "nullPointerConstant0" > < pre > Matches expressions that resolve to a null pointer constant, such as
GNU's __null, C++11's nullptr, or C's NULL macro.
Given:
void *v1 = NULL;
void *v2 = nullptr;
void *v3 = __null; // GNU extension
char *cp = (char *)0;
int *ip = 0;
int i = 0;
expr(nullPointerConstant())
matches the initializer for v1, v2, v3, cp, and ip. Does not match the
initializer for i.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html" > FieldDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasBitWidth0')" > < a name = "hasBitWidth0Anchor" > hasBitWidth< / a > < / td > < td > unsigned Width< / td > < / tr >
2016-12-24 21:22:26 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBitWidth0" > < pre > Matches non-static data members that are bit-fields of the specified
bit width.
2016-07-07 02:25:16 +08:00
Given
class C {
int a : 2;
int b : 4;
int c : 2;
};
2016-12-24 21:22:26 +08:00
fieldDecl(hasBitWidth(2))
2016-07-07 02:25:16 +08:00
matches 'int a;' and 'int c;' but not 'int b;'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html" > FieldDecl< / a > > < / td > < td class = "name" onclick = "toggle('isBitField0')" > < a name = "isBitField0Anchor" > isBitField< / a > < / td > < td > < / td > < / tr >
2016-07-07 02:25:16 +08:00
< tr > < td colspan = "4" class = "doc" id = "isBitField0" > < pre > Matches non-static data members that are bit-fields.
Given
class C {
int a : 2;
int b;
};
fieldDecl(isBitField())
matches 'int a;' but not 'int b;'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > < / td > < td class = "name" onclick = "toggle('equals1')" > < a name = "equals1Anchor" > equals< / a > < / td > < td > const ValueT Value< / td > < / tr >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals1" > < pre > Matches literals that are equal to the given value of type ValueT.
2015-11-20 15:46:19 +08:00
2017-06-09 06:00:58 +08:00
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
2015-11-20 15:46:19 +08:00
2017-07-11 23:45:22 +08:00
Note that you cannot directly match a negative numeric literal because the
minus sign is not part of the literal: It is a unary operator whose operand
is the positive numeric literal. Instead, you must use a unaryOperator()
matcher to match the minus sign:
unaryOperator(hasOperatorName("-"),
hasUnaryOperand(integerLiteral(equals(13))))
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals12" > < pre > < / pre > < / td > < / tr >
2020-03-09 19:16:50 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOverloadedOperatorName1')" > < a name = "hasAnyOverloadedOperatorName1Anchor" > hasAnyOverloadedOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOverloadedOperatorName1" > < pre > Matches overloaded operator names.
Matches overloaded operator names specified in strings without the
"operator" prefix: e.g. "< < ".
2020-11-18 20:48:59 +08:00
hasAnyOverloadedOperatorName("+", "-")
2020-03-09 19:16:50 +08:00
Is equivalent to
anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2016-05-17 00:49:01 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDynamicExceptionSpec0" > < pre > Matches functions that have a dynamic exception specification.
Given:
void f();
void g() noexcept;
void h() noexcept(true);
void i() noexcept(false);
void j() throw();
void k() throw(int);
void l() throw(...);
2016-06-08 01:34:45 +08:00
functionDecl(hasDynamicExceptionSpec()) and
functionProtoType(hasDynamicExceptionSpec())
match the declarations of j, k, and l, but not f, g, h, or i.
2016-05-17 00:49:01 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasOverloadedOperatorName0')" > < a name = "hasOverloadedOperatorName0Anchor" > hasOverloadedOperatorName< / a > < / td > < td > StringRef Name< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasOverloadedOperatorName0" > < pre > Matches overloaded operator names.
Matches overloaded operator names specified in strings without the
"operator" prefix: e.g. "< < ".
Given:
class A { int operator*(); };
const A & operator< < (const A & a, const A & b);
A a;
2018-12-12 03:30:49 +08:00
a < < a; // < -- This matches
2015-11-20 15:46:19 +08:00
cxxOperatorCallExpr(hasOverloadedOperatorName("< < "))) matches the
specified line and
cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
matches the declaration of A.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasTrailingReturn0')" > < a name = "hasTrailingReturn0Anchor" > hasTrailingReturn< / a > < / td > < td > < / td > < / tr >
2018-01-23 06:45:23 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTrailingReturn0" > < pre > Matches a function declared with a trailing return type.
Example matches Y (matcher = functionDecl(hasTrailingReturn()))
int X() {}
auto Y() -> int {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isConstexpr1')" > < a name = "isConstexpr1Anchor" > isConstexpr< / a > < / td > < td > < / td > < / tr >
2018-05-08 19:53:32 +08:00
< tr > < td colspan = "4" class = "doc" id = "isConstexpr1" > < pre > Matches constexpr variable and function declarations,
and if constexpr.
2015-11-20 15:46:19 +08:00
Given:
constexpr int foo = 42;
constexpr int bar();
2018-05-08 19:53:32 +08:00
void baz() { if constexpr(1 > 0) {} }
2015-11-20 15:46:19 +08:00
varDecl(isConstexpr())
matches the declaration of foo.
functionDecl(isConstexpr())
matches the declaration of bar.
2018-05-08 19:53:32 +08:00
ifStmt(isConstexpr())
matches the if statement in baz.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefaulted0')" > < a name = "isDefaulted0Anchor" > isDefaulted< / a > < / td > < td > < / td > < / tr >
2016-01-21 23:18:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefaulted0" > < pre > Matches defaulted function declarations.
Given:
class A { ~A(); };
class B { ~B() = default; };
functionDecl(isDefaulted())
matches the declaration of ~B, but not ~A.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefinition3')" > < a name = "isDefinition3Anchor" > isDefinition< / a > < / td > < td > < / td > < / tr >
2017-11-14 22:17:26 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefinition3" > < pre > Matches if a declaration has a body attached.
2015-11-20 15:46:19 +08:00
Example matches A, va, fa
class A {};
2018-12-12 03:30:49 +08:00
class B; // Doesn't match, as it has no body.
2015-11-20 15:46:19 +08:00
int va;
2018-12-12 03:30:49 +08:00
extern int vb; // Doesn't match, as it doesn't define the variable.
2015-11-20 15:46:19 +08:00
void fa() {}
2018-12-12 03:30:49 +08:00
void fb(); // Doesn't match, as it has no body.
2017-11-14 22:17:26 +08:00
@interface X
2018-12-12 03:30:49 +08:00
- (void)ma; // Doesn't match, interface is declaration.
2017-11-14 22:17:26 +08:00
@end
@implementation X
- (void)ma {}
@end
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDeleted0')" > < a name = "isDeleted0Anchor" > isDeleted< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDeleted0" > < pre > Matches deleted function declarations.
Given:
void Func();
void DeletedFunc() = delete;
functionDecl(isDeleted())
matches the declaration of DeletedFunc, but not Func.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicitTemplateSpecialization0')" > < a name = "isExplicitTemplateSpecialization0Anchor" > isExplicitTemplateSpecialization< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExplicitTemplateSpecialization0" > < pre > Matches explicit template specializations of function, class, or
static member variable template instantiations.
Given
template< typename T> void A(T t) { }
template< > void A(int N) { }
functionDecl(isExplicitTemplateSpecialization())
matches the specialization A< int> ().
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-01-18 00:50:14 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExternC0')" > < a name = "isExternC0Anchor" > isExternC< / a > < / td > < td > < / td > < / tr >
2017-09-23 03:29:38 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExternC0" > < pre > Matches extern "C" function or variable declarations.
2015-11-20 15:46:19 +08:00
Given:
extern "C" void f() {}
extern "C" { void g() {} }
void h() {}
2017-09-23 03:29:38 +08:00
extern "C" int x = 1;
extern "C" int y = 2;
int z = 3;
2015-11-20 15:46:19 +08:00
functionDecl(isExternC())
2017-09-23 03:29:38 +08:00
matches the declaration of f and g, but not the declaration of h.
varDecl(isExternC())
matches the declaration of x and y, but not the declaration of z.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-01-18 00:50:14 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isInline1')" > < a name = "isInline1Anchor" > isInline< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isInline1" > < pre > Matches function and namespace declarations that are marked with
the inline keyword.
Given
inline void f();
void g();
namespace n {
inline namespace m {}
}
functionDecl(isInline()) will match ::f().
namespaceDecl(isInline()) will match n::m.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isMain0')" > < a name = "isMain0Anchor" > isMain< / a > < / td > < td > < / td > < / tr >
2018-07-24 06:29:35 +08:00
< tr > < td colspan = "4" class = "doc" id = "isMain0" > < pre > Determines whether the function is "main", which is the entry point
into an executable program.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isNoReturn0')" > < a name = "isNoReturn0Anchor" > isNoReturn< / a > < / td > < td > < / td > < / tr >
2018-01-18 03:40:55 +08:00
< tr > < td colspan = "4" class = "doc" id = "isNoReturn0" > < pre > Matches FunctionDecls that have a noreturn attribute.
Given
void nope();
[[noreturn]] void a();
__attribute__((noreturn)) void b();
struct c { [[noreturn]] c(); };
functionDecl(isNoReturn())
matches all of those except
void nope();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isNoThrow0')" > < a name = "isNoThrow0Anchor" > isNoThrow< / a > < / td > < td > < / td > < / tr >
2015-12-02 23:23:59 +08:00
< tr > < td colspan = "4" class = "doc" id = "isNoThrow0" > < pre > Matches functions that have a non-throwing exception specification.
Given:
void f();
void g() noexcept;
void h() throw();
void i() throw(int);
void j() noexcept(false);
2016-06-08 01:34:45 +08:00
functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
match the declarations of g, and h, but not f, i or j.
2015-12-02 23:23:59 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isStaticStorageClass0')" > < a name = "isStaticStorageClass0Anchor" > isStaticStorageClass< / a > < / td > < td > < / td > < / tr >
2018-12-12 03:30:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isStaticStorageClass0" > < pre > Matches variable/function declarations that have "static" storage
2016-09-27 15:53:20 +08:00
class specifier ("static" keyword) written in the source.
2016-09-27 00:01:52 +08:00
Given:
static void f() {}
static int i = 0;
2016-09-27 15:53:20 +08:00
extern int j;
int k;
2016-09-27 00:01:52 +08:00
functionDecl(isStaticStorageClass())
matches the function declaration f.
varDecl(isStaticStorageClass())
matches the variable declaration i.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isTemplateInstantiation0')" > < a name = "isTemplateInstantiation0Anchor" > isTemplateInstantiation< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isTemplateInstantiation0" > < pre > Matches template instantiations of function, class, or static
member variable template instantiations.
Given
template < typename T> class X {}; class A {}; X< A> x;
or
template < typename T> class X {}; class A {}; template class X< A> ;
2018-02-21 22:22:42 +08:00
or
template < typename T> class X {}; class A {}; extern template class X< A> ;
2015-11-20 15:46:19 +08:00
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
matches the template instantiation of X< A> .
But given
template < typename T> class X {}; class A {};
template < > class X< A> {}; X< A> x;
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
does not match, as X< A> is an explicit template specialization.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isVariadic0')" > < a name = "isVariadic0Anchor" > isVariadic< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isVariadic0" > < pre > Matches if a function declaration is variadic.
Example matches f, but not g or h. The function i will not match, even when
compiled in C mode.
void f(...);
void g(int);
template < typename... Ts> void h(Ts...);
void i();
< / pre > < / td > < / tr >
2020-10-11 02:32:51 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('isWeak0')" > < a name = "isWeak0Anchor" > isWeak< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isWeak0" > < pre > Matches weak function declarations.
Given:
void foo() __attribute__((__weakref__("__foo")));
void bar();
functionDecl(isWeak())
matches the weak declaration "foo", but not "bar".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('parameterCountIs0')" > < a name = "parameterCountIs0Anchor" > parameterCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2016-02-01 22:11:47 +08:00
< tr > < td colspan = "4" class = "doc" id = "parameterCountIs0" > < pre > Matches FunctionDecls and FunctionProtoTypes that have a
specific parameter count.
Given
void f(int i) {}
void g(int i, int j) {}
void h(int i, int j);
void j(int i);
void k(int x, int y, int z, ...);
functionDecl(parameterCountIs(2))
2018-01-23 06:34:15 +08:00
matches g and h
2016-02-01 22:11:47 +08:00
functionProtoType(parameterCountIs(2))
2018-01-23 06:34:15 +08:00
matches g and h
2016-02-01 22:11:47 +08:00
functionProtoType(parameterCountIs(3))
2018-01-23 06:34:15 +08:00
matches k
2016-02-01 22:11:47 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html" > FunctionProtoType< / a > > < / td > < td class = "name" onclick = "toggle('hasDynamicExceptionSpec1')" > < a name = "hasDynamicExceptionSpec1Anchor" > hasDynamicExceptionSpec< / a > < / td > < td > < / td > < / tr >
2016-06-08 01:34:45 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDynamicExceptionSpec1" > < pre > Matches functions that have a dynamic exception specification.
Given:
void f();
void g() noexcept;
void h() noexcept(true);
void i() noexcept(false);
void j() throw();
void k() throw(int);
void l() throw(...);
functionDecl(hasDynamicExceptionSpec()) and
functionProtoType(hasDynamicExceptionSpec())
match the declarations of j, k, and l, but not f, g, h, or i.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html" > FunctionProtoType< / a > > < / td > < td class = "name" onclick = "toggle('isNoThrow1')" > < a name = "isNoThrow1Anchor" > isNoThrow< / a > < / td > < td > < / td > < / tr >
2016-06-08 01:34:45 +08:00
< tr > < td colspan = "4" class = "doc" id = "isNoThrow1" > < pre > Matches functions that have a non-throwing exception specification.
Given:
void f();
void g() noexcept;
void h() throw();
void i() throw(int);
void j() noexcept(false);
functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
match the declarations of g, and h, but not f, i or j.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html" > FunctionProtoType< / a > > < / td > < td class = "name" onclick = "toggle('parameterCountIs1')" > < a name = "parameterCountIs1Anchor" > parameterCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2016-02-01 22:11:47 +08:00
< tr > < td colspan = "4" class = "doc" id = "parameterCountIs1" > < pre > Matches FunctionDecls and FunctionProtoTypes that have a
specific parameter count.
2015-11-20 15:46:19 +08:00
Given
void f(int i) {}
void g(int i, int j) {}
2016-02-01 22:11:47 +08:00
void h(int i, int j);
void j(int i);
void k(int x, int y, int z, ...);
2015-11-20 15:46:19 +08:00
functionDecl(parameterCountIs(2))
2018-01-23 06:34:15 +08:00
matches g and h
2016-02-01 22:11:47 +08:00
functionProtoType(parameterCountIs(2))
2018-01-23 06:34:15 +08:00
matches g and h
2016-02-01 22:11:47 +08:00
functionProtoType(parameterCountIs(3))
2018-01-23 06:34:15 +08:00
matches k
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('isConstexpr2')" > < a name = "isConstexpr2Anchor" > isConstexpr< / a > < / td > < td > < / td > < / tr >
2018-05-08 19:53:32 +08:00
< tr > < td colspan = "4" class = "doc" id = "isConstexpr2" > < pre > Matches constexpr variable and function declarations,
and if constexpr.
Given:
constexpr int foo = 42;
constexpr int bar();
void baz() { if constexpr(1 > 0) {} }
varDecl(isConstexpr())
matches the declaration of foo.
functionDecl(isConstexpr())
matches the declaration of bar.
ifStmt(isConstexpr())
matches the if statement in baz.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals6" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > > < / td > < td class = "name" onclick = "toggle('equals0')" > < a name = "equals0Anchor" > equals< / a > < / td > < td > const ValueT Value< / td > < / tr >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals0" > < pre > Matches literals that are equal to the given value of type ValueT.
2015-11-20 15:46:19 +08:00
2017-06-09 06:00:58 +08:00
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
2015-11-20 15:46:19 +08:00
2017-07-11 23:45:22 +08:00
Note that you cannot directly match a negative numeric literal because the
minus sign is not part of the literal: It is a unary operator whose operand
is the positive numeric literal. Instead, you must use a unaryOperator()
matcher to match the minus sign:
unaryOperator(hasOperatorName("-"),
hasUnaryOperand(integerLiteral(equals(13))))
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html" > CharacterLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html" > CXXBoolLiteralExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html" > FloatingLiteral< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html" > IntegerLiteral< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals13" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2017-06-09 06:00:58 +08:00
< tr > < td colspan = "4" class = "doc" id = "equals9" > < pre > < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isArrow0" > < pre > Matches member expressions that are called with '-> ' as opposed
to '.'.
Member calls on the implicit this pointer match as called with '-> '.
Given
class Y {
void x() { this-> x(); x(); Y y; y.x(); a; this-> b; Y::b; }
2018-09-18 02:48:43 +08:00
template < class T> void f() { this-> f< T> (); f< T> (); }
2015-11-20 15:46:19 +08:00
int a;
static int b;
};
2018-09-18 02:48:43 +08:00
template < class T>
class Z {
void x() { this-> m; }
};
2015-11-20 15:46:19 +08:00
memberExpr(isArrow())
matches this-> x, x, y.x, a, this-> b
2018-09-18 02:48:43 +08:00
cxxDependentScopeMemberExpr(isArrow())
matches this-> m
unresolvedMemberExpr(isArrow())
matches this-> f< T> , f< T>
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyName0')" > < a name = "hasAnyName0Anchor" > hasAnyName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyName0" > < pre > Matches NamedDecl nodes that have any of the specified names.
This matcher is only provided as a performance optimization of hasName.
hasAnyName(a, b, c)
is equivalent to, but faster than
anyOf(hasName(a), hasName(b), hasName(c))
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasExternalFormalLinkage0')" > < a name = "hasExternalFormalLinkage0Anchor" > hasExternalFormalLinkage< / a > < / td > < td > < / td > < / tr >
2016-08-17 21:10:42 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasExternalFormalLinkage0" > < pre > Matches a declaration that has external formal linkage.
Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
void f() {
int x;
static int y;
}
int z;
Example matches f() because it has external formal linkage despite being
unique to the translation unit as though it has internal likage
(matcher = functionDecl(hasExternalFormalLinkage()))
namespace {
void f() {}
}
< / pre > < / td > < / tr >
2020-02-03 19:10:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasName0')" > < a name = "hasName0Anchor" > hasName< / a > < / td > < td > StringRef Name< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasName0" > < pre > Matches NamedDecl nodes that have the specified name.
Supports specifying enclosing namespaces or classes by prefixing the name
with '< enclosing> ::'.
Does not match typedefs of an underlying type with the given name.
Example matches X (Name == "X")
class X;
Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
namespace a { namespace b { class X; } }
< / pre > < / td > < / tr >
2020-07-02 21:52:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > < / td > < td class = "name" onclick = "toggle('matchesName0')" > < a name = "matchesName0Anchor" > matchesName< / a > < / td > < td > StringRef RegExp, Regex::RegexFlags Flags = NoFlags< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "matchesName0" > < pre > Matches NamedDecl nodes whose fully qualified names contain
a substring matched by the given RegExp.
Supports specifying enclosing namespaces or classes by
prefixing the name with '< enclosing> ::'. Does not match typedefs
of an underlying type with the given name.
Example matches X (regexp == "::X")
class X;
Example matches X (regexp is one of "::X", "^foo::.*X", among others)
namespace foo { namespace bar { class X; } }
2020-07-02 21:52:24 +08:00
If the matcher is used in clang-query, RegexFlags parameter
should be passed as a quoted string. e.g: "NoFlags".
Flags can be combined with '|' example "IgnoreCase | BasicRegex"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html" > NamespaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isAnonymous0')" > < a name = "isAnonymous0Anchor" > isAnonymous< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isAnonymous0" > < pre > Matches anonymous namespace declarations.
Given
namespace n {
2018-12-12 03:30:49 +08:00
namespace {} // #1
2015-11-20 15:46:19 +08:00
}
namespaceDecl(isAnonymous()) will match #1 but not ::n.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html" > NamespaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isInline0')" > < a name = "isInline0Anchor" > isInline< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isInline0" > < pre > Matches function and namespace declarations that are marked with
the inline keyword.
Given
inline void f();
void g();
namespace n {
inline namespace m {}
}
functionDecl(isInline()) will match ::f().
namespaceDecl(isInline()) will match n::m.
< / pre > < / td > < / tr >
2020-08-10 08:37:18 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html" > OMPDefaultClause< / a > > < / td > < td class = "name" onclick = "toggle('isFirstPrivateKind0')" > < a name = "isFirstPrivateKind0Anchor" > isFirstPrivateKind< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isFirstPrivateKind0" > < pre > Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
specified.
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
Given
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
2020-07-13 11:19:40 +08:00
#pragma omp parallel default(firstprivate)
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
2020-08-10 08:37:18 +08:00
``ompDefaultClause(isFirstPrivateKind())`` matches only
``default(firstprivate)``.
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< / pre > < / td > < / tr >
2020-08-10 08:37:18 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html" > OMPDefaultClause< / a > > < / td > < td class = "name" onclick = "toggle('isNoneKind0')" > < a name = "isNoneKind0Anchor" > isNoneKind< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isNoneKind0" > < pre > Matches if the OpenMP ``default`` clause has ``none`` kind specified.
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
Given
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
2020-07-13 11:19:40 +08:00
#pragma omp parallel default(firstprivate)
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
2020-08-10 08:37:18 +08:00
``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< / pre > < / td > < / tr >
2020-08-10 08:37:18 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html" > OMPDefaultClause< / a > > < / td > < td class = "name" onclick = "toggle('isSharedKind0')" > < a name = "isSharedKind0Anchor" > isSharedKind< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isSharedKind0" > < pre > Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
2020-07-13 11:19:40 +08:00
Given
#pragma omp parallel
#pragma omp parallel default(none)
#pragma omp parallel default(shared)
#pragma omp parallel default(firstprivate)
2020-08-10 08:37:18 +08:00
``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
2020-07-13 11:19:40 +08:00
< / pre > < / td > < / tr >
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html" > OMPExecutableDirective< / a > > < / td > < td class = "name" onclick = "toggle('isAllowedToContainClauseKind0')" > < a name = "isAllowedToContainClauseKind0Anchor" > isAllowedToContainClauseKind< / a > < / td > < td > OpenMPClauseKind CKind< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isAllowedToContainClauseKind0" > < pre > Matches if the OpenMP directive is allowed to contain the specified OpenMP
clause kind.
Given
#pragma omp parallel
#pragma omp parallel for
#pragma omp for
`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
``omp parallel`` and ``omp parallel for``.
If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
should be passed as a quoted string. e.g.,
``isAllowedToContainClauseKind("OMPC_default").``
< / pre > < / td > < / tr >
2019-03-21 23:33:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html" > OMPExecutableDirective< / a > > < / td > < td class = "name" onclick = "toggle('isStandaloneDirective0')" > < a name = "isStandaloneDirective0Anchor" > isStandaloneDirective< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isStandaloneDirective0" > < pre > Matches standalone OpenMP directives,
i.e., directives that can't have a structured block.
Given
#pragma omp parallel
{}
#pragma omp taskyield
``ompExecutableDirective(isStandaloneDirective()))`` matches
``omp taskyield``.
< / pre > < / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDerivedFrom3')" > < a name = "isDerivedFrom3Anchor" > isDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDerivedFrom3" > < pre > Overloaded method as shortcut for isDerivedFrom(hasName(...)).
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDirectlyDerivedFrom3')" > < a name = "isDirectlyDerivedFrom3Anchor" > isDirectlyDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDirectlyDerivedFrom3" > < pre > Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isSameOrDerivedFrom3')" > < a name = "isSameOrDerivedFrom3Anchor" > isSameOrDerivedFrom< / a > < / td > < td > std::string BaseName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isSameOrDerivedFrom3" > < pre > Overloaded method as shortcut for
isSameOrDerivedFrom(hasName(...)).
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('argumentCountIs3')" > < a name = "argumentCountIs3Anchor" > argumentCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "argumentCountIs3" > < pre > Checks that a call expression or a constructor call expression has
2015-11-20 15:46:19 +08:00
a specific number of arguments (including absent default arguments).
Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
void f(int x, int y);
f(0, 0);
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnySelector0')" > < a name = "hasAnySelector0Anchor" > hasAnySelector< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnySelector0" > < pre > Matches when at least one of the supplied string equals to the
Selector.getAsString()
matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
matches both of the expressions below:
[myObj methodA:argA];
[myObj methodB:argB];
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasKeywordSelector0')" > < a name = "hasKeywordSelector0Anchor" > hasKeywordSelector< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasKeywordSelector0" > < pre > Matches when the selector is a keyword selector
objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
message expression in
UIWebView *webView = ...;
CGRect bodyFrame = webView.frame;
bodyFrame.size.height = self.bodyContentHeight;
webView.frame = bodyFrame;
2018-12-12 03:30:49 +08:00
// ^---- matches here
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasNullSelector0')" > < a name = "hasNullSelector0Anchor" > hasNullSelector< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasNullSelector0" > < pre > Matches when the selector is the empty selector
Matches only when the selector of the objCMessageExpr is NULL. This may
represent an error condition in the tree!
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasSelector0')" > < a name = "hasSelector0Anchor" > hasSelector< / a > < / td > < td > std::string BaseName< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSelector0" > < pre > Matches when BaseName == Selector.getAsString()
matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
matches the outer message expr in the code below, but NOT the message
invocation for self.bodyView.
[self.bodyView loadHTMLString:html baseURL:NULL];
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasUnarySelector0')" > < a name = "hasUnarySelector0Anchor" > hasUnarySelector< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasUnarySelector0" > < pre > Matches when the selector is a Unary Selector
matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
matches self.bodyView in the code below, but NOT the outer message
invocation of "loadHTMLString:baseURL:".
[self.bodyView loadHTMLString:html baseURL:NULL];
< / pre > < / td > < / tr >
2019-04-23 01:54:11 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('isClassMessage0')" > < a name = "isClassMessage0Anchor" > isClassMessage< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isClassMessage0" > < pre > Returns true when the Objective-C message is sent to a class.
Example
matcher = objcMessageExpr(isClassMessage())
matches
[NSString stringWithFormat:@"format"];
but not
NSString *x = @"hello";
[x containsString:@"h"];
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('isInstanceMessage0')" > < a name = "isInstanceMessage0Anchor" > isInstanceMessage< / a > < / td > < td > < / td > < / tr >
2018-07-17 04:22:12 +08:00
< tr > < td colspan = "4" class = "doc" id = "isInstanceMessage0" > < pre > Returns true when the Objective-C message is sent to an instance.
Example
2019-04-23 01:54:11 +08:00
matcher = objcMessageExpr(isInstanceMessage())
2018-07-17 04:22:12 +08:00
matches
NSString *x = @"hello";
2018-07-24 06:29:10 +08:00
[x containsString:@"h"];
2018-07-17 04:22:12 +08:00
but not
2018-07-24 06:29:10 +08:00
[NSString stringWithFormat:@"format"];
2018-07-17 04:22:12 +08:00
< / pre > < / td > < / tr >
2020-07-02 21:52:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('matchesSelector0')" > < a name = "matchesSelector0Anchor" > matchesSelector< / a > < / td > < td > StringRef RegExp, Regex::RegexFlags Flags = NoFlags< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "matchesSelector0" > < pre > Matches ObjC selectors whose name contains
a substring matched by the given RegExp.
matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
invocation for self.bodyView.
[self.bodyView loadHTMLString:html baseURL:NULL];
2020-07-02 21:52:24 +08:00
If the matcher is used in clang-query, RegexFlags parameter
should be passed as a quoted string. e.g: "NoFlags".
Flags can be combined with '|' example "IgnoreCase | BasicRegex"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('numSelectorArgs0')" > < a name = "numSelectorArgs0Anchor" > numSelectorArgs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "numSelectorArgs0" > < pre > Matches when the selector has the specified number of arguments
matcher = objCMessageExpr(numSelectorArgs(0));
matches self.bodyView in the code below
matcher = objCMessageExpr(numSelectorArgs(2));
matches the invocation of "loadHTMLString:baseURL:" but not that
of self.bodyView
[self.bodyView loadHTMLString:html baseURL:NULL];
< / pre > < / td > < / tr >
2019-05-13 05:52:19 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isClassMethod0')" > < a name = "isClassMethod0Anchor" > isClassMethod< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isClassMethod0" > < pre > Returns true when the Objective-C method declaration is a class method.
Example
matcher = objcMethodDecl(isClassMethod())
matches
@interface I + (void)foo; @end
but not
@interface I - (void)bar; @end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefinition2')" > < a name = "isDefinition2Anchor" > isDefinition< / a > < / td > < td > < / td > < / tr >
2017-11-14 22:17:26 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefinition2" > < pre > Matches if a declaration has a body attached.
Example matches A, va, fa
class A {};
2018-12-12 03:30:49 +08:00
class B; // Doesn't match, as it has no body.
2017-11-14 22:17:26 +08:00
int va;
2018-12-12 03:30:49 +08:00
extern int vb; // Doesn't match, as it doesn't define the variable.
2017-11-14 22:17:26 +08:00
void fa() {}
2018-12-12 03:30:49 +08:00
void fb(); // Doesn't match, as it has no body.
2017-11-14 22:17:26 +08:00
@interface X
2018-12-12 03:30:49 +08:00
- (void)ma; // Doesn't match, interface is declaration.
2017-11-14 22:17:26 +08:00
@end
@implementation X
- (void)ma {}
@end
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > >
2017-11-14 22:17:26 +08:00
< / pre > < / td > < / tr >
2019-05-13 05:52:19 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('isInstanceMethod0')" > < a name = "isInstanceMethod0Anchor" > isInstanceMethod< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isInstanceMethod0" > < pre > Returns true when the Objective-C method declaration is an instance method.
Example
matcher = objcMethodDecl(isInstanceMethod())
matches
@interface I - (void)bar; @end
but not
@interface I + (void)foo; @end
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasDefaultArgument0')" > < a name = "hasDefaultArgument0Anchor" > hasDefaultArgument< / a > < / td > < td > < / td > < / tr >
2017-11-22 03:22:34 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDefaultArgument0" > < pre > Matches a declaration that has default arguments.
Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
void x(int val) {}
void y(int val = 0) {}
2020-01-03 02:37:41 +08:00
Deprecated. Use hasInitializer() instead to be able to
match on the contents of the default argument. For example:
void x(int val = 7) {}
void y(int val = 42) {}
parmVarDecl(hasInitializer(integerLiteral(equals(42))))
matches the parameter of y
A matcher such as
parmVarDecl(hasInitializer(anything()))
is equivalent to parmVarDecl(hasDefaultArgument()).
2017-11-22 03:22:34 +08:00
< / pre > < / td > < / tr >
2020-06-22 17:56:04 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isAtPosition0')" > < a name = "isAtPosition0Anchor" > isAtPosition< / a > < / td > < td > unsigned N< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isAtPosition0" > < pre > Matches the ParmVarDecl nodes that are at the N'th position in the parameter
list. The parameter list could be that of either a block, function, or
objc-method.
Given
void f(int a, int b, int c) {
}
``parmVarDecl(isAtPosition(0))`` matches ``int a``.
``parmVarDecl(isAtPosition(1))`` matches ``int b``.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('asString0')" > < a name = "asString0Anchor" > asString< / a > < / td > < td > std::string Name< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "asString0" > < pre > Matches if the matched type is represented by the given string.
Given
class Y { public: void x(); };
void z() { Y* y; y-> x(); }
cxxMemberCallExpr(on(hasType(asString("class Y *"))))
matches y-> x()
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('equalsBoundNode3')" > < a name = "equalsBoundNode3Anchor" > equalsBoundNode< / a > < / td > < td > std::string ID< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsBoundNode3" > < pre > Matches if a node equals a previously bound node.
Matches a node if it equals the node previously bound to ID.
Given
class X { int a; int b; };
cxxRecordDecl(
has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
matches the class X, as a and b have the same type.
Note that when multiple matches are involved via forEach* matchers,
equalsBoundNodes acts as a filter.
For example:
compoundStmt(
forEachDescendant(varDecl().bind("d")),
forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
will trigger a match for each combination of variable declaration
and reference to that variable declaration within a compound statement.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('hasLocalQualifiers0')" > < a name = "hasLocalQualifiers0Anchor" > hasLocalQualifiers< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasLocalQualifiers0" > < pre > Matches QualType nodes that have local CV-qualifiers attached to
the node, not hidden within a typedef.
Given
typedef const int const_int;
const_int i;
int *const j;
int *volatile k;
int m;
varDecl(hasType(hasLocalQualifiers())) matches only j and k.
i is const-qualified but the qualifier is not local.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isAnyCharacter0')" > < a name = "isAnyCharacter0Anchor" > isAnyCharacter< / a > < / td > < td > < / td > < / tr >
2015-12-23 05:06:36 +08:00
< tr > < td colspan = "4" class = "doc" id = "isAnyCharacter0" > < pre > Matches QualType nodes that are of character type.
Given
void a(char);
void b(wchar_t);
void c(double);
functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
matches "a(char)", "b(wchar_t)", but not "c(double)".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isAnyPointer0')" > < a name = "isAnyPointer0Anchor" > isAnyPointer< / a > < / td > < td > < / td > < / tr >
2016-04-13 19:13:08 +08:00
< tr > < td colspan = "4" class = "doc" id = "isAnyPointer0" > < pre > Matches QualType nodes that are of any pointer type; this includes
the Objective-C object pointer type, which is different despite being
syntactically similar.
2016-02-19 00:36:01 +08:00
Given
int *i = nullptr;
2016-04-13 19:13:08 +08:00
@interface Foo
@end
Foo *f;
2016-02-19 00:36:01 +08:00
int j;
varDecl(hasType(isAnyPointer()))
2016-04-13 19:13:08 +08:00
matches "int *i" and "Foo *f", but not "int j".
2016-02-19 00:36:01 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isConstQualified0')" > < a name = "isConstQualified0Anchor" > isConstQualified< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isConstQualified0" > < pre > Matches QualType nodes that are const-qualified, i.e., that
include "top-level" const.
Given
void a(int);
void b(int const);
void c(const int);
void d(const int*);
void e(int const) {};
functionDecl(hasAnyParameter(hasType(isConstQualified())))
matches "void b(int const)", "void c(const int)" and
"void e(int const) {}". It does not match d as there
is no top-level const on the parameter type "const int *".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isInteger0')" > < a name = "isInteger0Anchor" > isInteger< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isInteger0" > < pre > Matches QualType nodes that are of integer type.
Given
void a(int);
void b(long);
void c(double);
functionDecl(hasAnyParameter(hasType(isInteger())))
matches "a(int)", "b(long)", but not "c(double)".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isSignedInteger0')" > < a name = "isSignedInteger0Anchor" > isSignedInteger< / a > < / td > < td > < / td > < / tr >
2016-07-12 14:36:00 +08:00
< tr > < td colspan = "4" class = "doc" id = "isSignedInteger0" > < pre > Matches QualType nodes that are of signed integer type.
Given
void a(int);
void b(unsigned long);
void c(double);
2016-08-18 20:26:17 +08:00
functionDecl(hasAnyParameter(hasType(isSignedInteger())))
2016-07-12 14:36:00 +08:00
matches "a(int)", but not "b(unsigned long)" and "c(double)".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isUnsignedInteger0')" > < a name = "isUnsignedInteger0Anchor" > isUnsignedInteger< / a > < / td > < td > < / td > < / tr >
2016-07-12 14:36:00 +08:00
< tr > < td colspan = "4" class = "doc" id = "isUnsignedInteger0" > < pre > Matches QualType nodes that are of unsigned integer type.
Given
void a(int);
void b(unsigned long);
void c(double);
2016-08-18 20:26:17 +08:00
functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
2016-07-12 14:36:00 +08:00
matches "b(unsigned long)", but not "a(int)" and "c(double)".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('isVolatileQualified0')" > < a name = "isVolatileQualified0Anchor" > isVolatileQualified< / a > < / td > < td > < / td > < / tr >
2015-11-24 01:09:24 +08:00
< tr > < td colspan = "4" class = "doc" id = "isVolatileQualified0" > < pre > Matches QualType nodes that are volatile-qualified, i.e., that
include "top-level" volatile.
Given
void a(int);
void b(int volatile);
void c(volatile int);
void d(volatile int*);
void e(int volatile) {};
functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
matches "void b(int volatile)", "void c(volatile int)" and
"void e(int volatile) {}". It does not match d as there
is no top-level volatile on the parameter type "volatile int *".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('equalsBoundNode0')" > < a name = "equalsBoundNode0Anchor" > equalsBoundNode< / a > < / td > < td > std::string ID< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsBoundNode0" > < pre > Matches if a node equals a previously bound node.
Matches a node if it equals the node previously bound to ID.
Given
class X { int a; int b; };
cxxRecordDecl(
has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
matches the class X, as a and b have the same type.
Note that when multiple matches are involved via forEach* matchers,
equalsBoundNodes acts as a filter.
For example:
compoundStmt(
forEachDescendant(varDecl().bind("d")),
forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
will trigger a match for each combination of variable declaration
and reference to that variable declaration within a compound statement.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('equalsNode1')" > < a name = "equalsNode1Anchor" > equalsNode< / a > < / td > < td > const Stmt* Other< / td > < / tr >
2016-05-05 04:45:00 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsNode1" > < pre > Matches if a node equals another node.
Stmt has pointer identity in the AST.
< / pre > < / td > < / tr >
2020-11-03 22:36:50 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('isExpandedFromMacro1')" > < a name = "isExpandedFromMacro1Anchor" > isExpandedFromMacro< / a > < / td > < td > std::string MacroName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isExpandedFromMacro1" > < pre > Matches statements that are (transitively) expanded from the named macro.
2020-02-25 07:59:45 +08:00
Does not match if only part of the statement is expanded from that macro or
if different parts of the the statement are expanded from different
appearances of the macro.
< / pre > < / td > < / tr >
2020-07-02 21:52:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInFileMatching1')" > < a name = "isExpansionInFileMatching1Anchor" > isExpansionInFileMatching< / a > < / td > < td > StringRef RegExp, Regex::RegexFlags Flags = NoFlags< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInFileMatching1" > < pre > Matches AST nodes that were expanded within files whose name is
partially matching a given regex.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
#include "ASTMatcher.h"
class X {};
ASTMatcher.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2020-07-02 21:52:24 +08:00
If the matcher is used in clang-query, RegexFlags parameter
should be passed as a quoted string. e.g: "NoFlags".
Flags can be combined with '|' example "IgnoreCase | BasicRegex"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInMainFile1')" > < a name = "isExpansionInMainFile1Anchor" > isExpansionInMainFile< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInMainFile1" > < pre > Matches AST nodes that were expanded within the main-file.
Example matches X but not Y
(matcher = cxxRecordDecl(isExpansionInMainFile())
#include < Y.h>
class X {};
Y.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInSystemHeader1')" > < a name = "isExpansionInSystemHeader1Anchor" > isExpansionInSystemHeader< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInSystemHeader1" > < pre > Matches AST nodes that were expanded within system-header-files.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInSystemHeader())
#include < SystemHeader.h>
class X {};
SystemHeader.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('isInTemplateInstantiation0')" > < a name = "isInTemplateInstantiation0Anchor" > isInTemplateInstantiation< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isInTemplateInstantiation0" > < pre > Matches statements inside of a template instantiation.
Given
int j;
template< typename T> void A(T t) { T i; j += 42;}
A(0);
A(0U);
declStmt(isInTemplateInstantiation())
matches 'int i;' and 'unsigned i'.
unless(stmt(isInTemplateInstantiation()))
will NOT match j += 42; as it's shared between the template definition and
instantiation.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html" > StringLiteral< / a > > < / td > < td class = "name" onclick = "toggle('hasSize1')" > < a name = "hasSize1Anchor" > hasSize< / a > < / td > < td > unsigned N< / td > < / tr >
2016-05-12 12:20:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSize1" > < pre > Matches nodes that have the specified size.
Given
int a[42];
int b[2 * 21];
int c[41], d[43];
char *s = "abcd";
wchar_t *ws = L"abcd";
char *w = "a";
constantArrayType(hasSize(42))
matches "int a[42]" and "int b[2 * 21]"
stringLiteral(hasSize(4))
matches "abcd", L"abcd"
< / pre > < / td > < / tr >
2020-01-29 20:57:27 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > < / td > < td class = "name" onclick = "toggle('isClass0')" > < a name = "isClass0Anchor" > isClass< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isClass0" > < pre > Matches TagDecl object that are spelled with "class."
Example matches C, but not S, U or E.
struct S {};
class C {};
union U {};
enum E {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefinition0')" > < a name = "isDefinition0Anchor" > isDefinition< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefinition0" > < pre > Matches if a declaration has a body attached.
Example matches A, va, fa
class A {};
2018-12-12 03:30:49 +08:00
class B; // Doesn't match, as it has no body.
2015-11-20 15:46:19 +08:00
int va;
2018-12-12 03:30:49 +08:00
extern int vb; // Doesn't match, as it doesn't define the variable.
2015-11-20 15:46:19 +08:00
void fa() {}
2018-12-12 03:30:49 +08:00
void fb(); // Doesn't match, as it has no body.
2017-11-14 22:17:26 +08:00
@interface X
2018-12-12 03:30:49 +08:00
- (void)ma; // Doesn't match, interface is declaration.
2017-11-14 22:17:26 +08:00
@end
@implementation X
- (void)ma {}
@end
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-01-29 20:57:27 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > < / td > < td class = "name" onclick = "toggle('isEnum0')" > < a name = "isEnum0Anchor" > isEnum< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isEnum0" > < pre > Matches TagDecl object that are spelled with "enum."
Example matches E, but not C, S or U.
struct S {};
class C {};
union U {};
enum E {};
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > < / td > < td class = "name" onclick = "toggle('isStruct0')" > < a name = "isStruct0Anchor" > isStruct< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isStruct0" > < pre > Matches TagDecl object that are spelled with "struct."
Example matches S, but not C, U or E.
struct S {};
class C {};
union U {};
enum E {};
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > < / td > < td class = "name" onclick = "toggle('isUnion0')" > < a name = "isUnion0Anchor" > isUnion< / a > < / td > < td > < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isUnion0" > < pre > Matches TagDecl object that are spelled with "union."
Example matches U, but not C, S or E.
struct S {};
class C {};
union U {};
enum E {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('equalsIntegralValue0')" > < a name = "equalsIntegralValue0Anchor" > equalsIntegralValue< / a > < / td > < td > std::string Value< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsIntegralValue0" > < pre > Matches a TemplateArgument of integral type with a given value.
Note that 'Value' is a string as the template argument's value is
an arbitrary precision integer. 'Value' must be euqal to the canonical
representation of that integral value in base 10.
Given
2018-01-23 06:34:15 +08:00
template< int T> struct C {};
2015-11-20 15:46:19 +08:00
C< 42> c;
classTemplateSpecializationDecl(
hasAnyTemplateArgument(equalsIntegralValue("42")))
matches the implicit instantiation of C in C< 42> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('isIntegral0')" > < a name = "isIntegral0Anchor" > isIntegral< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isIntegral0" > < pre > Matches a TemplateArgument that is an integral value.
Given
2018-01-23 06:34:15 +08:00
template< int T> struct C {};
2015-11-20 15:46:19 +08:00
C< 42> c;
classTemplateSpecializationDecl(
hasAnyTemplateArgument(isIntegral()))
matches the implicit instantiation of C in C< 42>
with isIntegral() matching 42.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > < / td > < td class = "name" onclick = "toggle('templateArgumentCountIs1')" > < a name = "templateArgumentCountIs1Anchor" > templateArgumentCountIs< / a > < / td > < td > unsigned N< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "templateArgumentCountIs1" > < pre > Matches if the number of template arguments equals N.
Given
template< typename T> struct C {};
C< int> c;
classTemplateSpecializationDecl(templateArgumentCountIs(1))
matches C< int> .
< / pre > < / td > < / tr >
2020-11-03 22:36:50 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('isExpandedFromMacro2')" > < a name = "isExpandedFromMacro2Anchor" > isExpandedFromMacro< / a > < / td > < td > std::string MacroName< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isExpandedFromMacro2" > < pre > Matches statements that are (transitively) expanded from the named macro.
Does not match if only part of the statement is expanded from that macro or
if different parts of the the statement are expanded from different
appearances of the macro.
< / pre > < / td > < / tr >
2020-07-02 21:52:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInFileMatching2')" > < a name = "isExpansionInFileMatching2Anchor" > isExpansionInFileMatching< / a > < / td > < td > StringRef RegExp, Regex::RegexFlags Flags = NoFlags< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInFileMatching2" > < pre > Matches AST nodes that were expanded within files whose name is
partially matching a given regex.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
#include "ASTMatcher.h"
class X {};
ASTMatcher.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2020-07-02 21:52:24 +08:00
If the matcher is used in clang-query, RegexFlags parameter
should be passed as a quoted string. e.g: "NoFlags".
Flags can be combined with '|' example "IgnoreCase | BasicRegex"
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInMainFile2')" > < a name = "isExpansionInMainFile2Anchor" > isExpansionInMainFile< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInMainFile2" > < pre > Matches AST nodes that were expanded within the main-file.
Example matches X but not Y
(matcher = cxxRecordDecl(isExpansionInMainFile())
#include < Y.h>
class X {};
Y.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('isExpansionInSystemHeader2')" > < a name = "isExpansionInSystemHeader2Anchor" > isExpansionInSystemHeader< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpansionInSystemHeader2" > < pre > Matches AST nodes that were expanded within system-header-files.
Example matches Y but not X
(matcher = cxxRecordDecl(isExpansionInSystemHeader())
#include < SystemHeader.h>
class X {};
SystemHeader.h:
class Y {};
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('booleanType0')" > < a name = "booleanType0Anchor" > booleanType< / a > < / td > < td > < / td > < / tr >
2015-12-23 05:06:36 +08:00
< tr > < td colspan = "4" class = "doc" id = "booleanType0" > < pre > Matches type bool.
Given
struct S { bool func(); };
functionDecl(returns(booleanType()))
matches "bool func();"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('equalsBoundNode2')" > < a name = "equalsBoundNode2Anchor" > equalsBoundNode< / a > < / td > < td > std::string ID< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsBoundNode2" > < pre > Matches if a node equals a previously bound node.
Matches a node if it equals the node previously bound to ID.
Given
class X { int a; int b; };
cxxRecordDecl(
has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
matches the class X, as a and b have the same type.
Note that when multiple matches are involved via forEach* matchers,
equalsBoundNodes acts as a filter.
For example:
compoundStmt(
forEachDescendant(varDecl().bind("d")),
forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
will trigger a match for each combination of variable declaration
and reference to that variable declaration within a compound statement.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('equalsNode2')" > < a name = "equalsNode2Anchor" > equalsNode< / a > < / td > < td > const Type* Other< / td > < / tr >
2016-05-05 04:45:00 +08:00
< tr > < td colspan = "4" class = "doc" id = "equalsNode2" > < pre > Matches if a node equals another node.
Type has pointer identity in the AST.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('realFloatingPointType0')" > < a name = "realFloatingPointType0Anchor" > realFloatingPointType< / a > < / td > < td > < / td > < / tr >
2016-02-19 00:36:01 +08:00
< tr > < td colspan = "4" class = "doc" id = "realFloatingPointType0" > < pre > Matches any real floating-point type (float, double, long double).
Given
int i;
float f;
realFloatingPointType()
matches "float f" but not "int i"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('voidType0')" > < a name = "voidType0Anchor" > voidType< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "voidType0" > < pre > Matches type void.
Given
struct S { void func(); };
functionDecl(returns(voidType()))
matches "void func();"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" > UnaryExprOrTypeTraitExpr< / a > > < / td > < td class = "name" onclick = "toggle('ofKind0')" > < a name = "ofKind0Anchor" > ofKind< / a > < / td > < td > UnaryExprOrTypeTrait Kind< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ofKind0" > < pre > Matches unary expressions of a certain kind.
Given
int x;
int s = sizeof(x) + alignof(x)
unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
matches sizeof(x)
2019-03-21 23:33:43 +08:00
If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html" > UnaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyOperatorName3')" > < a name = "hasAnyOperatorName3Anchor" > hasAnyOperatorName< / a > < / td > < td > StringRef, ..., StringRef< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyOperatorName3" > < pre > Matches operator expressions (binary or unary) that have any of the
2020-02-25 15:51:07 +08:00
specified names.
hasAnyOperatorName("+", "-")
Is equivalent to
anyOf(hasOperatorName("+"), hasOperatorName("-"))
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html" > UnaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasOperatorName3')" > < a name = "hasOperatorName3Anchor" > hasOperatorName< / a > < / td > < td > std::string Name< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasOperatorName3" > < pre > Matches the operator Name of operator expressions (binary or
2015-11-20 15:46:19 +08:00
unary).
Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
!(a || b)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html" > UnresolvedMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('isArrow1')" > < a name = "isArrow1Anchor" > isArrow< / a > < / td > < td > < / td > < / tr >
2018-09-18 02:48:43 +08:00
< tr > < td colspan = "4" class = "doc" id = "isArrow1" > < pre > Matches member expressions that are called with '-> ' as opposed
to '.'.
Member calls on the implicit this pointer match as called with '-> '.
Given
class Y {
void x() { this-> x(); x(); Y y; y.x(); a; this-> b; Y::b; }
template < class T> void f() { this-> f< T> (); f< T> (); }
int a;
static int b;
};
template < class T>
class Z {
void x() { this-> m; }
};
memberExpr(isArrow())
matches this-> x, x, y.x, a, this-> b
cxxDependentScopeMemberExpr(isArrow())
matches this-> m
unresolvedMemberExpr(isArrow())
matches this-> f< T> , f< T>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAutomaticStorageDuration0')" > < a name = "hasAutomaticStorageDuration0Anchor" > hasAutomaticStorageDuration< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAutomaticStorageDuration0" > < pre > Matches a variable declaration that has automatic storage duration.
Example matches x, but not y, z, or a.
(matcher = varDecl(hasAutomaticStorageDuration())
void f() {
int x;
static int y;
thread_local int z;
}
int a;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasGlobalStorage0')" > < a name = "hasGlobalStorage0Anchor" > hasGlobalStorage< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasGlobalStorage0" > < pre > Matches a variable declaration that does not have local storage.
Example matches y and z (matcher = varDecl(hasGlobalStorage())
void f() {
int x;
static int y;
}
int z;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasLocalStorage0')" > < a name = "hasLocalStorage0Anchor" > hasLocalStorage< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasLocalStorage0" > < pre > Matches a variable declaration that has function scope and is a
non-static local variable.
Example matches x (matcher = varDecl(hasLocalStorage())
void f() {
int x;
static int y;
}
int z;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasStaticStorageDuration0')" > < a name = "hasStaticStorageDuration0Anchor" > hasStaticStorageDuration< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasStaticStorageDuration0" > < pre > Matches a variable declaration that has static storage duration.
2016-09-27 15:53:20 +08:00
It includes the variable declared at namespace scope and those declared
with "static" and "extern" storage class specifiers.
2015-11-20 15:46:19 +08:00
void f() {
int x;
static int y;
thread_local int z;
}
int a;
2016-09-27 15:53:20 +08:00
static int b;
extern int c;
varDecl(hasStaticStorageDuration())
matches the function declaration y, a, b and c.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasThreadStorageDuration0')" > < a name = "hasThreadStorageDuration0Anchor" > hasThreadStorageDuration< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasThreadStorageDuration0" > < pre > Matches a variable declaration that has thread storage duration.
Example matches z, but not x, z, or a.
(matcher = varDecl(hasThreadStorageDuration())
void f() {
int x;
static int y;
thread_local int z;
}
int a;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isConstexpr0')" > < a name = "isConstexpr0Anchor" > isConstexpr< / a > < / td > < td > < / td > < / tr >
2018-05-08 19:53:32 +08:00
< tr > < td colspan = "4" class = "doc" id = "isConstexpr0" > < pre > Matches constexpr variable and function declarations,
and if constexpr.
2015-11-20 15:46:19 +08:00
Given:
constexpr int foo = 42;
constexpr int bar();
2018-05-08 19:53:32 +08:00
void baz() { if constexpr(1 > 0) {} }
2015-11-20 15:46:19 +08:00
varDecl(isConstexpr())
matches the declaration of foo.
functionDecl(isConstexpr())
matches the declaration of bar.
2018-05-08 19:53:32 +08:00
ifStmt(isConstexpr())
matches the if statement in baz.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDefinition1')" > < a name = "isDefinition1Anchor" > isDefinition< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDefinition1" > < pre > Matches if a declaration has a body attached.
Example matches A, va, fa
class A {};
2018-12-12 03:30:49 +08:00
class B; // Doesn't match, as it has no body.
2015-11-20 15:46:19 +08:00
int va;
2018-12-12 03:30:49 +08:00
extern int vb; // Doesn't match, as it doesn't define the variable.
2015-11-20 15:46:19 +08:00
void fa() {}
2018-12-12 03:30:49 +08:00
void fb(); // Doesn't match, as it has no body.
2017-11-14 22:17:26 +08:00
@interface X
2018-12-12 03:30:49 +08:00
- (void)ma; // Doesn't match, interface is declaration.
2017-11-14 22:17:26 +08:00
@end
@implementation X
- (void)ma {}
@end
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html" > TagDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExceptionVariable0')" > < a name = "isExceptionVariable0Anchor" > isExceptionVariable< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExceptionVariable0" > < pre > Matches a variable declaration that is an exception variable from
a C++ catch block, or an Objective-C statement.
Example matches x (matcher = varDecl(isExceptionVariable())
void f(int y) {
try {
} catch (int x) {
}
}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExplicitTemplateSpecialization1')" > < a name = "isExplicitTemplateSpecialization1Anchor" > isExplicitTemplateSpecialization< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExplicitTemplateSpecialization1" > < pre > Matches explicit template specializations of function, class, or
static member variable template instantiations.
Given
template< typename T> void A(T t) { }
template< > void A(int N) { }
functionDecl(isExplicitTemplateSpecialization())
matches the specialization A< int> ().
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-01-18 00:50:14 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isExternC1')" > < a name = "isExternC1Anchor" > isExternC< / a > < / td > < td > < / td > < / tr >
2017-09-23 03:29:38 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExternC1" > < pre > Matches extern "C" function or variable declarations.
2016-08-04 18:02:03 +08:00
Given:
extern "C" void f() {}
extern "C" { void g() {} }
void h() {}
2017-09-23 03:29:38 +08:00
extern "C" int x = 1;
extern "C" int y = 2;
int z = 3;
2016-08-04 18:02:03 +08:00
functionDecl(isExternC())
2017-09-23 03:29:38 +08:00
matches the declaration of f and g, but not the declaration of h.
varDecl(isExternC())
matches the declaration of x and y, but not the declaration of z.
2016-08-04 18:02:03 +08:00
< / pre > < / td > < / tr >
2018-01-18 00:50:14 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isStaticLocal0')" > < a name = "isStaticLocal0Anchor" > isStaticLocal< / a > < / td > < td > < / td > < / tr >
2018-10-29 21:47:56 +08:00
< tr > < td colspan = "4" class = "doc" id = "isStaticLocal0" > < pre > Matches a static variable with local scope.
Example matches y (matcher = varDecl(isStaticLocal()))
void f() {
int x;
static int y;
}
static int z;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isStaticStorageClass1')" > < a name = "isStaticStorageClass1Anchor" > isStaticStorageClass< / a > < / td > < td > < / td > < / tr >
2018-12-12 03:30:49 +08:00
< tr > < td colspan = "4" class = "doc" id = "isStaticStorageClass1" > < pre > Matches variable/function declarations that have "static" storage
2016-09-27 15:53:20 +08:00
class specifier ("static" keyword) written in the source.
2016-09-27 00:01:52 +08:00
Given:
static void f() {}
static int i = 0;
2016-09-27 15:53:20 +08:00
extern int j;
int k;
2016-09-27 00:01:52 +08:00
functionDecl(isStaticStorageClass())
matches the function declaration f.
varDecl(isStaticStorageClass())
matches the variable declaration i.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('isTemplateInstantiation1')" > < a name = "isTemplateInstantiation1Anchor" > isTemplateInstantiation< / a > < / td > < td > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isTemplateInstantiation1" > < pre > Matches template instantiations of function, class, or static
member variable template instantiations.
Given
template < typename T> class X {}; class A {}; X< A> x;
or
template < typename T> class X {}; class A {}; template class X< A> ;
2018-02-21 22:22:42 +08:00
or
template < typename T> class X {}; class A {}; extern template class X< A> ;
2015-11-20 15:46:19 +08:00
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
matches the template instantiation of X< A> .
But given
template < typename T> class X {}; class A {};
template < > class X< A> {}; X< A> x;
cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
does not match, as X< A> is an explicit template specialization.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2015-11-20 15:57:46 +08:00
<!-- END_NARROWING_MATCHERS -->
< / table >
<!-- ======================================================================= -->
< h2 id = "traversal-matchers" > AST Traversal Matchers< / h2 >
<!-- ======================================================================= -->
< p > Traversal matchers specify the relationship to other nodes that are
reachable from the current node.< / p >
< p > Note that there are special traversal matchers (has, hasDescendant, forEach and
forEachDescendant) which work on all nodes and allow users to write more generic
match expressions.< / p >
< table >
< tr style = "text-align:left" > < th > Return type< / th > < th > Name< / th > < th > Parameters< / th > < / tr >
2015-11-20 15:46:19 +08:00
<!-- START_TRAVERSAL_MATCHERS -->
2021-01-05 09:33:13 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('binaryOperation0')" > < a name = "binaryOperation0Anchor" > binaryOperation< / a > < / td > < td > Matcher< *> ...Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "binaryOperation0" > < pre > Matches nodes which can be used with binary operators.
The code
var1 != var2;
2021-01-06 07:04:31 +08:00
might be represented in the clang AST as a binaryOperator, a
cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
2021-01-05 09:33:13 +08:00
* whether the types of var1 and var2 are fundamental (binaryOperator) or at
least one is a class type (cxxOperatorCallExpr)
* whether the code appears in a template declaration, if at least one of the
vars is a dependent-type (binaryOperator)
2021-01-06 07:04:31 +08:00
* whether the code relies on a rewritten binary operator, such as a
spaceship operator or an inverted equality operator
(cxxRewrittenBinaryOperator)
2021-01-05 09:33:13 +08:00
This matcher elides details in places where the matchers for the nodes are
compatible.
Given
binaryOperation(
hasOperatorName("!="),
hasLHS(expr().bind("lhs")),
hasRHS(expr().bind("rhs"))
)
matches each use of "!=" in:
struct S{
bool operator!=(const S& ) const;
};
void foo()
{
1 != 2;
S() != S();
}
template< typename T>
void templ()
{
1 != 2;
T() != S();
}
2021-01-06 07:04:31 +08:00
struct HasOpEq
{
bool operator==(const HasOpEq & ) const;
};
void inverse()
{
HasOpEq s1;
HasOpEq s2;
if (s1 != s2)
return;
}
struct HasSpaceship
{
bool operator< => (const HasOpEq & ) const;
};
void use_spaceship()
{
HasSpaceship s1;
HasSpaceship s2;
if (s1 != s2)
return;
}
2021-01-05 09:33:13 +08:00
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('eachOf0')" > < a name = "eachOf0Anchor" > eachOf< / a > < / td > < td > Matcher< *> , ..., Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "eachOf0" > < pre > Matches if any of the given matchers matches.
Unlike anyOf, eachOf will generate a match result for each
matching submatcher.
For example, in:
class A { int a; int b; };
The matcher:
cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
has(fieldDecl(hasName("b")).bind("v"))))
will generate two results binding "v", the first of which binds
the field declaration of a, the second the field declaration of
b.
Usable as: Any Matcher
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('findAll0')" > < a name = "findAll0Anchor" > findAll< / a > < / td > < td > Matcher< *> Matcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "findAll0" > < pre > Matches if the node or any descendant matches.
Generates results for each match.
For example, in:
class A { class B {}; class C {}; };
The matcher:
cxxRecordDecl(hasName("::A"),
findAll(cxxRecordDecl(isDefinition()).bind("m")))
will generate results for A, B and C.
Usable as: Any Matcher
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('forEachDescendant0')" > < a name = "forEachDescendant0Anchor" > forEachDescendant< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "forEachDescendant0" > < pre > Matches AST nodes that have descendant AST nodes that match the
provided matcher.
2018-01-23 06:34:15 +08:00
Example matches X, A, A::X, B, B::C, B::C::X
2015-11-20 15:46:19 +08:00
(matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
2018-01-23 06:34:15 +08:00
class X {};
2018-12-12 03:30:49 +08:00
class A { class X {}; }; // Matches A, because A::X is a class of name
// X inside A.
2015-11-20 15:46:19 +08:00
class B { class C { class X {}; }; };
DescendantT must be an AST base type.
As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
each result that matches instead of only on the first one.
Note: Recursively combined ForEachDescendant can cause many matches:
cxxRecordDecl(forEachDescendant(cxxRecordDecl(
forEachDescendant(cxxRecordDecl())
)))
will match 10 times (plus injected class name matches) on:
class A { class B { class C { class D { class E {}; }; }; }; };
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('forEach0')" > < a name = "forEach0Anchor" > forEach< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "forEach0" > < pre > Matches AST nodes that have child AST nodes that match the
provided matcher.
2018-01-23 06:34:15 +08:00
Example matches X, Y, Y::X, Z::Y, Z::Y::X
2015-11-20 15:46:19 +08:00
(matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
2018-01-23 06:34:15 +08:00
class X {};
2018-12-12 03:30:49 +08:00
class Y { class X {}; }; // Matches Y, because Y::X is a class of name X
// inside Y.
class Z { class Y { class X {}; }; }; // Does not match Z.
2015-11-20 15:46:19 +08:00
ChildT must be an AST base type.
As opposed to 'has', 'forEach' will cause a match for each result that
matches instead of only on the first one.
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('hasAncestor0')" > < a name = "hasAncestor0Anchor" > hasAncestor< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAncestor0" > < pre > Matches AST nodes that have an ancestor that matches the provided
matcher.
Given
void f() { if (true) { int x = 42; } }
void g() { for (;;) { int x = 43; } }
expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('hasDescendant0')" > < a name = "hasDescendant0Anchor" > hasDescendant< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasDescendant0" > < pre > Matches AST nodes that have descendant AST nodes that match the
provided matcher.
Example matches X, Y, Z
(matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
2018-12-12 03:30:49 +08:00
class X {}; // Matches X, because X::X is a class of name X inside X.
2015-11-20 15:46:19 +08:00
class Y { class X {}; };
class Z { class Y { class X {}; }; };
DescendantT must be an AST base type.
Usable as: Any Matcher
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('has0')" > < a name = "has0Anchor" > has< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "has0" > < pre > Matches AST nodes that have child AST nodes that match the
provided matcher.
Example matches X, Y
(matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
2018-12-12 03:30:49 +08:00
class X {}; // Matches X, because X::X is a class of name X inside X.
2015-11-20 15:46:19 +08:00
class Y { class X {}; };
2018-12-12 03:30:49 +08:00
class Z { class Y { class X {}; }; }; // Does not match Z.
2015-11-20 15:46:19 +08:00
ChildT must be an AST base type.
Usable as: Any Matcher
2016-06-07 02:52:17 +08:00
Note that has is direct matcher, so it also matches things like implicit
casts and paren casts. If you are matching with expr then you should
probably consider using ignoringParenImpCasts like:
has(ignoringParenImpCasts(expr())).
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('hasParent0')" > < a name = "hasParent0Anchor" > hasParent< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasParent0" > < pre > Matches AST nodes that have a parent that matches the provided
matcher.
Given
void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
Usable as: Any Matcher
< / pre > < / td > < / tr >
2021-02-02 05:23:14 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('invocation0')" > < a name = "invocation0Anchor" > invocation< / a > < / td > < td > Matcher< *> ...Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "invocation0" > < pre > Matches function calls and constructor calls
Because CallExpr and CXXConstructExpr do not share a common
base class with API accessing arguments etc, AST Matchers for code
which should match both are typically duplicated. This matcher
removes the need for duplication.
Given code
struct ConstructorTakesInt
{
ConstructorTakesInt(int i) {}
};
void callTakesInt(int i)
{
}
void doCall()
{
callTakesInt(42);
}
void doConstruct()
{
ConstructorTakesInt cti(42);
}
The matcher
invocation(hasArgument(0, integerLiteral(equals(42))))
matches the expression in both doCall and doConstruct
< / pre > < / td > < / tr >
2020-03-04 04:04:08 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('optionally0')" > < a name = "optionally0Anchor" > optionally< / a > < / td > < td > Matcher< *> < / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "optionally0" > < pre > Matches any node regardless of the submatcher.
2020-01-09 03:09:29 +08:00
2020-03-04 04:04:08 +08:00
However, optionally will retain any bindings generated by the submatcher.
Useful when additional information which may or may not present about a main
matching node is desired.
2020-01-09 03:09:29 +08:00
For example, in:
class Foo {
int bar;
}
The matcher:
cxxRecordDecl(
optionally(has(
fieldDecl(hasName("bar")).bind("var")
))).bind("record")
will produce a result binding for both "record" and "var".
The matcher will produce a "record" binding for even if there is no data
member named "bar" in that class.
Usable as: Any Matcher
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< *> < / td > < td class = "name" onclick = "toggle('traverse0')" > < a name = "traverse0Anchor" > traverse< / a > < / td > < td > TraversalKind TK, Matcher< *> InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "traverse0" > < pre > Causes all nested matchers to be matched with the specified traversal kind.
Given
void foo()
{
int i = 3.0;
}
The matcher
2020-11-22 02:47:51 +08:00
traverse(TK_IgnoreUnlessSpelledInSource,
2020-02-26 09:56:21 +08:00
varDecl(hasInitializer(floatLiteral().bind("init")))
)
matches the variable declaration with "init" bound to the "3.0".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html" > AbstractConditionalOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition5')" > < a name = "hasCondition5Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2016-05-30 23:25:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition5" > < pre > Matches the condition expression of an if statement, for loop,
switch statement or conditional operator.
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html" > AbstractConditionalOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasFalseExpression0')" > < a name = "hasFalseExpression0Anchor" > hasFalseExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasFalseExpression0" > < pre > Matches the false branch expression of a conditional operator
(binary or ternary).
Example matches b
condition ? a : b
condition ?: b
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html" > AbstractConditionalOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasTrueExpression0')" > < a name = "hasTrueExpression0Anchor" > hasTrueExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTrueExpression0" > < pre > Matches the true branch expression of a conditional operator.
Example 1 (conditional ternary operator): matches a
condition ? a : b
Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
condition ?: b
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration15')" > < a name = "hasDeclaration15Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration15" > < pre > Matches a node if the declaration associated with that node
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html" > ArraySubscriptExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasBase0')" > < a name = "hasBase0Anchor" > hasBase< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBase0" > < pre > Matches the base expression of an array subscript expression.
Given
int i[5];
void f() { i[1] = 42; }
arraySubscriptExpression(hasBase(implicitCastExpr(
hasSourceExpression(declRefExpr()))))
matches i[1] with the declRefExpr() matching i
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html" > ArraySubscriptExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasIndex0')" > < a name = "hasIndex0Anchor" > hasIndex< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasIndex0" > < pre > Matches the index expression of an array subscript expression.
Given
int i[5];
void f() { i[1] = 42; }
arraySubscriptExpression(hasIndex(integerLiteral()))
matches i[1] with the integerLiteral() matching 1
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html" > ArraySubscriptExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasLHS3')" > < a name = "hasLHS3Anchor" > hasLHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasLHS3" > < pre > Matches the left hand side of binary operator expressions.
2015-11-20 15:46:19 +08:00
Example matches a (matcher = binaryOperator(hasLHS()))
a || b
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html" > ArraySubscriptExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasRHS3')" > < a name = "hasRHS3Anchor" > hasRHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasRHS3" > < pre > Matches the right hand side of binary operator expressions.
2015-11-20 15:46:19 +08:00
Example matches b (matcher = binaryOperator(hasRHS()))
a || b
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html" > ArrayType< / a > > < / td > < td class = "name" onclick = "toggle('hasElementType0')" > < a name = "hasElementType0Anchor" > hasElementType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasElementType0" > < pre > Matches arrays and C99 complex types that have a specific element
type.
Given
struct A {};
A a[7];
int b[7];
arrayType(hasElementType(builtinType()))
matches "int b[7]"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html" > ArrayType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html" > ComplexType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html" > AtomicType< / a > > < / td > < td class = "name" onclick = "toggle('hasValueType0')" > < a name = "hasValueType0Anchor" > hasValueType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasValueType0" > < pre > Matches atomic types with a specific value type.
Given
_Atomic(int) i;
_Atomic(float) f;
atomicType(hasValueType(isInteger()))
matches "_Atomic(int) i"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html" > AtomicType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AutoType.html" > AutoType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeducedType0')" > < a name = "hasDeducedType0Anchor" > hasDeducedType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeducedType0" > < pre > Matches AutoType nodes where the deduced type is a specific type.
Note: There is no TypeLoc for the deduced type and thus no
getDeducedLoc() matcher.
Given
auto a = 1;
auto b = 2.0;
autoType(hasDeducedType(isInteger()))
matches "auto a"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AutoType.html" > AutoType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2021-01-02 08:01:03 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasEitherOperand0')" > < a name = "hasEitherOperand0Anchor" > hasEitherOperand< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasEitherOperand0" > < pre > Matches if either the left hand side or the right hand side of a
binary operator matches.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasLHS0')" > < a name = "hasLHS0Anchor" > hasLHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasLHS0" > < pre > Matches the left hand side of binary operator expressions.
Example matches a (matcher = binaryOperator(hasLHS()))
a || b
< / pre > < / td > < / tr >
2021-01-02 08:01:03 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasOperands0')" > < a name = "hasOperands0Anchor" > hasOperands< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher1, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher2< / td > < / tr >
2020-05-16 09:00:33 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasOperands0" > < pre > Matches if both matchers match with opposite sides of the binary operator.
Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
integerLiteral(equals(2)))
1 + 2 // Match
2 + 1 // Match
1 + 1 // No match
2 + 2 // No match
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html" > BinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasRHS0')" > < a name = "hasRHS0Anchor" > hasRHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasRHS0" > < pre > Matches the right hand side of binary operator expressions.
Example matches b (matcher = binaryOperator(hasRHS()))
a || b
< / pre > < / td > < / tr >
2021-01-30 23:50:44 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html" > BindingDecl< / a > > < / td > < td class = "name" onclick = "toggle('forDecomposition0')" > < a name = "forDecomposition0Anchor" > forDecomposition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "forDecomposition0" > < pre > Matches the DecompositionDecl the binding belongs to.
For example, in:
void foo()
{
int arr[3];
auto & [f, s, t] = arr;
f = 42;
}
The matcher:
bindingDecl(hasName("f"),
forDecomposition(decompositionDecl())
matches 'f' in 'auto & [f, s, t]'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html" > BlockDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyParameter2')" > < a name = "hasAnyParameter2Anchor" > hasAnyParameter< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-05-17 06:47:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyParameter2" > < pre > Matches any parameter of a function or an ObjC method declaration or a
block.
Does not match the 'this' parameter of a method.
Given
class X { void f(int x, int y, int z) {} };
cxxMethodDecl(hasAnyParameter(hasName("y")))
matches f(int x, int y, int z) {}
with hasAnyParameter(...)
matching int y
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
matches the declaration of method f with hasParameter
matching y.
For blocks, given
b = ^(int y) { printf("%d", y) };
the matcher blockDecl(hasAnyParameter(hasName("y")))
matches the declaration of the block b with hasParameter
matching y.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html" > BlockDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasParameter2')" > < a name = "hasParameter2Anchor" > hasParameter< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-05-17 06:47:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasParameter2" > < pre > Matches the n'th parameter of a function or an ObjC method
declaration or a block.
Given
class X { void f(int x) {} };
cxxMethodDecl(hasParameter(0, hasType(varDecl())))
matches f(int x) {}
with hasParameter(...)
matching int x
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasParameter(0, hasName("y")))
matches the declaration of method f with hasParameter
matching y.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > < / td > < td class = "name" onclick = "toggle('pointee0')" > < a name = "pointee0Anchor" > pointee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointee0" > < pre > Narrows PointerType (and similar) matchers to those where the
pointee matches a given matcher.
Given
int *a;
int const *b;
float const *f;
pointerType(pointee(isConstQualified(), isInteger()))
matches "int const *b"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('hasType8')" > < a name = "hasType8Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasType8" > < pre > Overloaded to match the declaration of the expression's or value
2020-04-29 11:00:49 +08:00
declaration's type.
In case of a value declaration (for example a variable declaration),
this resolves one layer of indirection. For example, in the value
declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
declaration of x.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
cxxRecordDecl(hasName("X"))))
2020-04-29 11:00:49 +08:00
class X {};
void y(X & x) { x; X z; }
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2020-04-29 11:00:49 +08:00
Example matches class Derived
(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
class Base {};
class Derived : Base {};
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
< / pre > < / td > < / tr >
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('hasType4')" > < a name = "hasType4Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasType4" > < pre > Matches if the expression's or declaration's type matches a type
matcher.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
and U (matcher = typedefDecl(hasType(asString("int")))
and friend class X (matcher = friendDecl(hasType("X"))
and public virtual X (matcher = cxxBaseSpecifier(hasType(
asString("class X")))
class X {};
void y(X & x) { x; X z; }
typedef int U;
class Y { friend class X; };
class Z : public virtual X {};
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('forEachArgumentWithParam1')" > < a name = "forEachArgumentWithParam1Anchor" > forEachArgumentWithParam< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > ArgMatcher, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > ParamMatcher< / td > < / tr >
2016-01-19 04:28:57 +08:00
< tr > < td colspan = "4" class = "doc" id = "forEachArgumentWithParam1" > < pre > Matches all arguments and their respective ParmVarDecl.
Given
void f(int i);
int y;
f(y);
2016-07-12 14:36:00 +08:00
callExpr(
forEachArgumentWithParam(
declRefExpr(to(varDecl(hasName("y")))),
parmVarDecl(hasType(isInteger()))
))
2016-01-19 04:28:57 +08:00
matches f(y);
with declRefExpr(...)
matching int y
and parmVarDecl(...)
matching int i
< / pre > < / td > < / tr >
2020-09-14 01:30:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('forEachArgumentWithParamType1')" > < a name = "forEachArgumentWithParamType1Anchor" > forEachArgumentWithParamType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > ArgMatcher, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > ParamMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "forEachArgumentWithParamType1" > < pre > Matches all arguments and their respective types for a CallExpr or
CXXConstructExpr. It is very similar to forEachArgumentWithParam but
it works on calls through function pointers as well.
The difference is, that function pointers do not provide access to a
ParmVarDecl, but only the QualType for each argument.
Given
void f(int i);
int y;
f(y);
void (*f_ptr)(int) = f;
f_ptr(y);
callExpr(
forEachArgumentWithParamType(
declRefExpr(to(varDecl(hasName("y")))),
qualType(isInteger()).bind("type)
))
matches f(y) and f_ptr(y)
with declRefExpr(...)
matching int y
and qualType(...)
matching int
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyArgument1')" > < a name = "hasAnyArgument1Anchor" > hasAnyArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyArgument1" > < pre > Matches any argument of a call expression or a constructor call
2018-03-07 10:32:44 +08:00
expression, or an ObjC-message-send expression.
2015-11-20 15:46:19 +08:00
Given
void x(int, int, int) { int y; x(1, y, 42); }
callExpr(hasAnyArgument(declRefExpr()))
matches x(1, y, 42)
with hasAnyArgument(...)
matching y
2018-03-07 10:32:44 +08:00
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
2018-03-21 18:48:00 +08:00
void foo(I *i) { [i f:12]; }
2018-03-07 10:32:44 +08:00
objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
matches [i f:12]
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArgument1')" > < a name = "hasArgument1Anchor" > hasArgument< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasArgument1" > < pre > Matches the n'th argument of a call expression or a constructor
call expression.
Example matches y in x(y)
(matcher = callExpr(hasArgument(0, declRefExpr())))
void x(int) { int y; x(y); }
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration13')" > < a name = "hasDeclaration13Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration13" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('forEachConstructorInitializer0')" > < a name = "forEachConstructorInitializer0Anchor" > forEachConstructorInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "forEachConstructorInitializer0" > < pre > Matches each constructor initializer in a constructor definition.
Given
class A { A() : i(42), j(42) {} int i; int j; };
cxxConstructorDecl(forEachConstructorInitializer(
forField(decl().bind("x"))
))
will trigger two matches, binding for 'i' and 'j' respectively.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html" > CXXConstructorDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyConstructorInitializer0')" > < a name = "hasAnyConstructorInitializer0Anchor" > hasAnyConstructorInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyConstructorInitializer0" > < pre > Matches a constructor initializer.
Given
struct Foo {
Foo() : foo_(1) { }
int foo_;
};
cxxRecordDecl(has(cxxConstructorDecl(
hasAnyConstructorInitializer(anything())
)))
record matches Foo, hasAnyConstructorInitializer matches foo_(1)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('forField0')" > < a name = "forField0Anchor" > forField< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html" > FieldDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "forField0" > < pre > Matches the field declaration of a constructor initializer.
Given
struct Foo {
Foo() : foo_(1) { }
int foo_;
};
cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
forField(hasName("foo_"))))))
matches Foo
with forField matching foo_
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html" > CXXCtorInitializer< / a > > < / td > < td class = "name" onclick = "toggle('withInitializer0')" > < a name = "withInitializer0Anchor" > withInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "withInitializer0" > < pre > Matches the initializer expression of a constructor initializer.
Given
struct Foo {
Foo() : foo_(1) { }
int foo_;
};
cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
withInitializer(integerLiteral(equals(1)))))))
matches Foo
with withInitializer matching (1)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html" > CXXDependentScopeMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasObjectExpression2')" > < a name = "hasObjectExpression2Anchor" > hasObjectExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasObjectExpression2" > < pre > Matches a member expression where the object expression is matched by a
given matcher. Implicit object expressions are included; that is, it matches
use of implicit `this`.
2018-08-24 01:16:06 +08:00
Given
2019-02-09 00:00:44 +08:00
struct X {
int m;
int f(X x) { x.m; return m; }
};
memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
matches `x.m`, but not `m`; however,
memberExpr(hasObjectExpression(hasType(pointsTo(
cxxRecordDecl(hasName("X"))))))
matches `m` (aka. `this-> m`), but not `x.m`.
2018-08-24 01:16:06 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html" > CXXForRangeStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasBody3')" > < a name = "hasBody3Anchor" > hasBody< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBody3" > < pre > < / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2020-01-03 02:37:41 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html" > CXXForRangeStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasInitStatement2')" > < a name = "hasInitStatement2Anchor" > hasInitStatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasInitStatement2" > < pre > Matches selection statements with initializer.
Given:
2020-01-09 03:09:29 +08:00
void foo() {
2020-01-03 02:37:41 +08:00
if (int i = foobar(); i > 0) {}
switch (int i = foobar(); i) {}
2020-01-09 03:09:29 +08:00
for (auto& a = get_range(); auto& x : a) {}
2020-01-03 02:37:41 +08:00
}
2020-01-09 03:09:29 +08:00
void bar() {
2020-01-03 02:37:41 +08:00
if (foobar() > 0) {}
switch (foobar()) {}
2020-01-09 03:09:29 +08:00
for (auto& x : get_range()) {}
2020-01-03 02:37:41 +08:00
}
ifStmt(hasInitStatement(anything()))
matches the if statement in foo but not in bar.
switchStmt(hasInitStatement(anything()))
matches the switch statement in foo but not in bar.
cxxForRangeStmt(hasInitStatement(anything()))
matches the range for statement in foo but not in bar.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html" > CXXForRangeStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasLoopVariable0')" > < a name = "hasLoopVariable0Anchor" > hasLoopVariable< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasLoopVariable0" > < pre > Matches the initialization statement of a for loop.
Example:
forStmt(hasLoopVariable(anything()))
matches 'int x' in
for (int x : a) { }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html" > CXXForRangeStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasRangeInit0')" > < a name = "hasRangeInit0Anchor" > hasRangeInit< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasRangeInit0" > < pre > Matches the range initialization statement of a for loop.
Example:
forStmt(hasRangeInit(anything()))
matches 'a' in
for (int x : a) { }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html" > CXXMemberCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('onImplicitObjectArgument0')" > < a name = "onImplicitObjectArgument0Anchor" > onImplicitObjectArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "onImplicitObjectArgument0" > < pre > Matches on the implicit object argument of a member call expression. Unlike
`on`, matches the argument directly without stripping away anything.
Given
class Y { public: void m(); };
Y g();
class X : public Y { void g(); };
void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
cxxMemberCallExpr(onImplicitObjectArgument(hasType(
cxxRecordDecl(hasName("Y")))))
matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
cxxMemberCallExpr(on(callExpr()))
does not match `(g()).m()`, because the parens are not ignored.
FIXME: Overload to allow directly matching types?
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html" > CXXMemberCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('on0')" > < a name = "on0Anchor" > on< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "on0" > < pre > Matches on the implicit object argument of a member call expression, after
stripping off any parentheses or implicit casts.
2015-11-20 15:46:19 +08:00
2019-02-09 00:00:44 +08:00
Given
class Y { public: void m(); };
Y g();
class X : public Y {};
void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
matches `y.m()` and `(g()).m()`.
cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
matches `x.m()`.
cxxMemberCallExpr(on(callExpr()))
matches `(g()).m()`.
2015-11-20 15:46:19 +08:00
FIXME: Overload to allow directly matching types?
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html" > CXXMemberCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('thisPointerType1')" > < a name = "thisPointerType1Anchor" > thisPointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "thisPointerType1" > < pre > Overloaded to match the type's declaration.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html" > CXXMemberCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('thisPointerType0')" > < a name = "thisPointerType0Anchor" > thisPointerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "thisPointerType0" > < pre > Matches if the type of the expression's implicit object argument either
matches the InnerMatcher, or is a pointer to a type that matches the
InnerMatcher.
Given
class Y { public: void m(); };
class X : public Y { void g(); };
void z() { Y y; y.m(); Y *p; p-> m(); X x; x.m(); x.g(); }
cxxMemberCallExpr(thisPointerType(hasDeclaration(
cxxRecordDecl(hasName("Y")))))
matches `y.m()`, `p-> m()` and `x.m()`.
cxxMemberCallExpr(thisPointerType(hasDeclaration(
cxxRecordDecl(hasName("X")))))
matches `x.g()`.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('forEachOverridden0')" > < a name = "forEachOverridden0Anchor" > forEachOverridden< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > InnerMatcher< / td > < / tr >
2018-04-06 23:14:32 +08:00
< tr > < td colspan = "4" class = "doc" id = "forEachOverridden0" > < pre > Matches each method overridden by the given method. This matcher may
2016-07-05 15:49:31 +08:00
produce multiple matches.
Given
class A { virtual void f(); };
class B : public A { void f(); };
class C : public B { void f(); };
cxxMethodDecl(ofClass(hasName("C")),
forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
that B::f is not overridden by C::f).
The check can produce multiple matches in case of multiple inheritance, e.g.
class A1 { virtual void f(); };
class A2 { virtual void f(); };
class C : public A1, public A2 { void f(); };
cxxMethodDecl(ofClass(hasName("C")),
forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
once with "b" binding "A2::f" and "d" binding "C::f".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('ofClass0')" > < a name = "ofClass0Anchor" > ofClass< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ofClass0" > < pre > Matches the class declaration that the given method declaration
belongs to.
FIXME: Generalize this for other kinds of declarations.
FIXME: What other kind of declarations would we need to generalize
this to?
Example matches A() in the last line
(matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
ofClass(hasName("A"))))))
class A {
public:
A();
};
A a = A();
< / pre > < / td > < / tr >
2020-01-30 18:15:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyPlacementArg0')" > < a name = "hasAnyPlacementArg0Anchor" > hasAnyPlacementArg< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyPlacementArg0" > < pre > Matches any placement new expression arguments.
Given:
MyClass *p1 = new (Storage) MyClass();
cxxNewExpr(hasAnyPlacementArg(anything()))
matches the expression 'new (Storage, 16) MyClass()'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArraySize0')" > < a name = "hasArraySize0Anchor" > hasArraySize< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2017-11-23 20:43:20 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasArraySize0" > < pre > Matches array new expressions with a given array size.
Given:
MyClass *p1 = new MyClass[10];
2019-12-08 23:14:31 +08:00
cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
2017-11-23 20:43:20 +08:00
matches the expression 'new MyClass[10]'.
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration12')" > < a name = "hasDeclaration12Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration12" > < pre > Matches a node if the declaration associated with that node
2016-11-01 06:04:07 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2016-11-01 06:04:07 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2016-11-01 06:04:07 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2016-11-01 06:04:07 +08:00
< / pre > < / td > < / tr >
2020-01-30 18:15:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasPlacementArg0')" > < a name = "hasPlacementArg0Anchor" > hasPlacementArg< / a > < / td > < td > unsigned Index, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasPlacementArg0" > < pre > Matches placement new expression arguments.
Given:
MyClass *p1 = new (Storage, 16) MyClass();
cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
matches the expression 'new (Storage, 16) MyClass()'.
< / pre > < / td > < / tr >
2021-01-02 08:01:03 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasEitherOperand1')" > < a name = "hasEitherOperand1Anchor" > hasEitherOperand< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasEitherOperand1" > < pre > Matches if either the left hand side or the right hand side of a
binary operator matches.
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasLHS1')" > < a name = "hasLHS1Anchor" > hasLHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasLHS1" > < pre > Matches the left hand side of binary operator expressions.
Example matches a (matcher = binaryOperator(hasLHS()))
a || b
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasOperands1')" > < a name = "hasOperands1Anchor" > hasOperands< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher1, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher2< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasOperands1" > < pre > Matches if both matchers match with opposite sides of the binary operator.
Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
integerLiteral(equals(2)))
1 + 2 // Match
2 + 1 // Match
1 + 1 // No match
2 + 2 // No match
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasRHS1')" > < a name = "hasRHS1Anchor" > hasRHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasRHS1" > < pre > Matches the right hand side of binary operator expressions.
Example matches b (matcher = binaryOperator(hasRHS()))
a || b
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html" > CXXOperatorCallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasUnaryOperand1')" > < a name = "hasUnaryOperand1Anchor" > hasUnaryOperand< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasUnaryOperand1" > < pre > Matches if the operand of a unary operator matches.
Example matches true (matcher = hasUnaryOperand(
cxxBoolLiteral(equals(true))))
!true
< / pre > < / td > < / tr >
2020-04-29 11:00:49 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyBase0')" > < a name = "hasAnyBase0Anchor" > hasAnyBase< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > BaseSpecMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyBase0" > < pre > Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
2020-06-22 17:56:04 +08:00
Example:
2020-07-07 23:05:09 +08:00
matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
2020-06-22 17:56:04 +08:00
class Foo;
2020-04-29 11:00:49 +08:00
class Bar : Foo {};
class Baz : Bar {};
class SpecialBase;
2020-06-22 17:56:04 +08:00
class Proxy : SpecialBase {}; // matches Proxy
class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived
2020-04-29 11:00:49 +08:00
FIXME: Refactor this and isDerivedFrom to reuse implementation.
< / pre > < / td > < / tr >
2020-07-07 23:05:09 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasDirectBase0')" > < a name = "hasDirectBase0Anchor" > hasDirectBase< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > > BaseSpecMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasDirectBase0" > < pre > Matches C++ classes that have a direct base matching BaseSpecMatcher.
Example:
matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
class Foo;
class Bar : Foo {};
class Baz : Bar {};
class SpecialBase;
class Proxy : SpecialBase {}; // matches Proxy
class IndirectlyDerived : Proxy {}; // doesn't match
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasMethod0')" > < a name = "hasMethod0Anchor" > hasMethod< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html" > CXXMethodDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasMethod0" > < pre > Matches the first method of a class or struct that satisfies InnerMatcher.
Given:
class A { void func(); };
class B { void member(); };
cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
A but not B.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDerivedFrom0')" > < a name = "isDerivedFrom0Anchor" > isDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDerivedFrom0" > < pre > Matches C++ classes that are directly or indirectly derived from a class
matching Base, or Objective-C classes that directly or indirectly
subclass a class matching Base.
2015-11-20 15:46:19 +08:00
Note that a class is not considered to be derived from itself.
Example matches Y, Z, C (Base == hasName("X"))
class X;
2018-12-12 03:30:49 +08:00
class Y : public X {}; // directly derived
class Z : public Y {}; // indirectly derived
2015-11-20 15:46:19 +08:00
typedef X A;
typedef A B;
2018-12-12 03:30:49 +08:00
class C : public B {}; // derived from a typedef of X
2015-11-20 15:46:19 +08:00
In the following example, Bar matches isDerivedFrom(hasName("X")):
class Foo;
typedef Foo X;
2018-12-12 03:30:49 +08:00
class Bar : public Foo {}; // derived from a type that X is a typedef of
2019-08-13 07:23:35 +08:00
In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
@interface NSObject @end
@interface Bar : NSObject @end
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2019-07-25 19:54:13 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDirectlyDerivedFrom0')" > < a name = "isDirectlyDerivedFrom0Anchor" > isDirectlyDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td colspan = "4" class = "doc" id = "isDirectlyDerivedFrom0" > < pre > Matches C++ or Objective-C classes that are directly derived from a class
matching Base.
2019-07-25 19:54:13 +08:00
Note that a class is not considered to be derived from itself.
Example matches Y, C (Base == hasName("X"))
class X;
class Y : public X {}; // directly derived
class Z : public Y {}; // indirectly derived
typedef X A;
typedef A B;
class C : public B {}; // derived from a typedef of X
In the following example, Bar matches isDerivedFrom(hasName("X")):
class Foo;
typedef Foo X;
class Bar : public Foo {}; // derived from a type that X is a typedef of
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > < / td > < td class = "name" onclick = "toggle('isSameOrDerivedFrom0')" > < a name = "isSameOrDerivedFrom0Anchor" > isSameOrDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isSameOrDerivedFrom0" > < pre > Similar to isDerivedFrom(), but also matches classes that directly
match Base.
< / pre > < / td > < / tr >
2021-01-06 07:04:31 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasEitherOperand2')" > < a name = "hasEitherOperand2Anchor" > hasEitherOperand< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasEitherOperand2" > < pre > Matches if either the left hand side or the right hand side of a
binary operator matches.
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasLHS2')" > < a name = "hasLHS2Anchor" > hasLHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasLHS2" > < pre > Matches the left hand side of binary operator expressions.
Example matches a (matcher = binaryOperator(hasLHS()))
a || b
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasOperands2')" > < a name = "hasOperands2Anchor" > hasOperands< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher1, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > Matcher2< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasOperands2" > < pre > Matches if both matchers match with opposite sides of the binary operator.
Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
integerLiteral(equals(2)))
1 + 2 // Match
2 + 1 // Match
1 + 1 // No match
2 + 2 // No match
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html" > CXXRewrittenBinaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasRHS2')" > < a name = "hasRHS2Anchor" > hasRHS< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasRHS2" > < pre > Matches the right hand side of binary operator expressions.
Example matches b (matcher = binaryOperator(hasRHS()))
a || b
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html" > CXXUnresolvedConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyArgument2')" > < a name = "hasAnyArgument2Anchor" > hasAnyArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2018-08-13 07:30:05 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyArgument2" > < pre > Matches any argument of a call expression or a constructor call
expression, or an ObjC-message-send expression.
Given
void x(int, int, int) { int y; x(1, y, 42); }
callExpr(hasAnyArgument(declRefExpr()))
matches x(1, y, 42)
with hasAnyArgument(...)
matching y
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
void foo(I *i) { [i f:12]; }
objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
matches [i f:12]
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html" > CXXUnresolvedConstructExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArgument2')" > < a name = "hasArgument2Anchor" > hasArgument< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasArgument2" > < pre > Matches the n'th argument of a call expression or a constructor
call expression.
Example matches y in x(y)
(matcher = callExpr(hasArgument(0, declRefExpr())))
void x(int) { int y; x(y); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('callee1')" > < a name = "callee1Anchor" > callee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "callee1" > < pre > Matches if the call expression's callee's declaration matches the
given matcher.
Example matches y.x() (matcher = callExpr(callee(
cxxMethodDecl(hasName("x")))))
class Y { public: void x(); };
void z() { Y y; y.x(); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('callee0')" > < a name = "callee0Anchor" > callee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "callee0" > < pre > Matches if the call expression's callee expression matches.
Given
class Y { void x() { this-> x(); x(); Y y; y.x(); } };
void f() { f(); }
callExpr(callee(expr()))
matches this-> x(), x(), y.x(), f()
with callee(...)
matching this-> x, x, y.x, f respectively
2018-11-05 01:02:00 +08:00
Note: Callee cannot take the more general internal::Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > >
2015-11-20 15:46:19 +08:00
because this introduces ambiguous overloads with calls to Callee taking a
2018-11-05 01:02:00 +08:00
internal::Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > , as the matcher hierarchy is purely
2015-11-20 15:46:19 +08:00
implemented in terms of implicit casts.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('forEachArgumentWithParam0')" > < a name = "forEachArgumentWithParam0Anchor" > forEachArgumentWithParam< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > ArgMatcher, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > ParamMatcher< / td > < / tr >
2016-01-19 04:28:57 +08:00
< tr > < td colspan = "4" class = "doc" id = "forEachArgumentWithParam0" > < pre > Matches all arguments and their respective ParmVarDecl.
Given
void f(int i);
int y;
f(y);
2016-07-12 14:36:00 +08:00
callExpr(
forEachArgumentWithParam(
declRefExpr(to(varDecl(hasName("y")))),
parmVarDecl(hasType(isInteger()))
))
2016-01-19 04:28:57 +08:00
matches f(y);
with declRefExpr(...)
matching int y
and parmVarDecl(...)
matching int i
< / pre > < / td > < / tr >
2020-09-14 01:30:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('forEachArgumentWithParamType0')" > < a name = "forEachArgumentWithParamType0Anchor" > forEachArgumentWithParamType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > ArgMatcher, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > ParamMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "forEachArgumentWithParamType0" > < pre > Matches all arguments and their respective types for a CallExpr or
CXXConstructExpr. It is very similar to forEachArgumentWithParam but
it works on calls through function pointers as well.
The difference is, that function pointers do not provide access to a
ParmVarDecl, but only the QualType for each argument.
Given
void f(int i);
int y;
f(y);
void (*f_ptr)(int) = f;
f_ptr(y);
callExpr(
forEachArgumentWithParamType(
declRefExpr(to(varDecl(hasName("y")))),
qualType(isInteger()).bind("type)
))
matches f(y) and f_ptr(y)
with declRefExpr(...)
matching int y
and qualType(...)
matching int
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyArgument0')" > < a name = "hasAnyArgument0Anchor" > hasAnyArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyArgument0" > < pre > Matches any argument of a call expression or a constructor call
2018-03-07 10:32:44 +08:00
expression, or an ObjC-message-send expression.
2015-11-20 15:46:19 +08:00
Given
void x(int, int, int) { int y; x(1, y, 42); }
callExpr(hasAnyArgument(declRefExpr()))
matches x(1, y, 42)
with hasAnyArgument(...)
matching y
2018-03-07 10:32:44 +08:00
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
2018-03-21 18:48:00 +08:00
void foo(I *i) { [i f:12]; }
2018-03-07 10:32:44 +08:00
objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
matches [i f:12]
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArgument0')" > < a name = "hasArgument0Anchor" > hasArgument< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasArgument0" > < pre > Matches the n'th argument of a call expression or a constructor
call expression.
Example matches y in x(y)
(matcher = callExpr(hasArgument(0, declRefExpr())))
void x(int) { int y; x(y); }
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration14')" > < a name = "hasDeclaration14Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration14" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html" > CaseStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCaseConstant0')" > < a name = "hasCaseConstant0Anchor" > hasCaseConstant< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCaseConstant0" > < pre > If the given case statement does not use the GNU case range
extension, matches the constant given in the statement.
Given
switch (1) { case 1: case 1+1: case 3 ... 4: ; }
caseStmt(hasCaseConstant(integerLiteral()))
matches "case 1:"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html" > CastExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasSourceExpression0')" > < a name = "hasSourceExpression0Anchor" > hasSourceExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSourceExpression0" > < pre > Matches if the cast's source expression
or opaque value's source expression matches the given matcher.
Example 1: matches "a string"
(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
class URL { URL(string); };
URL url = "a string";
Example 2: matches 'b' (matcher =
opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
int a = b ?: 1;
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyTemplateArgument0" > < pre > Matches classTemplateSpecializations, templateSpecializationType and
functionDecl that have at least one TemplateArgument matching the given
InnerMatcher.
2015-11-20 15:46:19 +08:00
Given
template< typename T> class A {};
template< > class A< double> {};
A< int> a;
2016-07-29 21:57:27 +08:00
2016-07-30 01:30:13 +08:00
template< typename T> f() {};
2016-07-29 21:57:27 +08:00
void func() { f< int> (); };
2015-11-20 15:46:19 +08:00
classTemplateSpecializationDecl(hasAnyTemplateArgument(
refersToType(asString("int"))))
matches the specialization A< int>
2016-07-29 21:57:27 +08:00
functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
matches the specialization f< int>
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html" > ClassTemplateSpecializationDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasSpecializedTemplate0')" > < a name = "hasSpecializedTemplate0Anchor" > hasSpecializedTemplate< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html" > ClassTemplateDecl< / a > > InnerMatcher< / td > < / tr >
2017-08-02 21:04:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSpecializedTemplate0" > < pre > Matches the specialized template of a specialization declaration.
Given
2018-10-09 16:24:11 +08:00
template< typename T> class A {}; #1
template< > class A< int> {}; #2
2017-08-02 21:04:44 +08:00
classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
2018-10-09 16:24:11 +08:00
matches '#2' with classTemplateDecl() matching the class template
declaration of 'A' at #1.
2017-08-02 21:04:44 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTemplateArgument0" > < pre > Matches classTemplateSpecializations, templateSpecializationType and
functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
2015-11-20 15:46:19 +08:00
Given
template< typename T, typename U> class A {};
A< bool, int> b;
A< int, bool> c;
2016-07-29 21:57:27 +08:00
2018-01-23 06:34:15 +08:00
template< typename T> void f() {}
2016-07-29 21:57:27 +08:00
void func() { f< int> (); };
2015-11-20 15:46:19 +08:00
classTemplateSpecializationDecl(hasTemplateArgument(
1, refersToType(asString("int"))))
matches the specialization A< bool, int>
2016-07-29 21:57:27 +08:00
functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
matches the specialization f< int>
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html" > ComplexType< / a > > < / td > < td class = "name" onclick = "toggle('hasElementType1')" > < a name = "hasElementType1Anchor" > hasElementType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasElementType1" > < pre > Matches arrays and C99 complex types that have a specific element
type.
Given
struct A {};
A a[7];
int b[7];
arrayType(hasElementType(builtinType()))
matches "int b[7]"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html" > ArrayType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html" > ComplexType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html" > CompoundStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasAnySubstatement0')" > < a name = "hasAnySubstatement0Anchor" > hasAnySubstatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnySubstatement0" > < pre > Matches compound statements where at least one substatement matches
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
a given matcher. Also matches StmtExprs that have CompoundStmt as children.
2015-11-20 15:46:19 +08:00
Given
{ {}; 1+2; }
hasAnySubstatement(compoundStmt())
matches '{ {}; 1+2; }'
with compoundStmt()
matching '{}'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html" > DecayedType< / a > > < / td > < td class = "name" onclick = "toggle('hasDecayedType0')" > < a name = "hasDecayedType0Anchor" > hasDecayedType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerType< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDecayedType0" > < pre > Matches the decayed type, whoes decayed type matches InnerMatcher
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration11')" > < a name = "hasDeclaration11Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration11" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > < / td > < td class = "name" onclick = "toggle('throughUsingDecl0')" > < a name = "throughUsingDecl0Anchor" > throughUsingDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html" > UsingShadowDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "throughUsingDecl0" > < pre > Matches a DeclRefExpr that refers to a declaration through a
specific using shadow declaration.
Given
namespace a { void f() {} }
using a::f;
void g() {
2018-12-12 03:30:49 +08:00
f(); // Matches this ..
a::f(); // .. but not this.
2015-11-20 15:46:19 +08:00
}
declRefExpr(throughUsingDecl(anything()))
matches f()
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > < / td > < td class = "name" onclick = "toggle('to0')" > < a name = "to0Anchor" > to< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "to0" > < pre > Matches a DeclRefExpr that refers to a declaration that matches the
specified matcher.
Example matches x in if(x)
(matcher = declRefExpr(to(varDecl(hasName("x")))))
bool x;
if (x) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html" > DeclStmt< / a > > < / td > < td class = "name" onclick = "toggle('containsDeclaration0')" > < a name = "containsDeclaration0Anchor" > containsDeclaration< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "containsDeclaration0" > < pre > Matches the n'th declaration of a declaration statement.
Note that this does not work for global declarations because the AST
breaks up multiple-declaration DeclStmt's into multiple single-declaration
DeclStmt's.
Example: Given non-global declarations
int a, b = 0;
int c;
int d = 2, e;
declStmt(containsDeclaration(
0, varDecl(hasInitializer(anything()))))
matches only 'int d = 2, e;', and
declStmt(containsDeclaration(1, varDecl()))
matches 'int a, b = 0' as well as 'int d = 2, e;'
but 'int c;' is not matched.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html" > DeclStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasSingleDecl0')" > < a name = "hasSingleDecl0Anchor" > hasSingleDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSingleDecl0" > < pre > Matches the Decl of a DeclStmt which has a single declaration.
Given
int a, b;
int c;
declStmt(hasSingleDecl(anything()))
matches 'int c;' but not 'int a, b;'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html" > DeclaratorDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasTypeLoc0')" > < a name = "hasTypeLoc0Anchor" > hasTypeLoc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > Inner< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTypeLoc0" > < pre > Matches if the type location of the declarator decl's type matches
the inner matcher.
Given
int x;
declaratorDecl(hasTypeLoc(loc(asString("int"))))
matches int x
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclContext0')" > < a name = "hasDeclContext0Anchor" > hasDeclContext< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclContext0" > < pre > Matches declarations whose declaration context, interpreted as a
Decl, matches InnerMatcher.
Given
namespace N {
namespace M {
class D {};
}
}
cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
declaration of class D.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html" > DecltypeType< / a > > < / td > < td class = "name" onclick = "toggle('hasUnderlyingType0')" > < a name = "hasUnderlyingType0Anchor" > hasUnderlyingType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2018-07-26 21:02:05 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasUnderlyingType0" > < pre > Matches DecltypeType nodes to find out the underlying type.
Given
decltype(1) a = 1;
decltype(2.0) b = 2.0;
decltypeType(hasUnderlyingType(isInteger()))
2018-10-09 16:24:11 +08:00
matches the type of "a"
2018-07-26 21:02:05 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html" > DecltypeType< / a > >
2018-07-26 21:02:05 +08:00
< / pre > < / td > < / tr >
2021-01-30 23:50:44 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html" > DecompositionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyBinding0')" > < a name = "hasAnyBinding0Anchor" > hasAnyBinding< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html" > BindingDecl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyBinding0" > < pre > Matches any binding of a DecompositionDecl.
For example, in:
void foo()
{
int arr[3];
auto & [f, s, t] = arr;
f = 42;
}
The matcher:
decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
matches the decomposition decl with 'f' bound to "fBinding".
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html" > DecompositionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasBinding0')" > < a name = "hasBinding0Anchor" > hasBinding< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html" > BindingDecl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasBinding0" > < pre > Matches the Nth binding of a DecompositionDecl.
For example, in:
void foo()
{
int arr[3];
auto & [f, s, t] = arr;
f = 42;
}
The matcher:
2021-02-22 19:07:03 +08:00
decompositionDecl(hasBinding(0,
bindingDecl(hasName("f").bind("fBinding"))))
2021-01-30 23:50:44 +08:00
matches the decomposition decl with 'f' bound to "fBinding".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html" > DoStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasBody0')" > < a name = "hasBody0Anchor" > hasBody< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBody0" > < pre > < / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html" > DoStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition3')" > < a name = "hasCondition3Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition3" > < pre > Matches the condition expression of an if statement, for loop,
2016-05-30 23:25:25 +08:00
switch statement or conditional operator.
2015-11-20 15:46:19 +08:00
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html" > ElaboratedType< / a > > < / td > < td class = "name" onclick = "toggle('hasQualifier0')" > < a name = "hasQualifier0Anchor" > hasQualifier< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasQualifier0" > < pre > Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
matches InnerMatcher if the qualifier exists.
Given
namespace N {
namespace M {
class D {};
}
}
N::M::D d;
elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
matches the type of the variable declaration of d.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html" > ElaboratedType< / a > > < / td > < td class = "name" onclick = "toggle('namesType0')" > < a name = "namesType0Anchor" > namesType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "namesType0" > < pre > Matches ElaboratedTypes whose named type matches InnerMatcher.
Given
namespace N {
namespace M {
class D {};
}
}
N::M::D d;
elaboratedType(namesType(recordType(
hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
declaration of d.
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration10')" > < a name = "hasDeclaration10Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration10" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html" > ExplicitCastExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDestinationType0')" > < a name = "hasDestinationType0Anchor" > hasDestinationType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDestinationType0" > < pre > Matches casts whose destination type matches a given matcher.
(Note: Clang's AST refers to other conversions as "casts" too, and calls
actual casts "explicit" casts.)
< / pre > < / td > < / tr >
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('hasType5')" > < a name = "hasType5Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasType5" > < pre > Overloaded to match the declaration of the expression's or value
2015-11-20 15:46:19 +08:00
declaration's type.
In case of a value declaration (for example a variable declaration),
this resolves one layer of indirection. For example, in the value
declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
declaration of x.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
2018-07-07 05:36:04 +08:00
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
cxxRecordDecl(hasName("X"))))
2015-11-20 15:46:19 +08:00
class X {};
void y(X & x) { x; X z; }
2018-07-07 05:36:04 +08:00
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Example matches class Derived
(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
class Base {};
class Derived : Base {};
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('hasType0')" > < a name = "hasType0Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasType0" > < pre > Matches if the expression's or declaration's type matches a type
matcher.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
2016-02-01 22:11:47 +08:00
and U (matcher = typedefDecl(hasType(asString("int")))
2018-07-07 05:36:04 +08:00
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
asString("class X")))
2015-11-20 15:46:19 +08:00
class X {};
void y(X & x) { x; X z; }
2016-02-01 22:11:47 +08:00
typedef int U;
2018-07-07 05:36:04 +08:00
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2019-06-13 21:48:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringElidableConstructorCall0')" > < a name = "ignoringElidableConstructorCall0Anchor" > ignoringElidableConstructorCall< / a > < / td > < td > ast_matchers::Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "ignoringElidableConstructorCall0" > < pre > Matches expressions that match InnerMatcher that are possibly wrapped in an
2019-08-09 01:41:44 +08:00
elidable constructor and other corresponding bookkeeping nodes.
2019-06-13 21:48:24 +08:00
2019-08-09 01:41:44 +08:00
In C++17, elidable copy constructors are no longer being generated in the
AST as it is not permitted by the standard. They are, however, part of the
AST in C++14 and earlier. So, a matcher must abstract over these differences
to work in all language modes. This matcher skips elidable constructor-call
AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
various implicit nodes inside the constructor calls, all of which will not
appear in the C++17 AST.
2019-06-13 21:48:24 +08:00
Given
struct H {};
H G();
void f() {
H D = G();
}
2019-08-09 01:41:44 +08:00
``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
matches ``H D = G()`` in C++11 through C++17 (and beyond).
2019-06-13 21:48:24 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringImpCasts0')" > < a name = "ignoringImpCasts0Anchor" > ignoringImpCasts< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ignoringImpCasts0" > < pre > Matches expressions that match InnerMatcher after any implicit casts
are stripped off.
Parentheses and explicit casts are not discarded.
Given
int arr[5];
int a = 0;
char b = 0;
const int c = a;
int *d = arr;
long e = (long) 0l;
The matchers
varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
would match the declarations for a, b, c, and d, but not e.
While
varDecl(hasInitializer(integerLiteral()))
varDecl(hasInitializer(declRefExpr()))
only match the declarations for b, c, and d.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringImplicit0')" > < a name = "ignoringImplicit0Anchor" > ignoringImplicit< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2016-06-24 17:38:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "ignoringImplicit0" > < pre > Matches expressions that match InnerMatcher after any implicit AST
nodes are stripped off.
Parentheses and explicit casts are not discarded.
Given
class C {};
C a = C();
C b;
C c = b;
The matchers
varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
would match the declarations for a, b, and c.
While
varDecl(hasInitializer(cxxConstructExpr()))
only match the declarations for b and c.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringParenCasts0')" > < a name = "ignoringParenCasts0Anchor" > ignoringParenCasts< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ignoringParenCasts0" > < pre > Matches expressions that match InnerMatcher after parentheses and
casts are stripped off.
Implicit and non-C Style casts are also discarded.
Given
int a = 0;
char b = (0);
void* c = reinterpret_cast< char*> (0);
char d = char(0);
The matcher
varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
would match the declarations for a, b, c, and d.
while
varDecl(hasInitializer(integerLiteral()))
only match the declaration for a.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringParenImpCasts0')" > < a name = "ignoringParenImpCasts0Anchor" > ignoringParenImpCasts< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "ignoringParenImpCasts0" > < pre > Matches expressions that match InnerMatcher after implicit casts and
parentheses are stripped off.
Explicit casts are not discarded.
Given
int arr[5];
int a = 0;
char b = (0);
const int c = a;
int *d = (arr);
long e = ((long) 0l);
The matchers
varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
would match the declarations for a, b, c, and d, but not e.
while
varDecl(hasInitializer(integerLiteral()))
varDecl(hasInitializer(declRefExpr()))
would only match the declaration for a.
< / pre > < / td > < / tr >
2018-11-10 04:54:06 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > < / td > < td class = "name" onclick = "toggle('ignoringParens1')" > < a name = "ignoringParens1Anchor" > ignoringParens< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "ignoringParens1" > < pre > Overload ignoringParens for Expr.
Given
const char* str = ("my-string");
The matcher
implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
would match the implicit cast resulting from the assignment.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html" > FieldDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasInClassInitializer0')" > < a name = "hasInClassInitializer0Anchor" > hasInClassInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2016-12-24 21:35:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasInClassInitializer0" > < pre > Matches non-static data members that have an in-class initializer.
Given
class C {
int a = 2;
int b = 3;
int c;
};
fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
matches 'int a;' but not 'int b;'.
fieldDecl(hasInClassInitializer(anything()))
matches 'int a;' and 'int b;' but not 'int c;'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html" > ForStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasBody1')" > < a name = "hasBody1Anchor" > hasBody< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBody1" > < pre > < / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html" > ForStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition1')" > < a name = "hasCondition1Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition1" > < pre > Matches the condition expression of an if statement, for loop,
2016-05-30 23:25:25 +08:00
switch statement or conditional operator.
2015-11-20 15:46:19 +08:00
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html" > ForStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasIncrement0')" > < a name = "hasIncrement0Anchor" > hasIncrement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasIncrement0" > < pre > Matches the increment statement of a for loop.
Example:
forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
matches '++x' in
for (x; x < N; ++x) { }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html" > ForStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasLoopInit0')" > < a name = "hasLoopInit0Anchor" > hasLoopInit< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasLoopInit0" > < pre > Matches the initialization statement of a for loop.
Example:
forStmt(hasLoopInit(declStmt()))
matches 'int x = 0' in
for (int x = 0; x < N; ++x) { }
< / pre > < / td > < / tr >
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasType6')" > < a name = "hasType6Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasType6" > < pre > Overloaded to match the declaration of the expression's or value
2018-07-07 05:36:04 +08:00
declaration's type.
In case of a value declaration (for example a variable declaration),
this resolves one layer of indirection. For example, in the value
declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
declaration of x.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
cxxRecordDecl(hasName("X"))))
2018-07-07 05:36:04 +08:00
class X {};
void y(X & x) { x; X z; }
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2018-07-07 05:36:04 +08:00
2020-04-29 11:00:49 +08:00
Example matches class Derived
(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
class Base {};
class Derived : Base {};
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
2018-07-07 05:36:04 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasType1')" > < a name = "hasType1Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2018-07-07 05:36:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasType1" > < pre > Matches if the expression's or declaration's type matches a type
matcher.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
and U (matcher = typedefDecl(hasType(asString("int")))
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
asString("class X")))
2018-07-07 05:36:04 +08:00
class X {};
void y(X & x) { x; X z; }
typedef int U;
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2018-07-07 05:36:04 +08:00
< / pre > < / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyBody0')" > < a name = "hasAnyBody0Anchor" > hasAnyBody< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyBody0" > < pre > Matches a function declaration that has a given body present in the AST.
Note that this matcher matches all the declarations of a function whose
body is present in the AST.
Given
void f();
void f() {}
void g();
2021-03-15 21:06:48 +08:00
functionDecl(hasAnyBody(compoundStmt()))
2020-09-23 21:08:14 +08:00
matches both 'void f();'
and 'void f() {}'
with compoundStmt()
matching '{}'
but does not match 'void g();'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyParameter0')" > < a name = "hasAnyParameter0Anchor" > hasAnyParameter< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-05-17 06:47:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyParameter0" > < pre > Matches any parameter of a function or an ObjC method declaration or a
block.
2015-11-20 15:46:19 +08:00
Does not match the 'this' parameter of a method.
Given
class X { void f(int x, int y, int z) {} };
cxxMethodDecl(hasAnyParameter(hasName("y")))
matches f(int x, int y, int z) {}
with hasAnyParameter(...)
matching int y
2018-03-29 08:51:11 +08:00
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
matches the declaration of method f with hasParameter
matching y.
2018-05-17 06:47:03 +08:00
For blocks, given
b = ^(int y) { printf("%d", y) };
the matcher blockDecl(hasAnyParameter(hasName("y")))
matches the declaration of the block b with hasParameter
matching y.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< 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;
2016-07-30 01:30:13 +08:00
template< typename T> f() {};
2016-07-29 21:57:27 +08:00
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 >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBody4" > < pre > < / pre > < / td > < / tr >
2016-01-21 00:26:48 +08:00
2019-06-20 02:27:56 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasExplicitSpecifier0')" > < a name = "hasExplicitSpecifier0Anchor" > hasExplicitSpecifier< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasExplicitSpecifier0" > < pre > Matches the expression in an explicit specifier if present in the given
declaration.
Given
template< bool b>
struct S {
S(int); // #1
explicit S(double); // #2
operator int(); // #3
explicit operator bool(); // #4
explicit(false) S(bool) // # 7
explicit(true) S(char) // # 8
explicit(b) S(S) // # 9
};
S(int) -> S< true> // #5
explicit S(double) -> S< false> // #6
cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasParameter0')" > < a name = "hasParameter0Anchor" > hasParameter< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-03-29 08:51:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasParameter0" > < pre > Matches the n'th parameter of a function or an ObjC method
2018-05-17 06:47:03 +08:00
declaration or a block.
2015-11-20 15:46:19 +08:00
Given
class X { void f(int x) {} };
cxxMethodDecl(hasParameter(0, hasType(varDecl())))
matches f(int x) {}
with hasParameter(...)
matching int x
2018-03-29 08:51:11 +08:00
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasParameter(0, hasName("y")))
matches the declaration of method f with hasParameter
matching y.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< 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;
2018-01-23 06:34:15 +08:00
template< typename T> void f() {}
2016-07-29 21:57:27 +08:00
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 >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "returns0" > < pre > Matches the return type of a function declaration.
Given:
class X { int f() { return 1; } };
cxxMethodDecl(returns(asString("int")))
matches int f() { return 1; }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition0')" > < a name = "hasCondition0Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition0" > < pre > Matches the condition expression of an if statement, for loop,
2016-05-30 23:25:25 +08:00
switch statement or conditional operator.
2015-11-20 15:46:19 +08:00
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasConditionVariableStatement0')" > < a name = "hasConditionVariableStatement0Anchor" > hasConditionVariableStatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html" > DeclStmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasConditionVariableStatement0" > < pre > Matches the condition variable statement in an if statement.
Given
if (A* a = GetAPointer()) {}
hasConditionVariableStatement(...)
matches 'A* a = GetAPointer()'.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasElse0')" > < a name = "hasElse0Anchor" > hasElse< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasElse0" > < pre > Matches the else-statement of an if statement.
Examples matches the if statement
(matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
if (false) false; else true;
< / pre > < / td > < / tr >
2020-01-03 02:37:41 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasInitStatement0')" > < a name = "hasInitStatement0Anchor" > hasInitStatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasInitStatement0" > < pre > Matches selection statements with initializer.
Given:
2020-01-09 03:09:29 +08:00
void foo() {
2020-01-03 02:37:41 +08:00
if (int i = foobar(); i > 0) {}
switch (int i = foobar(); i) {}
2020-01-09 03:09:29 +08:00
for (auto& a = get_range(); auto& x : a) {}
2020-01-03 02:37:41 +08:00
}
2020-01-09 03:09:29 +08:00
void bar() {
2020-01-03 02:37:41 +08:00
if (foobar() > 0) {}
switch (foobar()) {}
2020-01-09 03:09:29 +08:00
for (auto& x : get_range()) {}
2020-01-03 02:37:41 +08:00
}
ifStmt(hasInitStatement(anything()))
matches the if statement in foo but not in bar.
switchStmt(hasInitStatement(anything()))
matches the switch statement in foo but not in bar.
cxxForRangeStmt(hasInitStatement(anything()))
matches the range for statement in foo but not in bar.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html" > IfStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasThen0')" > < a name = "hasThen0Anchor" > hasThen< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasThen0" > < pre > Matches the then-statement of an if statement.
Examples matches the if statement
(matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
if (false) true; else false;
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html" > ImplicitCastExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasImplicitDestinationType0')" > < a name = "hasImplicitDestinationType0Anchor" > hasImplicitDestinationType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasImplicitDestinationType0" > < pre > Matches implicit casts whose destination type matches a given
matcher.
FIXME: Unit test this matcher
< / pre > < / td > < / tr >
2019-01-07 22:14:36 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html" > InitListExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasInit0')" > < a name = "hasInit0Anchor" > hasInit< / a > < / td > < td > unsigned N, ast_matchers::Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasInit0" > < pre > Matches the n'th item of an initializer list expression.
Example matches y.
(matcher = initListExpr(hasInit(0, expr())))
int x{y}.
< / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html" > InitListExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasSyntacticForm0')" > < a name = "hasSyntacticForm0Anchor" > hasSyntacticForm< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSyntacticForm0" > < pre > Matches the syntactic form of init list expressions
(if expression have it).
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration9')" > < a name = "hasDeclaration9Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration9" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration8')" > < a name = "hasDeclaration8Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration8" > < pre > Matches a node if the declaration associated with that node
2015-11-20 15:46:19 +08:00
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-01-11 04:49:43 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html" > LambdaExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyCapture1')" > < a name = "hasAnyCapture1Anchor" > hasAnyCapture< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html" > CXXThisExpr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyCapture1" > < pre > Matches any capture of 'this' in a lambda expression.
Given
struct foo {
void bar() {
auto f = [this](){};
}
}
lambdaExpr(hasAnyCapture(cxxThisExpr()))
matches [this](){};
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html" > LambdaExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyCapture0')" > < a name = "hasAnyCapture0Anchor" > hasAnyCapture< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyCapture0" > < pre > Matches any capture of a lambda expression.
Given
void foo() {
int x;
auto f = [x](){};
}
lambdaExpr(hasAnyCapture(anything()))
matches [x](){};
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration7')" > < a name = "hasDeclaration7Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration7" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasObjectExpression0')" > < a name = "hasObjectExpression0Anchor" > hasObjectExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasObjectExpression0" > < pre > Matches a member expression where the object expression is matched by a
given matcher. Implicit object expressions are included; that is, it matches
use of implicit `this`.
2015-11-20 15:46:19 +08:00
Given
2019-02-09 00:00:44 +08:00
struct X {
int m;
int f(X x) { x.m; return m; }
};
memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
matches `x.m`, but not `m`; however,
memberExpr(hasObjectExpression(hasType(pointsTo(
cxxRecordDecl(hasName("X"))))))
matches `m` (aka. `this-> m`), but not `x.m`.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('member0')" > < a name = "member0Anchor" > member< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "member0" > < pre > Matches a member expression where the member is matched by a
given matcher.
Given
struct { int first, second; } first, second;
int i(second.first);
int j(first.second);
memberExpr(member(hasName("first")))
matches second.first
but not first.second (because the member name there is "second").
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > < / td > < td class = "name" onclick = "toggle('pointee1')" > < a name = "pointee1Anchor" > pointee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointee1" > < pre > Narrows PointerType (and similar) matchers to those where the
pointee matches a given matcher.
Given
int *a;
int const *b;
float const *f;
pointerType(pointee(isConstQualified(), isInteger()))
matches "int const *b"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasUnderlyingDecl0')" > < a name = "hasUnderlyingDecl0Anchor" > hasUnderlyingDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > InnerMatcher< / td > < / tr >
2016-08-09 23:07:52 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasUnderlyingDecl0" > < pre > Matches a NamedDecl whose underlying declaration matches the given
matcher.
Given
namespace N { template< class T> void f(T t); }
template < class T> void g() { using N::f; f(T()); }
unresolvedLookupExpr(hasAnyDeclaration(
namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
matches the use of f in g() .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > < / td > < td class = "name" onclick = "toggle('hasPrefix1')" > < a name = "hasPrefix1Anchor" > hasPrefix< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasPrefix1" > < pre > Matches on the prefix of a NestedNameSpecifierLoc.
Given
struct A { struct B { struct C {}; }; };
A::B::C c;
nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
matches "A::"
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > < / td > < td class = "name" onclick = "toggle('loc1')" > < a name = "loc1Anchor" > loc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "loc1" > < pre > Matches NestedNameSpecifierLocs for which the given inner
NestedNameSpecifier-matcher matches.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html" > NestedNameSpecifierLoc< / a > > < / td > < td class = "name" onclick = "toggle('specifiesTypeLoc0')" > < a name = "specifiesTypeLoc0Anchor" > specifiesTypeLoc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "specifiesTypeLoc0" > < pre > Matches nested name specifier locs that specify a type matching the
given TypeLoc.
Given
struct A { struct B { struct C {}; }; };
A::B::C c;
nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
hasDeclaration(cxxRecordDecl(hasName("A")))))))
matches "A::"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('hasPrefix0')" > < a name = "hasPrefix0Anchor" > hasPrefix< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasPrefix0" > < pre > Matches on the prefix of a NestedNameSpecifier.
Given
struct A { struct B { struct C {}; }; };
A::B::C c;
nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
matches "A::"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('specifiesNamespace0')" > < a name = "specifiesNamespace0Anchor" > specifiesNamespace< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html" > NamespaceDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "specifiesNamespace0" > < pre > Matches nested name specifiers that specify a namespace matching the
given namespace matcher.
Given
namespace ns { struct A {}; }
ns::A a;
nestedNameSpecifier(specifiesNamespace(hasName("ns")))
matches "ns::"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html" > NestedNameSpecifier< / a > > < / td > < td class = "name" onclick = "toggle('specifiesType0')" > < a name = "specifiesType0Anchor" > specifiesType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "specifiesType0" > < pre > Matches nested name specifiers that specify a type matching the
given QualType matcher without qualifiers.
Given
struct A { struct B { struct C {}; }; };
A::B::C c;
nestedNameSpecifier(specifiesType(
hasDeclaration(cxxRecordDecl(hasName("A")))
))
matches "A::"
< / pre > < / td > < / tr >
[ASTTypeTraits][ASTMatchers][OpenMP] OMPClause handling
Summary:
`OMPClause` is the base class, it is not descendant from **any**
other class, therefore for it to work with e.g.
`VariadicDynCastAllOfMatcher<>`, it needs to be handled here.
Reviewers: sbenza, bkramer, pcc, klimek, hokein, gribozavr, aaron.ballman, george.karpenkov
Reviewed By: gribozavr, aaron.ballman
Subscribers: guansong, jdoerfert, alexfh, ABataev, cfe-commits
Tags: #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57112
llvm-svn: 356675
2019-03-21 23:33:24 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html" > OMPExecutableDirective< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyClause0')" > < a name = "hasAnyClause0Anchor" > hasAnyClause< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html" > OMPClause< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasAnyClause0" > < pre > Matches any clause in an OpenMP directive.
Given
#pragma omp parallel
#pragma omp parallel default(none)
``ompExecutableDirective(hasAnyClause(anything()))`` matches
``omp parallel default(none)``.
< / pre > < / td > < / tr >
2019-03-21 23:33:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html" > OMPExecutableDirective< / a > > < / td > < td class = "name" onclick = "toggle('hasStructuredBlock0')" > < a name = "hasStructuredBlock0Anchor" > hasStructuredBlock< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasStructuredBlock0" > < pre > Matches the structured-block of the OpenMP executable directive
Prerequisite: the executable directive must not be standalone directive.
If it is, it will never match.
Given
#pragma omp parallel
;
#pragma omp parallel
{}
``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
< / pre > < / td > < / tr >
2019-08-13 07:23:35 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDerivedFrom1')" > < a name = "isDerivedFrom1Anchor" > isDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDerivedFrom1" > < pre > Matches C++ classes that are directly or indirectly derived from a class
matching Base, or Objective-C classes that directly or indirectly
subclass a class matching Base.
Note that a class is not considered to be derived from itself.
Example matches Y, Z, C (Base == hasName("X"))
class X;
class Y : public X {}; // directly derived
class Z : public Y {}; // indirectly derived
typedef X A;
typedef A B;
class C : public B {}; // derived from a typedef of X
In the following example, Bar matches isDerivedFrom(hasName("X")):
class Foo;
typedef Foo X;
class Bar : public Foo {}; // derived from a type that X is a typedef of
In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
@interface NSObject @end
@interface Bar : NSObject @end
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html" > CXXRecordDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > >
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isDirectlyDerivedFrom1')" > < a name = "isDirectlyDerivedFrom1Anchor" > isDirectlyDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isDirectlyDerivedFrom1" > < pre > Matches C++ or Objective-C classes that are directly derived from a class
matching Base.
Note that a class is not considered to be derived from itself.
Example matches Y, C (Base == hasName("X"))
class X;
class Y : public X {}; // directly derived
class Z : public Y {}; // indirectly derived
typedef X A;
typedef A B;
class C : public B {}; // derived from a typedef of X
In the following example, Bar matches isDerivedFrom(hasName("X")):
class Foo;
typedef Foo X;
class Bar : public Foo {}; // derived from a type that X is a typedef of
< / pre > < / td > < / tr >
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html" > ObjCInterfaceDecl< / a > > < / td > < td class = "name" onclick = "toggle('isSameOrDerivedFrom1')" > < a name = "isSameOrDerivedFrom1Anchor" > isSameOrDerivedFrom< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > Base< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "isSameOrDerivedFrom1" > < pre > Similar to isDerivedFrom(), but also matches classes that directly
match Base.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyArgument3')" > < a name = "hasAnyArgument3Anchor" > hasAnyArgument< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2018-08-13 07:30:05 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyArgument3" > < pre > Matches any argument of a call expression or a constructor call
2018-03-07 10:32:44 +08:00
expression, or an ObjC-message-send expression.
Given
void x(int, int, int) { int y; x(1, y, 42); }
callExpr(hasAnyArgument(declRefExpr()))
matches x(1, y, 42)
with hasAnyArgument(...)
matching y
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
2018-03-21 18:48:00 +08:00
void foo(I *i) { [i f:12]; }
2018-03-07 10:32:44 +08:00
objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
matches [i f:12]
< / pre > < / td > < / tr >
2020-10-31 08:41:16 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArgument3')" > < a name = "hasArgument3Anchor" > hasArgument< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasArgument3" > < pre > Matches the n'th argument of a call expression or a constructor
2015-11-20 15:46:19 +08:00
call expression.
Example matches y in x(y)
(matcher = callExpr(hasArgument(0, declRefExpr())))
void x(int) { int y; x(y); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasReceiver0')" > < a name = "hasReceiver0Anchor" > hasReceiver< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2018-07-17 04:22:12 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasReceiver0" > < pre > Matches if the Objective-C message is sent to an instance,
and the inner matcher matches on that instance.
For example the method call in
NSString *x = @"hello";
2018-07-24 06:29:10 +08:00
[x containsString:@"h"];
2018-07-17 04:22:12 +08:00
is matched by
objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html" > ObjCMessageExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasReceiverType0')" > < a name = "hasReceiverType0Anchor" > hasReceiverType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasReceiverType0" > < pre > Matches on the receiver of an ObjectiveC Message expression.
Example
2017-05-06 05:01:12 +08:00
matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
2015-11-20 15:46:19 +08:00
matches the [webView ...] message invocation.
NSString *webViewJavaScript = ...
UIWebView *webView = ...
[webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyParameter1')" > < a name = "hasAnyParameter1Anchor" > hasAnyParameter< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-05-17 06:47:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyParameter1" > < pre > Matches any parameter of a function or an ObjC method declaration or a
block.
2018-03-29 08:51:11 +08:00
Does not match the 'this' parameter of a method.
Given
class X { void f(int x, int y, int z) {} };
cxxMethodDecl(hasAnyParameter(hasName("y")))
matches f(int x, int y, int z) {}
with hasAnyParameter(...)
matching int y
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
matches the declaration of method f with hasParameter
matching y.
2018-05-17 06:47:03 +08:00
For blocks, given
b = ^(int y) { printf("%d", y) };
the matcher blockDecl(hasAnyParameter(hasName("y")))
matches the declaration of the block b with hasParameter
matching y.
2018-03-29 08:51:11 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html" > ObjCMethodDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasParameter1')" > < a name = "hasParameter1Anchor" > hasParameter< / a > < / td > < td > unsigned N, Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html" > ParmVarDecl< / a > > InnerMatcher< / td > < / tr >
2018-03-29 08:51:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasParameter1" > < pre > Matches the n'th parameter of a function or an ObjC method
2018-05-17 06:47:03 +08:00
declaration or a block.
2018-03-29 08:51:11 +08:00
Given
class X { void f(int x) {} };
cxxMethodDecl(hasParameter(0, hasType(varDecl())))
matches f(int x) {}
with hasParameter(...)
matching int x
For ObjectiveC, given
@interface I - (void) f:(int) y; @end
the matcher objcMethodDecl(hasParameter(0, hasName("y")))
matches the declaration of method f with hasParameter
matching y.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html" > OpaqueValueExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasSourceExpression1')" > < a name = "hasSourceExpression1Anchor" > hasSourceExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2018-01-18 00:50:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSourceExpression1" > < pre > Matches if the cast's source expression
or opaque value's source expression matches the given matcher.
Example 1: matches "a string"
(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
class URL { URL(string); };
URL url = "a string";
Example 2: matches 'b' (matcher =
opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
int a = b ?: 1;
< / pre > < / td > < / tr >
2016-08-09 23:07:52 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html" > OverloadExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyDeclaration0')" > < a name = "hasAnyDeclaration0Anchor" > hasAnyDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2016-08-09 23:07:52 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyDeclaration0" > < pre > Matches an OverloadExpr if any of the declarations in the set of
overloads matches the given matcher.
Given
template < typename T> void foo(T);
template < typename T> void bar(T);
template < typename T> void baz(T t) {
foo(t);
bar(t);
}
unresolvedLookupExpr(hasAnyDeclaration(
functionTemplateDecl(hasName("foo"))))
matches foo in foo(t); but not bar in bar(t);
< / pre > < / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParenType.html" > ParenType< / a > > < / td > < td class = "name" onclick = "toggle('innerType0')" > < a name = "innerType0Anchor" > innerType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "innerType0" > < pre > Matches ParenType nodes where the inner type is a specific type.
Given
int (*ptr_to_array)[4];
int (*ptr_to_func)(int);
varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
ptr_to_func but not ptr_to_array.
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ParenType.html" > ParenType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > < / td > < td class = "name" onclick = "toggle('pointee2')" > < a name = "pointee2Anchor" > pointee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointee2" > < pre > Narrows PointerType (and similar) matchers to those where the
pointee matches a given matcher.
Given
int *a;
int const *b;
float const *f;
pointerType(pointee(isConstQualified(), isInteger()))
matches "int const *b"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('hasCanonicalType0')" > < a name = "hasCanonicalType0Anchor" > hasCanonicalType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCanonicalType0" > < pre > Matches QualTypes whose canonical type matches InnerMatcher.
Given:
typedef int & int_ref;
int a;
int_ref b = a;
varDecl(hasType(qualType(referenceType()))))) will not match the
declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration6')" > < a name = "hasDeclaration6Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration6" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('ignoringParens0')" > < a name = "ignoringParens0Anchor" > ignoringParens< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2016-06-07 02:52:17 +08:00
< tr > < td colspan = "4" class = "doc" id = "ignoringParens0" > < pre > Matches types that match InnerMatcher after any parens are stripped.
Given
void (*fp)(void);
The matcher
varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
would match the declaration for fp.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('pointsTo1')" > < a name = "pointsTo1Anchor" > pointsTo< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointsTo1" > < pre > Overloaded to match the pointee type's declaration.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('pointsTo0')" > < a name = "pointsTo0Anchor" > pointsTo< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointsTo0" > < pre > Matches if the matched type is a pointer type and the pointee type
matches the specified matcher.
Example matches y-> x()
(matcher = cxxMemberCallExpr(on(hasType(pointsTo
cxxRecordDecl(hasName("Y")))))))
class Y { public: void x(); };
void z() { Y *y; y-> x(); }
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('references1')" > < a name = "references1Anchor" > references< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "references1" > < pre > Overloaded to match the referenced type's declaration.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > < / td > < td class = "name" onclick = "toggle('references0')" > < a name = "references0Anchor" > references< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "references0" > < pre > Matches if the matched type is a reference type and the referenced
type matches the specified matcher.
Example matches X & x and const X & y
(matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
class X {
void a(X b) {
X & x = b;
const X & y = b;
}
};
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration5')" > < a name = "hasDeclaration5Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration5" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > > < / td > < td class = "name" onclick = "toggle('pointee3')" > < a name = "pointee3Anchor" > pointee< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "pointee3" > < pre > Narrows PointerType (and similar) matchers to those where the
pointee matches a given matcher.
Given
int *a;
int const *b;
float const *f;
pointerType(pointee(isConstQualified(), isInteger()))
matches "int const *b"
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html" > BlockPointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html" > MemberPointerType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1PointerType.html" > PointerType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html" > ReferenceType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html" > ReturnStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasReturnValue0')" > < a name = "hasReturnValue0Anchor" > hasReturnValue< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2016-03-22 19:03:03 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasReturnValue0" > < pre > Matches the return value expression of a return statement
Given
return a + b;
hasReturnValue(binaryOperator())
matches 'return a + b'
with binaryOperator()
matching 'a + b'
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html" > StmtExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasAnySubstatement1')" > < a name = "hasAnySubstatement1Anchor" > hasAnySubstatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
Adding new AST matchers for: addrLabelExpr, atomicExpr, binaryConditionalOperator, designatedInitExpr, designatorCountIs, hasSyntacticForm, implicitValueInitExpr, labelDecl, opaqueValueExpr, parenListExpr, predefinedExpr, requiresZeroInitialization, and stmtExpr.
Patch by Aleksei Sidorin.
llvm-svn: 263027
2016-03-10 01:11:51 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnySubstatement1" > < pre > Matches compound statements where at least one substatement matches
a given matcher. Also matches StmtExprs that have CompoundStmt as children.
Given
{ {}; 1+2; }
hasAnySubstatement(compoundStmt())
matches '{ {}; 1+2; }'
with compoundStmt()
matching '{}'
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('alignOfExpr0')" > < a name = "alignOfExpr0Anchor" > alignOfExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" > UnaryExprOrTypeTraitExpr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "alignOfExpr0" > < pre > Same as unaryExprOrTypeTraitExpr, but only matching
alignof.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('forFunction0')" > < a name = "forFunction0Anchor" > forFunction< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html" > FunctionDecl< / a > > InnerMatcher< / td > < / tr >
2017-01-20 17:54:26 +08:00
< tr > < td colspan = "4" class = "doc" id = "forFunction0" > < pre > Matches declaration of the function the statement belongs to
2016-05-04 19:59:39 +08:00
Given:
F& operator=(const F& o) {
std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
return *this;
}
returnStmt(forFunction(hasName("operator=")))
matches 'return *this'
2019-08-08 01:01:31 +08:00
but does not match 'return v > 0'
2016-05-04 19:59:39 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > < / td > < td class = "name" onclick = "toggle('sizeOfExpr0')" > < a name = "sizeOfExpr0Anchor" > sizeOfExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" > UnaryExprOrTypeTraitExpr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "sizeOfExpr0" > < pre > Same as unaryExprOrTypeTraitExpr, but only matching
sizeof.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html" > SubstTemplateTypeParmType< / a > > < / td > < td class = "name" onclick = "toggle('hasReplacementType0')" > < a name = "hasReplacementType0Anchor" > hasReplacementType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < / tr >
2016-12-08 19:46:22 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasReplacementType0" > < pre > Matches template type parameter substitutions that have a replacement
type that matches the provided matcher.
Given
template < typename T>
double F(T t);
int i;
double j = F(i);
substTemplateTypeParmType(hasReplacementType(type())) matches int
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html" > SwitchStmt< / a > > < / td > < td class = "name" onclick = "toggle('forEachSwitchCase0')" > < a name = "forEachSwitchCase0Anchor" > forEachSwitchCase< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html" > SwitchCase< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "forEachSwitchCase0" > < pre > Matches each case or default statement belonging to the given switch
statement. This matcher may produce multiple matches.
Given
switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
matches four times, with "c" binding each of "case 1:", "case 2:",
"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
"switch (1)", "switch (2)" and "switch (2)".
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html" > SwitchStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition4')" > < a name = "hasCondition4Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2016-05-30 23:25:25 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition4" > < pre > Matches the condition expression of an if statement, for loop,
switch statement or conditional operator.
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2020-01-03 02:37:41 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html" > SwitchStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasInitStatement1')" > < a name = "hasInitStatement1Anchor" > hasInitStatement< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasInitStatement1" > < pre > Matches selection statements with initializer.
Given:
2020-01-09 03:09:29 +08:00
void foo() {
2020-01-03 02:37:41 +08:00
if (int i = foobar(); i > 0) {}
switch (int i = foobar(); i) {}
2020-01-09 03:09:29 +08:00
for (auto& a = get_range(); auto& x : a) {}
2020-01-03 02:37:41 +08:00
}
2020-01-09 03:09:29 +08:00
void bar() {
2020-01-03 02:37:41 +08:00
if (foobar() > 0) {}
switch (foobar()) {}
2020-01-09 03:09:29 +08:00
for (auto& x : get_range()) {}
2020-01-03 02:37:41 +08:00
}
ifStmt(hasInitStatement(anything()))
matches the if statement in foo but not in bar.
switchStmt(hasInitStatement(anything()))
matches the switch statement in foo but not in bar.
cxxForRangeStmt(hasInitStatement(anything()))
matches the range for statement in foo but not in bar.
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration4')" > < a name = "hasDeclaration4Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration4" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('isExpr0')" > < a name = "isExpr0Anchor" > isExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "isExpr0" > < pre > Matches a sugar TemplateArgument that refers to a certain expression.
Given
2018-01-23 06:34:15 +08:00
struct B { int next; };
template< int(B::*next_ptr)> struct A {};
2015-11-20 15:46:19 +08:00
A< & B::next> a;
templateSpecializationType(hasAnyTemplateArgument(
isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
matches the specialization A< & B::next> with fieldDecl(...) matching
B::next
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('refersToDeclaration0')" > < a name = "refersToDeclaration0Anchor" > refersToDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "refersToDeclaration0" > < pre > Matches a canonical TemplateArgument that refers to a certain
declaration.
Given
2018-01-23 06:34:15 +08:00
struct B { int next; };
template< int(B::*next_ptr)> struct A {};
2015-11-20 15:46:19 +08:00
A< & B::next> a;
classTemplateSpecializationDecl(hasAnyTemplateArgument(
2018-01-23 06:34:15 +08:00
refersToDeclaration(fieldDecl(hasName("next")))))
2015-11-20 15:46:19 +08:00
matches the specialization A< & B::next> with fieldDecl(...) matching
B::next
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('refersToIntegralType0')" > < a name = "refersToIntegralType0Anchor" > refersToIntegralType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "refersToIntegralType0" > < pre > Matches a TemplateArgument that refers to an integral type.
2015-11-20 15:46:19 +08:00
Given
2018-01-23 06:34:15 +08:00
template< int T> struct C {};
2015-11-20 15:46:19 +08:00
C< 42> c;
classTemplateSpecializationDecl(
hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
matches the implicit instantiation of C in C< 42> .
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('refersToTemplate0')" > < a name = "refersToTemplate0Anchor" > refersToTemplate< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html" > TemplateName< / a > > InnerMatcher< / td > < / tr >
2016-07-29 23:45:11 +08:00
< tr > < td colspan = "4" class = "doc" id = "refersToTemplate0" > < pre > Matches a TemplateArgument that refers to a certain template.
Given
template< template < typename> class S> class X {};
2018-10-09 16:24:11 +08:00
template< typename T> class Y {};
2016-07-29 23:45:11 +08:00
X< Y> xi;
classTemplateSpecializationDecl(hasAnyTemplateArgument(
refersToTemplate(templateName())))
matches the specialization X< Y>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > < / td > < td class = "name" onclick = "toggle('refersToType0')" > < a name = "refersToType0Anchor" > refersToType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "refersToType0" > < pre > Matches a TemplateArgument that refers to a certain type.
Given
struct X {};
template< typename T> struct A {};
A< X> a;
classTemplateSpecializationDecl(hasAnyTemplateArgument(
refersToType(class(hasName("X")))))
matches the specialization A< X>
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyTemplateArgument1" > < pre > Matches classTemplateSpecializations, templateSpecializationType and
functionDecl that have at least one TemplateArgument matching the given
InnerMatcher.
2015-11-20 15:46:19 +08:00
Given
template< typename T> class A {};
template< > class A< double> {};
A< int> a;
2016-07-29 21:57:27 +08:00
2016-07-30 01:30:13 +08:00
template< typename T> f() {};
2016-07-29 21:57:27 +08:00
void func() { f< int> (); };
2015-11-20 15:46:19 +08:00
classTemplateSpecializationDecl(hasAnyTemplateArgument(
refersToType(asString("int"))))
matches the specialization A< int>
2016-07-29 21:57:27 +08:00
functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
matches the specialization f< int>
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration3')" > < a name = "hasDeclaration3Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration3" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://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 = "https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html" > TemplateArgument< / a > > InnerMatcher< / td > < / tr >
2016-07-29 21:57:27 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTemplateArgument1" > < pre > Matches classTemplateSpecializations, templateSpecializationType and
functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
2015-11-20 15:46:19 +08:00
Given
template< typename T, typename U> class A {};
A< bool, int> b;
A< int, bool> c;
2016-07-29 21:57:27 +08:00
2018-01-23 06:34:15 +08:00
template< typename T> void f() {}
2016-07-29 21:57:27 +08:00
void func() { f< int> (); };
2015-11-20 15:46:19 +08:00
classTemplateSpecializationDecl(hasTemplateArgument(
1, refersToType(asString("int"))))
matches the specialization A< bool, int>
2016-07-29 21:57:27 +08:00
functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
matches the specialization f< int>
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration2')" > < a name = "hasDeclaration2Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration2" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2020-02-25 07:59:45 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html" > TypeLoc< / a > > < / td > < td class = "name" onclick = "toggle('loc0')" > < a name = "loc0Anchor" > loc< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "loc0" > < pre > Matches TypeLocs for which the given inner
QualType-matcher matches.
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html" > TypedefNameDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasType2')" > < a name = "hasType2Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2018-07-07 05:36:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasType2" > < pre > Matches if the expression's or declaration's type matches a type
2016-02-01 22:11:47 +08:00
matcher.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
and U (matcher = typedefDecl(hasType(asString("int")))
2018-07-07 05:36:04 +08:00
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
asString("class X")))
2016-02-01 22:11:47 +08:00
class X {};
void y(X & x) { x; X z; }
typedef int U;
2018-07-07 05:36:04 +08:00
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2016-02-01 22:11:47 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration1')" > < a name = "hasDeclaration1Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration1" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2016-12-01 23:45:06 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > < / td > < td class = "name" onclick = "toggle('hasUnqualifiedDesugaredType0')" > < a name = "hasUnqualifiedDesugaredType0Anchor" > hasUnqualifiedDesugaredType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Type.html" > Type< / a > > InnerMatcher< / td > < / tr >
2016-12-01 23:45:06 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasUnqualifiedDesugaredType0" > < pre > Matches if the matched type matches the unqualified desugared
type of the matched node.
For example, in:
class A {};
using B = A;
2018-07-24 06:29:10 +08:00
The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
2016-12-01 23:45:06 +08:00
both B and A.
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html" > UnaryExprOrTypeTraitExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasArgumentOfType0')" > < a name = "hasArgumentOfType0Anchor" > hasArgumentOfType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasArgumentOfType0" > < pre > Matches unary expressions that have a specific type of argument.
Given
int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
matches sizeof(a) and alignof(c)
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html" > UnaryOperator< / a > > < / td > < td class = "name" onclick = "toggle('hasUnaryOperand0')" > < a name = "hasUnaryOperand0Anchor" > hasUnaryOperand< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasUnaryOperand0" > < pre > Matches if the operand of a unary operator matches.
Example matches true (matcher = hasUnaryOperand(
cxxBoolLiteral(equals(true))))
!true
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html" > UnresolvedMemberExpr< / a > > < / td > < td class = "name" onclick = "toggle('hasObjectExpression1')" > < a name = "hasObjectExpression1Anchor" > hasObjectExpression< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2019-02-09 00:00:44 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasObjectExpression1" > < pre > Matches a member expression where the object expression is matched by a
given matcher. Implicit object expressions are included; that is, it matches
use of implicit `this`.
2018-08-24 01:16:06 +08:00
Given
2019-02-09 00:00:44 +08:00
struct X {
int m;
int f(X x) { x.m; return m; }
};
memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
matches `x.m`, but not `m`; however,
memberExpr(hasObjectExpression(hasType(pointsTo(
cxxRecordDecl(hasName("X"))))))
matches `m` (aka. `this-> m`), but not `x.m`.
2018-08-24 01:16:06 +08:00
< / pre > < / td > < / tr >
2020-02-26 09:56:21 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > > < / td > < td class = "name" onclick = "toggle('hasDeclaration0')" > < a name = "hasDeclaration0Anchor" > hasDeclaration< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasDeclaration0" > < pre > Matches a node if the declaration associated with that node
matches the given matcher.
The associated declaration is:
- for type nodes, the declaration of the underlying type
- for CallExpr, the declaration of the callee
- for MemberExpr, the declaration of the referenced member
- for CXXConstructExpr, the declaration of the constructor
2016-11-01 06:04:07 +08:00
- for CXXNewExpr, the declaration of the operator new
2018-07-28 01:26:11 +08:00
- for ObjCIvarExpr, the declaration of the ivar
2015-11-20 15:46:19 +08:00
2018-01-18 00:50:14 +08:00
For type nodes, hasDeclaration will generally match the declaration of the
sugared type. Given
class X {};
typedef X Y;
Y y;
in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
typedefDecl. A common use case is to match the underlying, desugared type.
This can be achieved by using the hasUnqualifiedDesugaredType matcher:
varDecl(hasType(hasUnqualifiedDesugaredType(
recordType(hasDeclaration(decl())))))
In this matcher, the decl will match the CXXRecordDecl of class X.
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html" > AddrLabelExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html" > CallExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html" > CXXConstructExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html" > CXXNewExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html" > DeclRefExpr< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1EnumType.html" > EnumType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html" > InjectedClassNameType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html" > LabelStmt< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html" > MemberExpr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1RecordType.html" > RecordType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TagType.html" > TagType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html" > TemplateSpecializationType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html" > TemplateTypeParmType< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html" > TypedefType< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html" > UnresolvedUsingType< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html" > UsingDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasAnyUsingShadowDecl0')" > < a name = "hasAnyUsingShadowDecl0Anchor" > hasAnyUsingShadowDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html" > UsingShadowDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasAnyUsingShadowDecl0" > < pre > Matches any using shadow declaration.
Given
namespace X { void b(); }
using X::b;
usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
matches using X::b < / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html" > UsingShadowDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasTargetDecl0')" > < a name = "hasTargetDecl0Anchor" > hasTargetDecl< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html" > NamedDecl< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasTargetDecl0" > < pre > Matches a using shadow declaration where the target declaration is
matched by the given matcher.
Given
namespace X { int a; void b(); }
using X::a;
using X::b;
usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
matches using X::b but not using X::a < / pre > < / td > < / tr >
2021-04-09 06:55:22 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasType7')" > < a name = "hasType7Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Decl.html" > Decl< / a > > InnerMatcher< / td > < / tr >
< tr > < td colspan = "4" class = "doc" id = "hasType7" > < pre > Overloaded to match the declaration of the expression's or value
2015-11-20 15:46:19 +08:00
declaration's type.
In case of a value declaration (for example a variable declaration),
this resolves one layer of indirection. For example, in the value
declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
declaration of x.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
2018-07-07 05:36:04 +08:00
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
cxxRecordDecl(hasName("X"))))
2015-11-20 15:46:19 +08:00
class X {};
void y(X & x) { x; X z; }
2018-07-07 05:36:04 +08:00
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2015-11-20 15:46:19 +08:00
2020-04-29 11:00:49 +08:00
Example matches class Derived
(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
class Base {};
class Derived : Base {};
Usable as: Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html" > FriendDecl< / a > > , Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > ,
Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html" > CXXBaseSpecifier< / a > >
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html" > ValueDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasType3')" > < a name = "hasType3Anchor" > hasType< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1QualType.html" > QualType< / a > > InnerMatcher< / td > < / tr >
2018-07-07 05:36:04 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasType3" > < pre > Matches if the expression's or declaration's type matches a type
2015-11-20 15:46:19 +08:00
matcher.
Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
2016-02-01 22:11:47 +08:00
and U (matcher = typedefDecl(hasType(asString("int")))
2018-07-07 05:36:04 +08:00
and friend class X (matcher = friendDecl(hasType("X"))
2021-04-09 06:55:22 +08:00
and public virtual X (matcher = cxxBaseSpecifier(hasType(
asString("class X")))
2015-11-20 15:46:19 +08:00
class X {};
void y(X & x) { x; X z; }
2016-02-01 22:11:47 +08:00
typedef int U;
2018-07-07 05:36:04 +08:00
class Y { friend class X; };
2021-04-09 06:55:22 +08:00
class Z : public virtual X {};
2015-11-20 15:46:19 +08:00
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html" > VarDecl< / a > > < / td > < td class = "name" onclick = "toggle('hasInitializer0')" > < a name = "hasInitializer0Anchor" > hasInitializer< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasInitializer0" > < pre > Matches a variable declaration that has an initializer expression
that matches the given matcher.
Example matches x (matcher = varDecl(hasInitializer(callExpr())))
bool y() { return true; }
bool x = y();
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html" > VariableArrayType< / a > > < / td > < td class = "name" onclick = "toggle('hasSizeExpr0')" > < a name = "hasSizeExpr0Anchor" > hasSizeExpr< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasSizeExpr0" > < pre > Matches VariableArrayType nodes that have a specific size
expression.
Given
void f(int b) {
int a[b];
}
variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
varDecl(hasName("b")))))))
matches "int a[b]"
< / pre > < / td > < / tr >
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html" > WhileStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasBody2')" > < a name = "hasBody2Anchor" > hasBody< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Stmt.html" > Stmt< / a > > InnerMatcher< / td > < / tr >
2020-09-23 21:08:14 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasBody2" > < pre > < / pre > < / td > < / tr >
2015-11-20 15:46:19 +08:00
2018-11-05 01:02:00 +08:00
< tr > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html" > WhileStmt< / a > > < / td > < td class = "name" onclick = "toggle('hasCondition2')" > < a name = "hasCondition2Anchor" > hasCondition< / a > < / td > < td > Matcher< < a href = "https://clang.llvm.org/doxygen/classclang_1_1Expr.html" > Expr< / a > > InnerMatcher< / td > < / tr >
2015-11-20 15:46:19 +08:00
< tr > < td colspan = "4" class = "doc" id = "hasCondition2" > < pre > Matches the condition expression of an if statement, for loop,
2016-05-30 23:25:25 +08:00
switch statement or conditional operator.
2015-11-20 15:46:19 +08:00
Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
if (true) {}
< / pre > < / td > < / tr >
2015-11-20 15:57:46 +08:00
<!-- END_TRAVERSAL_MATCHERS -->
< / table >
< / div >
< / body >
< / html >