[PATCH] D35972: Add warning to clang-reorder-fields when reordering breaks member init list dependencies

Sam Conrad via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 29 19:05:32 PDT 2017


sameconrad added inline comments.


================
Comment at: clang-reorder-fields/ReorderFieldsAction.cpp:178
   for (const auto *Initializer : CtorDecl->inits()) {
-    if (!Initializer->isWritten())
+    if (!Initializer->isMemberInitializer() || !Initializer->isWritten())
       continue;
----------------
While adding tests for emitting warnings about base class members I found another bug here- non-member initializers don't have a field decl and so would result in undefind behavior further down when accessing field indexes (I added the test case ClassDerived which would cause a segfault before this change).


================
Comment at: clang-reorder-fields/ReorderFieldsAction.cpp:111
+        Results.insert(FD);
+  return Results;
+}
----------------
compnerd wrote:
> What if the `FieldDecl` belongs to a base class?  Can you add a test case for that scenario?
I've added tests for this scenario and an explanatory comment.  It doesn't seem this is actually a problem due to the way Clang constructs the AST.  Sema::PerformObjectMemberConversion always inserts an implicit UncheckedDerivedToBase cast when accessing a base class member which means that hasObjectExpression(cxxThisExpr()) won't actually match against such an expression. 


================
Comment at: test/clang-reorder-fields/FieldDependencyWarning.cpp:3
+
+#include <string>
+
----------------
alexshap wrote:
> tests should not depend on STL (for good examples see how things are done in clang-tidy tests), so simply remove this include and define a small class with a constructor right here 
This has been updated to use a simple struct.


https://reviews.llvm.org/D35972





More information about the cfe-commits mailing list