<p dir="ltr">Fwiw, if I'm not mistaken, explicit on more - than - one - arg actors does have some meaning in c++11. It means you can't construct from a braced init list.</p>
<p dir="ltr">I'm not sure if that's important to you/this warning.</p>
<div class="gmail_quote">On Jun 21, 2014 4:26 PM, "Alexander Kornienko" <<a href="mailto:alexfh@google.com">alexfh@google.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi djasper,<br>
<br>
Remove 'explicit' keyword from constructors with multiple (non-default)<br>
arguments (clang-tidy google-explicit-constructor check).<br>
<br>
<a href="http://reviews.llvm.org/D4242" target="_blank">http://reviews.llvm.org/D4242</a><br>
<br>
Files:<br>
  clang-tidy/google/ExplicitConstructorCheck.cpp<br>
  unittests/clang-tidy/GoogleModuleTest.cpp<br>
<br>
Index: clang-tidy/google/ExplicitConstructorCheck.cpp<br>
===================================================================<br>
--- clang-tidy/google/ExplicitConstructorCheck.cpp<br>
+++ clang-tidy/google/ExplicitConstructorCheck.cpp<br>
@@ -55,30 +55,37 @@<br>
   if (Ctor->isOutOfLine() || Ctor->isImplicit() || Ctor->isDeleted())<br>
     return;<br>
<br>
-  if (Ctor->isExplicit() && Ctor->isCopyOrMoveConstructor()) {<br>
+  bool IsSingleArgumentCtor =<br>
+      Ctor->getNumParams() > 0 && Ctor->getMinRequiredArguments() <= 1;<br>
+  bool RequiredExplicit =<br>
+      !Ctor->isCopyOrMoveConstructor() && IsSingleArgumentCtor;<br>
+<br>
+  if (Ctor->isExplicit() && !RequiredExplicit) {<br>
     auto isKWExplicit = [](const Token &Tok) {<br>
       return Tok.is(tok::raw_identifier) &&<br>
              Tok.getRawIdentifier() == "explicit";<br>
     };<br>
     SourceRange ExplicitTokenRange =<br>
         FindToken(*Result.SourceManager, Result.Context->getLangOpts(),<br>
                   Ctor->getOuterLocStart(), Ctor->getLocEnd(), isKWExplicit);<br>
+    StringRef ConstructorType =<br>
+        !IsSingleArgumentCtor ? "Multiple arguments"<br>
+                              : (Ctor->isMoveConstructor() ? "Move" : "Copy");<br>
     DiagnosticBuilder Diag =<br>
         diag(Ctor->getLocation(), "%0 constructor declared explicit.")<br>
-        << (Ctor->isMoveConstructor() ? "Move" : "Copy");<br>
+        << ConstructorType;<br>
     if (ExplicitTokenRange.isValid()) {<br>
       Diag << FixItHint::CreateRemoval(<br>
           CharSourceRange::getCharRange(ExplicitTokenRange));<br>
     }<br>
-  }<br>
-<br>
-  if (Ctor->isExplicit() || Ctor->isCopyOrMoveConstructor() ||<br>
-      Ctor->getNumParams() == 0 || Ctor->getMinRequiredArguments() > 1)<br>
     return;<br>
+  }<br>
<br>
-  SourceLocation Loc = Ctor->getLocation();<br>
-  diag(Loc, "Single-argument constructors must be explicit")<br>
-      << FixItHint::CreateInsertion(Loc, "explicit ");<br>
+  if (!Ctor->isExplicit() && RequiredExplicit) {<br>
+    SourceLocation Loc = Ctor->getLocation();<br>
+    diag(Loc, "Single-argument constructors must be explicit")<br>
+        << FixItHint::CreateInsertion(Loc, "explicit ");<br>
+  }<br>
 }<br>
<br>
 } // namespace tidy<br>
Index: unittests/clang-tidy/GoogleModuleTest.cpp<br>
===================================================================<br>
--- unittests/clang-tidy/GoogleModuleTest.cpp<br>
+++ unittests/clang-tidy/GoogleModuleTest.cpp<br>
@@ -40,11 +40,17 @@<br>
 TEST(ExplicitConstructorCheckTest, RemoveExplicit) {<br>
   EXPECT_EQ("class A { A(const A&); };\n"<br>
             "class B { /*asdf*/  B(B&&); };\n"<br>
-            "class C { /*asdf*/  C(const C&, int i = 0); };",<br>
+            "class C { /*asdf*/  C(const C&, int i = 0); };\n"<br>
+            "class D { D(int a, int b); };\n"<br>
+            "class D2 { explicit D2(int a, int b = 0); };\n"<br>
+            "class E { E(int a, int b, int c = 0); };",<br>
             runCheckOnCode<ExplicitConstructorCheck>(<br>
                 "class A { explicit    A(const A&); };\n"<br>
                 "class B { explicit   /*asdf*/  B(B&&); };\n"<br>
-                "class C { explicit/*asdf*/  C(const C&, int i = 0); };"));<br>
+                "class C { explicit/*asdf*/  C(const C&, int i = 0); };\n"<br>
+                "class D { explicit D(int a, int b); };\n"<br>
+                "class D2 { explicit D2(int a, int b = 0); };\n"<br>
+                "class E { explicit E(int a, int b, int c = 0); };"));<br>
 }<br>
<br>
 TEST(ExplicitConstructorCheckTest, RemoveExplicitWithMacros) {<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div>