[clang-tools-extra] [clang-reorder-fields] Prevent rewriting unsupported cases (PR #142149)
Vladimir Vuksanovic via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 9 00:49:01 PDT 2025
================
@@ -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
More information about the cfe-commits
mailing list