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,
164
164
return NewFieldsOrder;
165
165
}
166
166
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
+
167
183
struct ReorderedStruct {
168
184
public:
169
185
ReorderedStruct (const RecordDecl *Decl, ArrayRef<unsigned > NewFieldsOrder)
@@ -662,7 +678,7 @@ class ReorderingConsumer : public ASTConsumer {
662
678
return ;
663
679
SmallVector<unsigned , 4 > NewFieldsOrder =
664
680
getNewFieldsOrder (RD, DesiredFieldsOrder);
665
- if (NewFieldsOrder. empty ( ))
681
+ if (! isOrderValid (RD, NewFieldsOrder ))
666
682
return ;
667
683
ReorderedStruct RS{RD, NewFieldsOrder};
668
684
@@ -699,7 +715,7 @@ class ReorderingConsumer : public ASTConsumer {
699
715
700
716
std::unique_ptr<ASTConsumer> ReorderFieldsAction::newASTConsumer () {
701
717
return std::make_unique<ReorderingConsumer>(RecordName, DesiredFieldsOrder,
702
- Replacements);
718
+ Replacements);
703
719
}
704
720
705
721
} // 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