aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp')
-rw-r--r--clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp b/clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp
index affa276..5770bf7 100644
--- a/clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp
+++ b/clang-tools-extra/clang-reorder-fields/ReorderFieldsAction.cpp
@@ -164,6 +164,22 @@ getNewFieldsOrder(const RecordDecl *Definition,
return NewFieldsOrder;
}
+static bool isOrderValid(const RecordDecl *RD, ArrayRef<unsigned> FieldOrder) {
+ if (FieldOrder.empty())
+ return false;
+
+ // If there is a flexible array member in the struct, it must remain the last
+ // field.
+ if (RD->hasFlexibleArrayMember() &&
+ FieldOrder.back() != FieldOrder.size() - 1) {
+ llvm::errs()
+ << "Flexible array member must remain the last field in the struct\n";
+ return false;
+ }
+
+ return true;
+}
+
struct ReorderedStruct {
public:
ReorderedStruct(const RecordDecl *Decl, ArrayRef<unsigned> NewFieldsOrder)
@@ -662,7 +678,7 @@ public:
return;
SmallVector<unsigned, 4> NewFieldsOrder =
getNewFieldsOrder(RD, DesiredFieldsOrder);
- if (NewFieldsOrder.empty())
+ if (!isOrderValid(RD, NewFieldsOrder))
return;
ReorderedStruct RS{RD, NewFieldsOrder};
@@ -699,7 +715,7 @@ public:
std::unique_ptr<ASTConsumer> ReorderFieldsAction::newASTConsumer() {
return std::make_unique<ReorderingConsumer>(RecordName, DesiredFieldsOrder,
- Replacements);
+ Replacements);
}
} // namespace reorder_fields