[cfe-dev] SourceLoc comparison

Rafael·Stahl via cfe-dev cfe-dev at lists.llvm.org
Thu Dec 13 06:02:23 PST 2018


Hi,

When grabbing SourceLocs from different Preprocessors, they cannot be 
compared with each other by using their comparison operator.

I assume this is because they have some kind of pointer identity and 
equality just compares raw representations.

I attached a function that helped me solve this issue. Can you please 
give feedback if I missed something existing or if there is an issue 
with my approach? Or maybe the SourceManager/Preprocessor should not 
even create new "duplicate" SrcLocs in this case?

Regards
Rafael

---

bool clutil::DeepSrcLocEqual(clang::SourceLocation lhs, 
clang::SourceLocation rhs, const clang::SourceManager &SM)
{
     if (lhs == rhs)
         return true;

     if (SM.getExpansionLoc(lhs) != SM.getExpansionLoc(rhs))
         return false;
     if (SM.getSpellingLoc(lhs) != SM.getSpellingLoc(rhs))
         return false;

     clang::SourceLocation lhsMacro, rhsMacro;
     if (SM.isMacroArgExpansion(lhs, &lhsMacro))
     {
         if (!SM.isMacroArgExpansion(rhs, &rhsMacro))
             return false;
         if (!DeepSrcLocEqual(lhsMacro, rhsMacro, SM))
             return false;
     }

     return true;
}

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5449 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20181213/5c970eec/attachment.bin>


More information about the cfe-dev mailing list