[cfe-dev] Matching Indirect base classes

Pedro Delgado Perez pedro.delgado at uca.es
Mon Nov 11 02:04:55 PST 2013


 
Well, using as reference what you named of Sema::CheckUsingDeclQualifier, I tried the following;

DeclarationMatcher I_Matcher = recordDecl().bind("var");

class HVD : public MatchFinder::MatchCallback {
public :

 llvm::SmallPtrSet<const CXXRecordDecl*, 4> Bases;
 
 static bool collect(const CXXRecordDecl *Base, void *OpaqueData) {
     HVD *Data = reinterpret_cast<HVD*>(OpaqueData);
     Data->Bases.insert(Base);
     return true;
 }
 
 virtual void run(const MatchFinder::MatchResult &Result) {
     ... ....
    if (const CXXRecordDecl *FS = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("var")){
        if(FS->forallBases(collect, this)){
             for(llvm::SmallPtrSet<const CXXRecordDecl*, 4>::const_iterator i = Bases.begin(); i != Bases.end(); i++){
                 ... ... 
             }
       }
    }
 }
};

1 - To tell you the truth, I have no idea what I have to do with OpaqueData. Is what I put above correct?
2 - I got an error doing this and I can't understand the problem.

IHD_operator: /home/pedro/clang-llvm/llvm/tools/clang/include/clang/AST/DeclCXX.h:558: const clang::CXXRecordDecl::DefinitionData& clang::CXXRecordDecl::data() const: Assertion `DefinitionData && "queried property of class with no definition"' failed.
Stack dump:
0.   <eof> parser at end of file

3. Once inside the for loop, how can I get each object CXXRecordDecl through SmallPtrSetIterator. [ http://llvm.org/docs/doxygen/html/classllvm_1_1SmallPtrSetIterator.html#ac931fc62430140f2cce08d72e5f27c82 ]

Thanks for your time,

Pedro.

El día 08 nov 2013 18:30, Daniel Jasper <djasper at google.com> escribió:
> Yes, sorry, lookupInBases() is what I meant. You'll need forAllBases(). You can pass in a ForallBasesCallback, which is basically a callback function executed for each base class.
> I have not used this myself, but for an example, look at:
> CXXRecordDecl::isProvablyNotDerivedFrom defined in lib/AST/CXXInheritance.cpp.
> 
> 
> Also lib/Sema/SemaDeclCXX.cpp has an example close to the bottom of Sema::CheckUsingDeclQualifier()
> that collects all of the bases into a SmallPtrSet.
> 
> 
> 
> On Fri, Nov 8, 2013 at 9:16 AM, Pedro Delgado Perez <pedro.delgado at uca.es [ mailto:pedro.delgado at uca.es ]> wrote:
> 
> 
> Hi,
> 
> Thanks Daniel, I suppose you mean CXXRecordDecl::lookupInBases() instead CXXRecordDecl::findInBases().
> 
> Have you ever used one of these methods? I don't understand quite well how can I use them for my purpose. What I need is that, given an object CXXRecordDecl, I can analyze something in particular in each one of its base classes (direct or indirect). Thus, I need to get each one of these classes to process them, but the methods you refer only return a bool.
> 
> Could you please show me an example using these methods? Mainly, with respect the arguments passed to these methdos.
> 
> Thanks,
> 
> Pedro.
> 
> El día 08 nov 2013 15:32, Daniel Jasper <djasper at google.com [ mailto:djasper at google.com ]> escribió:
> 
> 
> Take a look at CXXRecordDecl::forallBases() and CXXRecordDecl::findInBases(). Dependent on what you want to do, one of them might do what you need.
> Cheers,
> Daniel
> 
> 
> 
> On Fri, Nov 8, 2013 at 2:39 AM, Pedro Delgado Perez <pedro.delgado at uca.es [ mailto:pedro.delgado at uca.es ]> wrote:
> 
> 
> Hello,
> 
> Please, I need some help with an issue I noticed a few days ago and I am not able to solve.
> 
> To illustrate my problem, I show this piece of code:
> 
> class A{
>    public:
>       A(): a(1) {};
>       int a;
> };
> 
> class B: public A{
>    public:
>       B(): b(2){};
>       int b;
> };
> 
> class C: public B{
>    public:
>       C(): c(3){};
>       int b;
>       int a;
> };
> 
> We have three classes, where:
> B inherits directly from A
> C inherits directly from B and INDIRECTLY from A
> 
> Using CXXRecordDecl::base_class_iterator, the classes indirectly inherited are not visited. Please, can someone explain me how to take into account these indirectly inherited base classes? I've been thinking on recursion (use base_class_iterator on each class directly inherited), but I'm sure there should be another simpler way to do this.
> 
> Thanks in advance,
> 
> Pedro.
> 
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu [ mailto:cfe-dev at cs.uiuc.edu ]
> 
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev [ http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev ]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131111/e8797196/attachment.html>


More information about the cfe-dev mailing list