<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>