Kaydet (Commit) 37fe0f72 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Better heuristic to only look through implicit copy/move ctors

At least recent libc++ has a std::string ctor overload without a (defaulted)
Allocator argument (which otherwise causes creation of a temporary Allocator
object and thus a ExprWithCleanups), so in C++17 mode (i.e., with no implicit
move CXXConstructExpr -> MaterializeTemporaryExpr -> CXXBindTemporaryExpr chain
in the way) CellInfo::toString (sw/source/filter/ww8/WW8TableInfo.cxx) has a
ReturnStmt of just

> ReturnStmt
> `-ImplicitCastExpr 'std::string':'class std::__1::basic_string<char>' <ConstructorConversion>
>   `-CXXConstructExpr 'std::string':'class std::__1::basic_string<char>' 'void (const char *)'
>     `-ImplicitCastExpr 'const char *' <NoOp>
>       `-ImplicitCastExpr 'char *' <ArrayToPointerDecay>
>         `-DeclRefExpr 'char [256]' lvalue Var 'sBuffer' 'char [256]'

that erroneously triggered loplugin:passstuffbyref.

Change-Id: I53c8911cb1356560692c003808280a103c399e25
Reviewed-on: https://gerrit.libreoffice.org/45916Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst e6f38aed
...@@ -310,8 +310,11 @@ bool PassStuffByRef::isReturnExprDisqualified(const Expr* expr) ...@@ -310,8 +310,11 @@ bool PassStuffByRef::isReturnExprDisqualified(const Expr* expr)
if (isa<ExprWithCleanups>(expr)) { if (isa<ExprWithCleanups>(expr)) {
return true; return true;
} }
if (const CXXConstructExpr* constructExpr = dyn_cast<CXXConstructExpr>(expr)) { if (const CXXConstructExpr* constructExpr = dyn_cast<CXXConstructExpr>(expr))
if (constructExpr->getNumArgs()==1) { {
if (constructExpr->getNumArgs()==1
&& constructExpr->getConstructor()->isCopyOrMoveConstructor())
{
expr = constructExpr->getArg(0)->IgnoreParenCasts(); expr = constructExpr->getArg(0)->IgnoreParenCasts();
} }
} }
......
...@@ -26,6 +26,13 @@ void f() ...@@ -26,6 +26,13 @@ void f()
s = new S(v1, v2); s = new S(v1, v2);
} }
struct S2 { S2(int); };
S2 f2() {
static int n;
return n;
}
// expected-no-diagnostics // expected-no-diagnostics
/* 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