[cfe-dev] Visiting Implicit Code [RecursiveASTVisitor]

Alexandros Tzannes atzannes at illinois.edu
Thu May 30 21:35:26 PDT 2013


Ok I (mis)filed a bug on this :) Thanks for refiling it.

Now, if I were to try and fix this bug, where would I start? More 
specifically, is getTypeSourceInfo() supposed to return null for 
implicit function declarations? Probably not, right?

On 05/29/2013 07:20 PM, Jordan Rose wrote:
> Sounds like a mistake—there are plenty of legitimate reasons to traverse the params of an implicit function. Please file a bug at http://llvm.org/bugs/.
>
> Jordan
>
>
> On May 29, 2013, at 9:39 , Alexandros Tzannes <atzannes at illinois.edu> wrote:
>
>> Hi,
>> I'm writing a checker that needs to visit and understand implicit code (among other things).
>>
>> Note: All three "should" functions of my visitor return true, though I'm not sure this matters in this specific case (keep reading).
>>   bool shouldVisitTemplateInstantiations() const { return true; }
>>   bool shouldVisitImplicitCode() const { return true; }
>>   bool shouldWalkTypesOfTypeLocs() const { return true; }
>>
>>
>> In the code below the operator= is implicit (see commented out code)
>>
>> class Data {
>> public:
>>   int x;
>>   int y;
>>
>> //inline Data &operator=(const Data &D) noexcept {
>> //  this->x = D.x;
>> //  this->y = D.y;
>> //  return *this;
>> //}
>>
>> };
>>
>> void copy(Data in, Data out) {
>>   out = in;
>> }
>>
>> I'm visiting the code using the RecursiveASTVisitor and my problem is that the parameter of the implicit function is not visited because getTypeSourceInfo() returns null on line 1739 of RecursiveASTVisitor.h
>>
>> -- RecursiveASTVisitor.h:lines 1735-1741 ----------------------------
>>
>>   // Visit the function type itself, which can be either
>>   // FunctionNoProtoType or FunctionProtoType, or a typedef.  This
>>   // also covers the return type and the function parameters,
>>   // including exception specifications.
>>   if (TypeSourceInfo *TSI = D->getTypeSourceInfo()) {
>>     TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
>>   }
>>
>> ---------------------------------------------------------------------
>>
>> Nevertheless, dumping the AST node for the CXXMethod (operator=) reveals that a nameless parameter is properly created.
>>
>> Is this behavior (of not visiting the parameters of an implicit function) by design, or a corner case that slipped through the cracks? Any advice on how to visit the parameters of implicit functions with the RecursiveASTVisitor?
>>
>> Cheers!
>> Alex
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev




More information about the cfe-dev mailing list