================ @@ -50,6 +50,55 @@ static const RecordDecl *findDefinition(StringRef RecordName, return selectFirst<RecordDecl>("recordDecl", Results); } +static bool isSafeToRewrite(const RecordDecl *Decl, const ASTContext &Context) { + // Don't attempt to rewrite if there is a declaration like 'int a, b;'. + SourceLocation LastTypeLoc; + for (const auto &Field : Decl->fields()) { + SourceLocation TypeLoc = + Field->getTypeSourceInfo()->getTypeLoc().getBeginLoc(); + if (LastTypeLoc.isValid() && TypeLoc == LastTypeLoc) + return false; + LastTypeLoc = TypeLoc; + } + + // Don't attempt to rewrite if a single macro expansion creates multiple + // fields. + SourceLocation LastMacroLoc; + for (const auto &Field : Decl->fields()) { + if (!Field->getLocation().isMacroID()) + continue; + SourceLocation MacroLoc = + Context.getSourceManager().getExpansionLoc(Field->getLocation()); + if (LastMacroLoc.isValid() && MacroLoc == LastMacroLoc) + return false; + LastMacroLoc = MacroLoc; + } + + // Skip if there are preprocessor directives present. + const SourceManager &SM = Context.getSourceManager(); + std::pair<FileID, unsigned> FileAndOffset = + SM.getDecomposedLoc(Decl->getSourceRange().getBegin()); + unsigned EndOffset = SM.getFileOffset(Decl->getSourceRange().getEnd()); + StringRef SrcBuffer = SM.getBufferData(FileAndOffset.first); + Lexer L(SM.getLocForStartOfFile(FileAndOffset.first), Context.getLangOpts(), + SrcBuffer.data(), SrcBuffer.data() + FileAndOffset.second, ---------------- vvuksanovic wrote:
I agree. Changed the range and added a test. https://github.com/llvm/llvm-project/pull/142149 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits