SourceLocation::isFileID() and isMacroID() ?

dear cfe-dev list,

When visiting the clang AST of a C source, I often get SourceLocations that
aren't valid or aren't FileID. Why some locations are not valid?
And what does it mean that a location isn't a file ID?

It seems to happen almost always in asm file scope declarations.

Moreover, what does isMacroID() false or true mean?

Once again,
thanks.
pb

dear cfe-dev list,

When visiting the clang AST of a C source, I often get SourceLocations that
aren't valid or aren't FileID. Why some locations are not valid?

Invalid source locations come from two things 1) synthesized AST objects that don't exist in the source code, and 2) bugs in the parser.

And what does it mean that a location isn't a file ID?

This currently means it is coming from a macro expansion.

It seems to happen almost always in asm file scope declarations.

That is probably a bug in the parser, not preserving location info correctly.

Moreover, what does isMacroID() false or true mean?

By example, consider this file:

#define x y

x z

The first token will be a SourceLocation that is a macro ID. SourceManager will be able to tell you it's "spelling" location (which is "y") as well as its "instantiation" location (which is the x before the z). The second location is a file ID. SourceManager will tell you that it's spelling and instantiation location are the same, both the z.

I plan to make some major changes in this area today and over the weekend. You might want to wait until the dust settles before grinding on details of SourceLocation itself. In any case, I'd recommend using the SourceManager methods like "getInstantiationLoc" and "getSpellingLoc" rather than poking at the SourceLocation itself.

-Chris