[cfe-dev] Visiting Implicit Code [RecursiveASTVisitor]

Alexandros Tzannes atzannes at illinois.edu
Wed Jun 5 10:54:21 PDT 2013


Hi all,
I am interesting in fixing this bug, unless someone is already working 
on it, but I may need some help as I am not familiar with the parser 
side of the Frontend in clang. Does anyone have any suggestions or 
advice on my question below?

Thanks in advance
Alex

On 05/30/2013 11:35 PM, Alexandros Tzannes wrote:
> 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
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

-- 
"Under the Illinois Freedom of Information Act (FOIA), any written
communication to or from University employees regarding University
business is a public record and may be subject to public disclosure."




More information about the cfe-dev mailing list