================ @@ -50,6 +51,63 @@ static const RecordDecl *findDefinition(StringRef RecordName, return selectFirst<RecordDecl>("recordDecl", Results); } +static bool isSafeToRewrite(const RecordDecl *Decl, const ASTContext &Context) { + // All following checks expect at least one field declaration. + if (Decl->field_empty()) + return true; + + // 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; + } + + // Prevent rewriting if there are preprocessor directives present between the + // start of the first field and the end of last field. + const SourceManager &SM = Context.getSourceManager(); + std::pair<FileID, unsigned> FileAndOffset = + SM.getDecomposedLoc(Decl->field_begin()->getBeginLoc()); + auto LastField = Decl->field_begin(); + while (std::next(LastField) != Decl->field_end()) + ++LastField; + unsigned EndOffset = SM.getFileOffset(LastField->getEndLoc()); ---------------- alexander-shaposhnikov wrote:
if there are no fields, wouldn't this code be problematic ? (field_begin() == field_end()) 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