Stephan Bergmann 2d64e046e8 Improve loplugin:stringadd
...after 9b5dad13b56bdde7c40970351af3da3a2c3c9350 "loplugin:stringadd look for
unnecessary temporaries".  There was no reason to check for implicit
MaterializeTemporaryExpr instead of explicitly written CXXFunctionalCastExpr,
and checking for the latter makes it easier to report the casted-from type,
which gives useful information how to change code that exhibits the warning.
See the comments at <https://gerrit.libreoffice.org/#/c/80724/>
"loplugin:stringadd look for unnecessary temporaries" for details.

(And while at it, remove some commented-out debug code that is probably no
longer relevant now.)

Change-Id: I7d4cab85432885d617dd7114c75163c1eb376fc2
Reviewed-on: https://gerrit.libreoffice.org/80823
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2019-10-15 16:13:54 +02:00

193 lines
5.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <rtl/strbuf.hxx>
#include <rtl/string.hxx>
#include <rtl/ustrbuf.hxx>
#include <rtl/ustring.hxx>
// ---------------------------------------------------------------
// += tests
namespace test1
{
static const char XXX1[] = "xxx";
static const char XXX2[] = "xxx";
void f(OUString s1, int i, OString o)
{
OUString s2 = s1;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += s1;
s2 = s1 + "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += s1;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += OUString::number(i);
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += XXX1;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += OUStringLiteral(XXX1) + XXX2;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += OStringToOUString(o, RTL_TEXTENCODING_UTF8);
}
void g(OString s1, int i, OUString u)
{
OString s2 = s1;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += s1;
s2 = s1 + "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += s1;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += OString::number(i);
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s2 += OUStringToOString(u, RTL_TEXTENCODING_ASCII_US);
}
}
namespace test2
{
void f(OUString s3)
{
s3 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s3 += "xxx";
}
void g(OString s3)
{
s3 += "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s3 += "xxx";
}
}
namespace test3
{
struct Bar
{
OUString m_field;
};
void f(Bar b1, Bar& b2, Bar* b3)
{
OUString s3 = "xxx";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s3 += b1.m_field;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s3 += b2.m_field;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
s3 += b3->m_field;
}
}
// no warning expected
namespace test4
{
void f()
{
OUString sRet = "xxx";
#if OSL_DEBUG_LEVEL > 0
sRet += ";";
#endif
}
}
// no warning expected
namespace test5
{
OUString side_effect();
int side_effect2();
void f()
{
OUString sRet = "xxx";
sRet += side_effect();
sRet += OUString::number(side_effect2());
}
void g()
{
OUString sRet = side_effect();
sRet += "xxx";
}
}
namespace test6
{
void f(OUString sComma, OUString maExtension, int mnDocumentIconID)
{
OUString sValue;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
sValue += sComma + sComma + maExtension + sComma;
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
sValue += OUString::number(mnDocumentIconID) + sComma;
}
struct Foo
{
OUString sFormula1;
};
void g(int x, const Foo& aValidation)
{
OUString sCondition;
switch (x)
{
case 1:
sCondition += "cell-content-is-in-list(";
// expected-error@+1 {{simplify by merging with the preceding assignment [loplugin:stringadd]}}
sCondition += aValidation.sFormula1 + ")";
}
}
}
// ---------------------------------------------------------------
// detecting OUString temporary construction in +
namespace test9
{
OUString getByValue();
const OUString& getByRef();
void f1(OUString s, OUString t, int i, const char* pChar)
{
// no warning expected
t = t + "xxx";
// expected-error@+1 {{avoid constructing temporary object from 'const char [4]' during + [loplugin:stringadd]}}
s = s + OUString("xxx");
// expected-error@+1 {{avoid constructing temporary object from 'const rtl::OUString' during + [loplugin:stringadd]}}
s = s + OUString(getByRef());
// no warning expected
OUString a;
a = a + getByValue();
// no warning expected
OUString b;
b = b + (i == 1 ? "aaa" : "bbb");
// no warning expected
OUString c;
c = c + OUString(pChar, strlen(pChar), RTL_TEXTENCODING_UTF8);
}
void f2(char ch)
{
OString s;
// expected-error@+1 {{avoid constructing temporary object from 'const char [4]' during + [loplugin:stringadd]}}
s = s + OString("xxx");
// no warning expected, no OStringLiteral1
s = s + OString(ch);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */