summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/plugin.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-11-14 13:55:17 +0100
committerStephan Bergmann <sbergman@redhat.com>2017-11-14 17:28:53 +0100
commit17cfe6e25d479428de308c22fcd218dcf8827840 (patch)
tree1123857071db62ec2a4c5cd8d8c7d2cee1ca48ec /compilerplugins/clang/plugin.cxx
parentLibreOffice.natvis: update visualizers (diff)
downloadcore-17cfe6e25d479428de308c22fcd218dcf8827840.tar.gz
core-17cfe6e25d479428de308c22fcd218dcf8827840.zip
Make checkIdenticalDefaultArguments more precise
...when creating objects of the same derived type Change-Id: I109b614473a2fb5b08dddd07a4fbe757086141a1 Reviewed-on: https://gerrit.libreoffice.org/44716 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang/plugin.cxx')
-rw-r--r--compilerplugins/clang/plugin.cxx46
1 files changed, 31 insertions, 15 deletions
diff --git a/compilerplugins/clang/plugin.cxx b/compilerplugins/clang/plugin.cxx
index 6697f94b3ee8..717d88b23091 100644
--- a/compilerplugins/clang/plugin.cxx
+++ b/compilerplugins/clang/plugin.cxx
@@ -26,6 +26,20 @@ Base classes for plugin actions.
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 )
: compiler( data.compiler ), handler( data.handler ), name( data.name )
{
@@ -247,27 +261,29 @@ Plugin::IdenticalDefaultArgumentsResult Plugin::checkIdenticalDefaultArguments(
: IdenticalDefaultArgumentsResult::No;
}
#endif
- if (auto const lit1 = dyn_cast<clang::StringLiteral>(
- argument1->IgnoreParenImpCasts()))
- {
- if (auto const lit2 = dyn_cast<clang::StringLiteral>(
- argument2->IgnoreParenImpCasts()))
- {
+ auto const desugared1 = argument1->IgnoreParenImpCasts();
+ auto const desugared2 = argument2->IgnoreParenImpCasts();
+ if (auto const lit1 = dyn_cast<clang::StringLiteral>(desugared1)) {
+ if (auto const lit2 = dyn_cast<clang::StringLiteral>(desugared2)) {
return lit1->getBytes() == lit2->getBytes()
? IdenticalDefaultArgumentsResult::Yes
: IdenticalDefaultArgumentsResult::No;
}
}
// catch params with defaults like "= OUString()"
- if (isa<MaterializeTemporaryExpr>(argument1)
- && isa<MaterializeTemporaryExpr>(argument2))
- {
- return IdenticalDefaultArgumentsResult::Yes;
- }
- if (isa<CXXBindTemporaryExpr>(argument1)
- && isa<CXXBindTemporaryExpr>(argument2))
- {
- return IdenticalDefaultArgumentsResult::Yes;
+ if (auto const e1 = dyn_cast<CXXConstructExpr>(skipImplicit(desugared1))) {
+ if (auto const e2 = dyn_cast<CXXConstructExpr>(
+ skipImplicit(desugared2)))
+ {
+ if ((e1->getConstructor()->getCanonicalDecl()
+ != e2->getConstructor()->getCanonicalDecl()))
+ {
+ return IdenticalDefaultArgumentsResult::No;
+ }
+ if (e1->getNumArgs() == 0 && e2->getNumArgs() == 0) {
+ return IdenticalDefaultArgumentsResult::Yes;
+ }
+ }
}
return IdenticalDefaultArgumentsResult::Maybe;
}