Kaydet (Commit) 17cfe6e2 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Make checkIdenticalDefaultArguments more precise

...when creating objects of the same derived type

Change-Id: I109b614473a2fb5b08dddd07a4fbe757086141a1
Reviewed-on: https://gerrit.libreoffice.org/44716Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst 2d42c1a8
...@@ -26,6 +26,20 @@ Base classes for plugin actions. ...@@ -26,6 +26,20 @@ Base classes for plugin actions.
namespace loplugin namespace loplugin
{ {
namespace {
Expr const * skipImplicit(Expr const * expr) {
if (auto const e = dyn_cast<MaterializeTemporaryExpr>(expr)) {
expr = e->GetTemporaryExpr();
}
if (auto const e = dyn_cast<CXXBindTemporaryExpr>(expr)) {
expr = e->getSubExpr();
}
return expr;
}
}
Plugin::Plugin( const InstantiationData& data ) Plugin::Plugin( const InstantiationData& data )
: compiler( data.compiler ), handler( data.handler ), name( data.name ) : compiler( data.compiler ), handler( data.handler ), name( data.name )
{ {
...@@ -247,27 +261,29 @@ Plugin::IdenticalDefaultArgumentsResult Plugin::checkIdenticalDefaultArguments( ...@@ -247,27 +261,29 @@ Plugin::IdenticalDefaultArgumentsResult Plugin::checkIdenticalDefaultArguments(
: IdenticalDefaultArgumentsResult::No; : IdenticalDefaultArgumentsResult::No;
} }
#endif #endif
if (auto const lit1 = dyn_cast<clang::StringLiteral>( auto const desugared1 = argument1->IgnoreParenImpCasts();
argument1->IgnoreParenImpCasts())) auto const desugared2 = argument2->IgnoreParenImpCasts();
{ if (auto const lit1 = dyn_cast<clang::StringLiteral>(desugared1)) {
if (auto const lit2 = dyn_cast<clang::StringLiteral>( if (auto const lit2 = dyn_cast<clang::StringLiteral>(desugared2)) {
argument2->IgnoreParenImpCasts()))
{
return lit1->getBytes() == lit2->getBytes() return lit1->getBytes() == lit2->getBytes()
? IdenticalDefaultArgumentsResult::Yes ? IdenticalDefaultArgumentsResult::Yes
: IdenticalDefaultArgumentsResult::No; : IdenticalDefaultArgumentsResult::No;
} }
} }
// catch params with defaults like "= OUString()" // catch params with defaults like "= OUString()"
if (isa<MaterializeTemporaryExpr>(argument1) if (auto const e1 = dyn_cast<CXXConstructExpr>(skipImplicit(desugared1))) {
&& isa<MaterializeTemporaryExpr>(argument2)) if (auto const e2 = dyn_cast<CXXConstructExpr>(
{ skipImplicit(desugared2)))
return IdenticalDefaultArgumentsResult::Yes; {
} if ((e1->getConstructor()->getCanonicalDecl()
if (isa<CXXBindTemporaryExpr>(argument1) != e2->getConstructor()->getCanonicalDecl()))
&& isa<CXXBindTemporaryExpr>(argument2)) {
{ return IdenticalDefaultArgumentsResult::No;
return IdenticalDefaultArgumentsResult::Yes; }
if (e1->getNumArgs() == 0 && e2->getNumArgs() == 0) {
return IdenticalDefaultArgumentsResult::Yes;
}
}
} }
return IdenticalDefaultArgumentsResult::Maybe; return IdenticalDefaultArgumentsResult::Maybe;
} }
......
...@@ -90,4 +90,16 @@ struct DerivedSlightlyDifferent : Base ...@@ -90,4 +90,16 @@ struct DerivedSlightlyDifferent : Base
} }
}; };
struct Base2
{
void default1(Base const& = SimpleDerived());
void default2(Base const& = SimpleDerived());
};
struct Derived2 : Base2
{
void default1(Base const& x = Intermediate1()) { Base2::default1(x); } // no warning
void default2(Base const& x = SimpleDerived()) { Base2::default2(x); } // expected-error {{public function just calls public parent [loplugin:unnecessaryoverride]}}
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment