File tree Expand file tree Collapse file tree 2 files changed +28
-2
lines changed Expand file tree Collapse file tree 2 files changed +28
-2
lines changed Original file line number Diff line number Diff line change @@ -164,6 +164,22 @@ getNewFieldsOrder(const RecordDecl *Definition,
164164 return NewFieldsOrder;
165165}
166166
167+ static bool isOrderValid (const RecordDecl *RD, ArrayRef<unsigned > FieldOrder) {
168+ if (FieldOrder.empty ())
169+ return false ;
170+
171+ // If there is a flexible array member in the struct, it must remain the last
172+ // field.
173+ if (RD->hasFlexibleArrayMember () &&
174+ FieldOrder.back () != FieldOrder.size () - 1 ) {
175+ llvm::errs ()
176+ << " Flexible array member must remain the last field in the struct\n " ;
177+ return false ;
178+ }
179+
180+ return true ;
181+ }
182+
167183struct ReorderedStruct {
168184public:
169185 ReorderedStruct (const RecordDecl *Decl, ArrayRef<unsigned > NewFieldsOrder)
@@ -662,7 +678,7 @@ class ReorderingConsumer : public ASTConsumer {
662678 return ;
663679 SmallVector<unsigned , 4 > NewFieldsOrder =
664680 getNewFieldsOrder (RD, DesiredFieldsOrder);
665- if (NewFieldsOrder. empty ( ))
681+ if (! isOrderValid (RD, NewFieldsOrder ))
666682 return ;
667683 ReorderedStruct RS{RD, NewFieldsOrder};
668684
@@ -699,7 +715,7 @@ class ReorderingConsumer : public ASTConsumer {
699715
700716std::unique_ptr<ASTConsumer> ReorderFieldsAction::newASTConsumer () {
701717 return std::make_unique<ReorderingConsumer>(RecordName, DesiredFieldsOrder,
702- Replacements);
718+ Replacements);
703719}
704720
705721} // namespace reorder_fields
Original file line number Diff line number Diff line change 1+ // RUN: clang-reorder-fields -record-name Foo -fields-order z,y,x %s -- 2>&1 | FileCheck --check-prefix=CHECK-BAD %s
2+ // RUN: clang-reorder-fields -record-name Foo -fields-order y,x,z %s -- | FileCheck --check-prefix=CHECK-GOOD %s
3+
4+ // CHECK-BAD: {{^Flexible array member must remain the last field in the struct}}
5+
6+ struct Foo {
7+ int x ; // CHECK-GOOD: {{^ int y;}}
8+ int y ; // CHECK-GOOD-NEXT: {{^ int x;}}
9+ int z []; // CHECK-GOOD-NEXT: {{^ int z\[\];}}
10+ };
You can’t perform that action at this time.
0 commit comments