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