[cfe-dev] Assert in SourceManager::getFileIDSlow()

Chris Lattner clattner at apple.com
Wed Aug 26 01:50:13 PDT 2009


On Aug 26, 2009, at 12:13 AM, Alexei Svitkine wrote:

> Why would FD->getTypeSpecStartLoc() be invalid?

Maybe FD is synthesized?  I don't know, what does the ast dump show  
for the decl?

-Chris

>
> -Alexei
>
> On Wed, Aug 26, 2009 at 2:32 AM, Chris Lattner<clattner at apple.com>  
> wrote:
>> On Aug 25, 2009, at 12:30 PM, Alexei Svitkine wrote:
>>
>>> Some more details:
>>>
>>> The input being parsed doesn't have to start with a function
>>> declaration to trigger this assert.
>>>
>>> Also, removing the assert in question makes ccons work correctly.  
>>> Any
>>> chance this could be fixed?
>>>
>>> (If it could also be added to the clang 1.0 branch, that would be
>>> really appreciated.)
>>>
>>> Thanks! (Patch is attached.)
>>
>> Alexei, I don't follow why this is safe or how you're triggering  
>> it.  The
>> SourceManager sets up the "Source Location namespace" very  
>> carefully and "0"
>> is not a valid "offset".  0 is a sentinel that indicates a default
>> constructed source location.  I think you need to change your  
>> client to
>> something like this:
>>
>>
>>>>     clang::SourceLocation Loc = FD->getTypeSpecStartLoc();
>>>>     if (Loc.isValid() && SM->isFromMainFile(Loc)) {
>>
>> -Chris
>>
>>
>>>
>>> -Alexei
>>>
>>> On Tue, Aug 25, 2009 at 2:00 PM, Alexei
>>> Svitkine<alexei.svitkine at gmail.com> wrote:
>>>>
>>>> Hi,
>>>>
>>>> My code is triggering the assert:
>>>>
>>>>  assert(SLocOffset && "Invalid FileID");
>>>>
>>>> In SourceManager::getFileIDSlow().
>>>>
>>>> It happens as a result of calling SM->isFromMainFile(Loc) in some
>>>> ASTConsumer code that looks like:
>>>>
>>>> void HandleTopLevelDecl(clang::DeclGroupRef D) {
>>>>  for (clang::DeclGroupRef::iterator I = D.begin(), E = D.end();  
>>>> I != E;
>>>> ++I) {
>>>>   if (clang::FunctionDecl *FD = dyn_cast<clang::FunctionDecl> 
>>>> (*I)) {
>>>>     clang::SourceLocation Loc = FD->getTypeSpecStartLoc();
>>>>     if (SM->isFromMainFile(Loc)) {
>>>>       // ...
>>>>     }
>>>>   }
>>>>  }
>>>> }
>>>>
>>>> (The input that is being parsed begins with a function  
>>>> declaration.)
>>>>
>>>> I am not sure how old this issue is, but it makes ccons unusable
>>>> (which is quite a shame, since I hoped ccons could work fine with  
>>>> the
>>>> clang 1.0 release). Any advice would be appreciated.
>>>>
>>>> -Alexei
>>>>
>>> <sm_assert_fix.diff>_______________________________________________
>>> 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