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

Alexei Svitkine alexei.svitkine at gmail.com
Wed Aug 26 10:17:49 PDT 2009


When I parse input that consists of simply "#include <stdio.h>" on Mac
OS X 10.5.7, I get an invalid FD->getTypeSpecStartLoc() for "long
ftell(FILE *)".

-Alexei

On Wed, Aug 26, 2009 at 4:50 AM, Chris Lattner<clattner at apple.com> wrote:
>
> 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