So here's a bit more background what I try to achieve:
I want to match the following return statement
`A<V> func() {
X x;
B<W> b;
return x.meth(b);
}`
Here are the classes:
`template<class T> struct A {
template<class S> A(A<S>);
A();
};
template<class T> struct B : public A {
};
struct V {};
struct W : public V {};
struct X {
template<class T> B<T> meth(A<T>);
};`
That's my matcher:
`returnStmt(
ignoringParenImpCasts(
has(memberCallExpr(
on(hasType(recordDecl(hasName("X")))),
callee(methodDecl(hasName("meth")))))))`
however, ignoringParenImpCasts doesn't work in above example, as there are
three CXXConstructCalls in between:
`ReturnStmt
`-CXXConstructExpr 'A<V>':'class A<class V>' 'void (const class A<class V>
&) throw()' elidable
`-MaterializeTemporaryExpr 'const class A<class V>' lvalue
`-ImplicitCastExpr 'const class A<class V>' <NoOp>
`-ImplicitCastExpr 'A<V>':'class A<class V>' <ConstructorConversion>
`-CXXConstructExpr 'A<V>':'class A<class V>' 'void (A<class W>)'
`-CXXConstructExpr 'A<class W>':'class A<class W>' 'void (const
class A<class W> &) throw()'
`-MaterializeTemporaryExpr 'const class A<class W>' lvalue
`-ImplicitCastExpr 'const class A<class W>' <NoOp>
`-ImplicitCastExpr 'class A<class W>' <DerivedToBase (A)>
`-CXXMemberCallExpr 'B<class W>':'class B<class W>'
|-MemberExpr '<bound member function type>' .meth
| `-DeclRefExpr 'X':'class X' lvalue Var 'x' 'X':'class
X'
`-...`
Since the number of CXXConstructExpr depends on what types exactly are used,
matching all possible combinations is a bit tedious.
Anyway, IgnoreImplicit() doesn't seem to achieve this.
http://llvm-reviews.chandlerc.com/D720
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits