...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>
193 lines
5.6 KiB
C++
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: */
|