diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-12-25 19:21:12 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-12-26 07:16:07 +0100 |
commit | c54d34f70819c5928fe30585e86d744eda4a254a (patch) | |
tree | 81672bb2fd4c95cb09a6ed14197c8a0a8655dcb5 /compilerplugins/clang/passstuffbyref.cxx | |
parent | 09895ae4963850c05d7a315599195dd177f13b06 (diff) |
loplugin:passstuffbyref improved return in canvas and svtools
and for now, ignore methods with params so we don't fall into the trap
of thinking that calls to methods like:
Bar& foo(Bar &p) { return p; }
can be converted from
Bar f() { return foo(Bar()); }
to
Bar const & f() { return foo(Bar()); }
Change-Id: Ia3795eb2baf353cb6bec4ebf40451f2789d66ad7
Reviewed-on: https://gerrit.libreoffice.org/47034
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins/clang/passstuffbyref.cxx')
-rw-r--r-- | compilerplugins/clang/passstuffbyref.cxx | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/compilerplugins/clang/passstuffbyref.cxx b/compilerplugins/clang/passstuffbyref.cxx index 0630beb80b59..e152acec8673 100644 --- a/compilerplugins/clang/passstuffbyref.cxx +++ b/compilerplugins/clang/passstuffbyref.cxx @@ -402,6 +402,12 @@ bool PassStuffByRef::isReturnExprDisqualified(const Expr* expr) FunctionDecl const * calleeFunctionDecl = callExpr->getDirectCallee(); if (!calleeFunctionDecl) return true; + // TODO anything takes a param is suspect because it might return the param by ref. + // we could tighten this to only reject functions that have a param of the same type + // as the return type. Or we could check for such functions and disallow them. + // Or we could force such functions to be annotated somehow. + if (calleeFunctionDecl->getNumParams() > 0) + return true; auto tc = loplugin::TypeCheck(calleeFunctionDecl->getReturnType()); if (!tc.LvalueReference() && !tc.Pointer()) return true; |