[cfe-dev] Problem to match a break in a for loop
David Come via cfe-dev
cfe-dev at lists.llvm.org
Thu Jul 6 06:13:42 PDT 2017
Hello,
There is missing closing ')' in your snippet (I think it is a typo).
The following works fine in clang query
breakStmt(hasAncestor(anyOf(forStmt().bind("breakForParent"),doStmt(),
whileStmt(),cxxForRangeStmt(),switchStmt())))
On
int main(int argc, char *argv[])
{
for(int i = 0 ;i < 10;++i){
if(i == 5){break;}
}
it outputs
/home/david/code/d.cpp:118:3: note: "breakForParent" binds here
for(int i = 0 ;i < 10;++i){
^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/david/code/d.cpp:119:13: note: "root" binds here
if(i == 5){break;}
David Come
On 05/07/2017 00:54, Loïc Joly via cfe-dev wrote:
> This is a repost, my initial post seems to be lost... Sorry if you
> already received it...
>
> Hello,
>
> I’m trying to write a matcher for a break in a for loop. I’m writing
> it that way:
> breakStmt(
> hasAncestor(anyOf(
> forStmt().bind(breakForParent), // A break can happen
> in a for
> doStmt(), // or in another loop
> whileStmt(),
> cxxForRangeStmt(),
> switchStmt() // or in a switch
> ))
>
>
> The goal is to match the closest ancestor that can have some meaning
> for a break statement, and detect if it is a for loop or another
> statement.
>
> This looks to work fine when I’m in clang-query, but when I try to
> compile the code (with visual C++), I have the following error:
>
> 1>xxx.cpp(149): error C2784:
> 'clang::ast_matchers::internal::ArgumentAdaptingMatcherFunc<clang::ast_matchers::internal::HasAncestorMatcher,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>>::Adaptor<T>
> clang::ast_matchers::internal::ArgumentAdaptingMatcherFunc<clang::ast_matchers::internal::HasAncestorMatcher,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>>::operator
> ()(const clang::ast_matchers::internal::Matcher<From> &) const' :
> could not deduce template argument for 'const
> clang::ast_matchers::internal::Matcher<From> &' from
> 'clang::ast_matchers::internal::VariadicOperatorMatcher<clang::ast_matchers::internal::Matcher<clang::Stmt>,ResultT,ResultT,ResultT,ResultT>'
> 1> with
> 1> [
> 1> ResultT=clang::ast_matchers::internal::BindableMatcher<clang::Stmt>
> 1> ]
> 1> include\clang\astmatchers\astmatchersinternal.h(1054) : see
> declaration of
> 'clang::ast_matchers::internal::ArgumentAdaptingMatcherFunc<clang::ast_matchers::internal::HasAncestorMatcher,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>,clang::ast_matchers::internal::TypeList<clang::Decl,clang::NestedNameSpecifierLoc,clang::Stmt,clang::TypeLoc>>::operator
> ()'
>
> Is this something I’m not supposed to do, or is it more something like
> a bug in clang or in my compiler?
>
> Thank you,
>
> ---
> Loïc Joly
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list