summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/makeshared.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-08-04 14:51:41 +0200
committerStephan Bergmann <sbergman@redhat.com>2020-08-04 18:47:10 +0200
commit4f294e6976287b936d59035c4fe74ce18d3f132c (patch)
tree2e3937c09b466d5a9b7ab398bdf23d21a41a0ec3 /compilerplugins/clang/makeshared.cxx
parentloplugin:makeshared (clang-cl) (diff)
downloadcore-4f294e6976287b936d59035c4fe74ce18d3f132c.tar.gz
core-4f294e6976287b936d59035c4fe74ce18d3f132c.zip
Avoid some unhelpful loplugin:makeshared
...like > canvas/source/directx/dx_impltools.cxx(137,31): error: rather use make_shared than constructing from 'Gdiplus::Graphics *' [loplugin:makeshared] > GraphicsSharedPtr pRet(Gdiplus::Graphics::FromImage(rBitmap.get())); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ on Windows, where those functions like FromImage are provided by Windows (so we can't help it that they are returning pointers) Change-Id: Iae5c4b20d64cc6b38ff66409519fbd25f6e509cd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100095 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang/makeshared.cxx')
-rw-r--r--compilerplugins/clang/makeshared.cxx13
1 files changed, 13 insertions, 0 deletions
diff --git a/compilerplugins/clang/makeshared.cxx b/compilerplugins/clang/makeshared.cxx
index 9f12b6c3bd6b..9b512371d635 100644
--- a/compilerplugins/clang/makeshared.cxx
+++ b/compilerplugins/clang/makeshared.cxx
@@ -132,6 +132,19 @@ bool MakeShared::VisitCXXConstructExpr(CXXConstructExpr const* constructExpr)
return true;
else if (isa<CXXNullPtrLiteralExpr>(arg0))
return true;
+ else if (auto const call = dyn_cast<CallExpr>(arg0))
+ {
+ if (auto const decl = call->getDirectCallee())
+ {
+ // Don't warn about cases where e.g. the Bitmap* result of calling Windows'
+ // Bitmap::FromBITMAPINFO is wrapped in a shared_ptr:
+ if (decl->getReturnType()->isPointerType()
+ && compiler.getSourceManager().isInSystemHeader(decl->getLocation()))
+ {
+ return true;
+ }
+ }
+ }
StringRef fn = getFilenameOfLocation(
compiler.getSourceManager().getSpellingLoc(compat::getBeginLoc(constructExpr)));