[cfe-users] Question about ASTContext::getParents(): How to avoid empty list return?

Klaus Leppkes via cfe-users cfe-users at lists.llvm.org
Sat Dec 10 14:27:21 PST 2016


Hi,

my problem is that in some cases ASTContext::getParents() returns an empty
list, reproducible with release_38 and 39, so I think it's not a bug and I
missed an important point.

a) To understand the problem: In which cases does getParents() return an
empty list and in which is doesn't?

b) Is there an easier way to get just the parent of an ASTNode?

I am working on a clang tool which (should) insert strings to convert
implicit casts to explicit casts withins C++ Code.

Internally I need to get the parent AST Node (decl or stmt) of each implicit
cast Node (I'm using an ResursiveASTVisior approach) to determ if the cast
was already handled correctly.

Any help is welcome.

Cheers,
Klaus

In my small testcase it surprisingly depends on whether or not an
implicit cast is part of an include file (uncomment b=7.0 to see the
effect). All other transformation to test.cpp are working fine.

//BEGIN test.cpp:
#include "test.hpp"
void test() {
        double dblx=17.3;
        int implicitcast1=dblx/2;
        int cstylecast=(int)dblx/2;
}
//END test.cpp

//BEGIN test.hpp:
void foo() {
        int a=7;
        // int b=7.0; // if this line here is not commented out, it fails:(
}
//END test.hpp

My code looks like:

    bool VisitStmt(Stmt *stmt) {
        if(ImplicitCastExpr* impcast = dyn_cast<ImplicitCastExpr>(stmt)) {
            CastKind kind = impcast->getCastKind();

            if(kind==CK_FloatingToIntegral) {
                llvm::outs() << "CK_FloatingToIntegral found \n";
                //dump_location(stmt->getLocStart());
                //impcast->dump();
                auto parents = Context->getParents(*stmt);
                if ( !parents.empty() ) {
                    const Decl* decl = parents[0].get<Decl>();
                    if(decl)
                        instrument_Implicit_cast(impcast);
                    else {
                        const Stmt *ST = parents[0].get<Stmt>();
                        if(const CStyleCastExpr* ccast =
dyn_cast<CStyleCastExpr>(ST)) {
                            llvm::outs() << "CStyle cast found\n";
                        }
                        else if(const CXXStaticCastExpr* cppcast =
dyn_cast<CXXStaticCastExpr>(ST)) {
                            llvm::outs() << "static_cast found\n";
                        }
                        else {
                            instrument_Implicit_cast(impcast);
                        }
                    }
                }
                else {
                    llvm::outs() << "parents empty:(\n";
                }
            }
            else {
                //llvm::outs() << "ignored\n";
            }
        }
        return true;
    }




More information about the cfe-users mailing list