[PATCH] D18584: Complete support for C++ Core Guidelines Type.6: Always initialize a member variable.

Michael Miller via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 8 01:58:47 PDT 2016


michael_miller marked 4 inline comments as done.
michael_miller added a comment.

In http://reviews.llvm.org/D18584#395208, @alexfh wrote:

> Looks good from my side. Please wait for the Aaron's approval.
>
> Thank you for working on this!


No problem! Thanks for taking the time to review and give feedback. clang-tidy is such a great tool. It's my honor and pleasure to be able to contribute and give back even a little!


================
Comment at: clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp:25
@@ -24,3 +24,3 @@
 
-namespace {
 
----------------
aaron.ballman wrote:
> Please do not remove the unnamed namespace; it is preferable to using static functions.
Ok, I can put the anonymous namespace around everything and remove the static specifiers. I moved it down lower to enclose the local class definition because it wasn't previously. I would normally wrap the whole thing but the LLVM coding standards seem to say the opposite of what I'm used to doing with regard to static functions vs anonymous namespaces:
http://llvm.org/docs/CodingStandards.html#anonymous-namespaces

================
Comment at: clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp:51
@@ +50,3 @@
+  return true;
+}
+
----------------
I was wondering about that too but didn't really know how to proceed. I did come across SemaExprCXX.cpp while looking to see how std::is_trivially_default_constructible was implemented. Being unfamiliar with that part of the codebase, though, I didn't dig too far into how to either share that code or hook into it.

================
Comment at: clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp:243
@@ +242,3 @@
+// initializer.
+static const NamedDecl *getInitializerDecl(const CXXCtorInitializer *Init) {
+  if (Init->isMemberInitializer())
----------------
aaron.ballman wrote:
> Since this function is only used once, I think it should be lowered into its use as a ternary conditional.
I've gone ahead and done this but I think it's less readable afterwards. The reason it's problematic is because the return types from the two subexpressions aren't the same so it can't be used as a ternary conditional without a cast.

================
Comment at: clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp:486
@@ +485,3 @@
+
+  // Do not propose fixes in macros since we cannot place them correctly.
+  if (Ctor->getLocStart().isMacroID())
----------------
aaron.ballman wrote:
> I think this code belongs in `fixInitializerList` then, doesn't it?
Sure. I think one reason I didn't was because of line 426 which is structured similarly. Stylistically, I slightly prefer to test the condition explicitly rather than have an early return but it's perfectly fine either way.

================
Comment at: test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp:334
@@ +333,2 @@
+  // CHECK-FIXES: int X{};
+};
----------------
aaron.ballman wrote:
> I'd like to see how we handle the following test:
> ```
> struct S {
>   S(int i);
> };
> struct T {
>   T(float f);
> };
> 
> union U {
>   S s;
>   T t;
> };
> ```
For a number of reasons, it doesn't hit any warnings:
  # We don't do anything to record types without any members.
  # U doesn't have a user-provided constructor. We only initialize members if there's a user-provided constructor of some sort.
  # If we declared an instance of U as a local variable, we would have to explicitly initialize it. The default constructor is implicitly deleted because of S and T.








http://reviews.llvm.org/D18584





More information about the cfe-commits mailing list