2020-11-06 20:01:50 +02:00
/* -*- 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/.
*/
2020-12-04 16:24:56 +01:00
# include <sal/config.h>
# include <string_view>
2022-02-17 19:06:17 +01:00
# include <utility>
2020-12-04 16:24:56 +01:00
2020-11-06 20:01:50 +02:00
# include <rtl/strbuf.hxx>
# include <rtl/string.hxx>
# include <rtl/ustrbuf.hxx>
# include <rtl/ustring.hxx>
2020-12-04 16:24:56 +01:00
# include <sal/types.h>
2020-11-06 20:01:50 +02:00
void call_view ( std : : u16string_view ) { }
void call_view ( std : : string_view ) { }
struct ConstructWithView
{
ConstructWithView ( std : : u16string_view ) { }
ConstructWithView ( std : : string_view ) { }
} ;
namespace test1
{
void f1 ( std : : u16string_view s1 )
{
// no warning expected
call_view ( s1 ) ;
}
void f1 ( std : : string_view s1 )
{
// no warning expected
call_view ( s1 ) ;
}
void f1 ( OUString s1 )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 ) ) ;
}
void f1 ( OString s1 )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 ) ) ;
}
2022-02-07 23:21:27 +01:00
void f1 ( OUStringBuffer s1 )
{
2022-02-16 18:15:46 +01:00
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
call_view ( s1 . copy ( 1 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 , 2 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
ConstructWithView ( s1 . copy ( 1 ) ) ;
2022-02-07 23:21:27 +01:00
// expected-error@+1 {{rather than call toString, pass with a view [loplugin:stringview]}}
call_view ( s1 . toString ( ) ) ;
// expected-error@+1 {{rather than call toString, pass with a view [loplugin:stringview]}}
ConstructWithView ( s1 . toString ( ) ) ;
}
void f1 ( OStringBuffer s1 )
{
// expected-error@+1 {{rather than call toString, pass with a view [loplugin:stringview]}}
call_view ( s1 . toString ( ) ) ;
// expected-error@+1 {{rather than call toString, pass with a view [loplugin:stringview]}}
ConstructWithView ( s1 . toString ( ) ) ;
}
2022-02-17 19:06:17 +01:00
void makeStringAndClear ( OUStringBuffer s )
{
call_view ( s . makeStringAndClear ( ) ) ;
ConstructWithView ( s . makeStringAndClear ( ) ) ;
call_view ( ( & s ) - > makeStringAndClear ( ) ) ;
ConstructWithView ( ( & s ) - > makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
call_view ( std : : move ( s ) . makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
ConstructWithView ( std : : move ( s ) . makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
call_view ( ( s ) . copy ( 1 ) . makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
ConstructWithView ( s . copy ( 1 ) . makeStringAndClear ( ) ) ;
}
void makeStringAndClear ( OStringBuffer s )
{
call_view ( s . makeStringAndClear ( ) ) ;
ConstructWithView ( s . makeStringAndClear ( ) ) ;
call_view ( ( & s ) - > makeStringAndClear ( ) ) ;
ConstructWithView ( ( & s ) - > makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
call_view ( std : : move ( s ) . makeStringAndClear ( ) ) ;
// expected-error@+1 {{rather than call makeStringAndClear on an rvalue, pass with a view [loplugin:stringview]}}
ConstructWithView ( std : : move ( s ) . makeStringAndClear ( ) ) ;
}
2020-11-06 20:01:50 +02:00
}
namespace test2
{
void f3 ( OUString s1 )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
OUString s2 = s1 . copy ( 1 , 2 ) + " xxx " ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
s2 = s1 . copy ( 1 ) + " xxx " ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
s2 = " xxx " + s1 . copy ( 1 ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
s2 + = s1 . copy ( 1 ) ;
2021-06-03 13:44:39 +02:00
( void ) s2 ;
2020-11-06 20:01:50 +02:00
}
void f3 ( OString s1 )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
OString s2 = s1 . copy ( 1 , 2 ) + " xxx " ;
( void ) s2 ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
OString s3 = s1 . copy ( 1 ) + " xxx " ;
( void ) s3 ;
}
}
namespace test3
{
void f4 ( OUString s1 , OUString s2 )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
sal_Unicode x = s2 . copy ( 1 , 2 ) [ 12 ] ;
( void ) x ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
if ( s2 . copy ( 1 , 2 ) < s1 )
;
}
}
2021-09-30 13:54:26 +02:00
void f5 ( char const * s1 , sal_Int32 n1 , char16_t const * s2 , sal_Int32 n2 , OString s3 , OUString s4 )
2020-11-18 23:30:24 +01:00
{
2020-12-04 16:24:56 +01:00
// expected-error@+1 {{instead of an 'rtl::OString', pass a 'std::string_view' [loplugin:stringview]}}
2020-11-18 23:30:24 +01:00
call_view ( OString ( ) ) ;
2021-10-25 11:58:05 +02:00
// expected-error-re@+1 {{instead of an 'rtl::OString' constructed from a 'const char{{ ?}}[4]', pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( " foo " ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'const char', pass a 'std::string_view' (or an 'rtl::OStringChar') [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( * s1 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'const char *', pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( s1 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'const char *', pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( s1 , n1 ) ) ;
constexpr OStringLiteral l1 ( " foo " ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'const rtl::OStringLiteral<4>', pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( l1 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'std::string_view' (aka 'basic_string_view<char>'), pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( std : : string_view ( " foo " ) ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OString' constructed from a 'OStringNumber<int>', pass a 'std::string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OString ( OString : : number ( 0 ) ) ) ;
2021-09-30 13:54:26 +02:00
// expected-error-re@+1 {{instead of an 'rtl::OString' constructed from a 'typename std::enable_if_t<ToStringHelper<OString>::allowOStringConcat && ToStringHelper<OString>::allowOStringConcat, OStringConcat<OString, OString>{{ ?}}>' (aka 'rtl::OStringConcat<rtl::OString, rtl::OString>'), pass a 'std::string_view' via 'rtl::OStringConcatenation' [loplugin:stringview]}}
call_view ( OString ( s3 + s3 ) ) ;
2020-12-04 16:24:56 +01:00
// expected-error@+1 {{instead of an 'rtl::OUString', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-11-18 23:30:24 +01:00
call_view ( OUString ( ) ) ;
2021-10-25 11:58:05 +02:00
// expected-error-re@+1 {{instead of an 'rtl::OUString' constructed from a 'const char{{ ?}}[4]', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( " foo " ) ) ;
2021-10-25 11:58:05 +02:00
// expected-error-re@+1 {{instead of an 'rtl::OUString' constructed from a 'const char16_t{{ ?}}[4]', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( u " foo " ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const char', pass a 'std::u16string_view' (or an 'rtl::OUStringChar') [loplugin:stringview]}}
2020-12-09 22:44:49 +01:00
call_view ( OUString ( * s1 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const char16_t', pass a 'std::u16string_view' (or an 'rtl::OUStringChar') [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( * s2 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const char16_t *', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( s2 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const char16_t *', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( s2 , n2 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const char16_t *', pass a 'std::u16string_view' (or an 'rtl::OUStringChar') [loplugin:stringview]}}
call_view ( OUString ( s2 , 1 ) ) ;
2020-12-04 16:24:56 +01:00
constexpr OUStringLiteral l2 ( u " foo " ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'const rtl::OUStringLiteral<4>', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( l2 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'std::u16string_view' (aka 'basic_string_view<char16_t>'), pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( std : : u16string_view ( u " foo " ) ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'OUStringNumber<int>', pass a 'std::u16string_view' [loplugin:stringview]}}
2020-12-04 16:24:56 +01:00
call_view ( OUString ( OUString : : number ( 0 ) ) ) ;
2021-09-30 13:54:26 +02:00
// expected-error-re@+1 {{instead of an 'rtl::OUString' constructed from a 'typename std::enable_if_t<ToStringHelper<OUString>::allowOUStringConcat && ToStringHelper<OUString>::allowOUStringConcat, OUStringConcat<OUString, OUString>{{ ?}}>' (aka 'rtl::OUStringConcat<rtl::OUString, rtl::OUString>'), pass a 'std::u16string_view' via 'rtl::OUStringConcatenation' [loplugin:stringview]}}
call_view ( OUString ( s4 + s4 ) ) ;
2021-11-10 16:26:05 +01:00
( void ) ( s3 = = l1 ) ;
( void ) ( s4 = = l2 ) ;
2020-11-18 23:30:24 +01:00
}
2021-01-28 11:01:28 +02:00
void f5 ( OUString s )
{
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
OUStringBuffer buf ( s . copy ( 5 ) ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
buf = s . copy ( 5 ) ;
// expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}}
buf . append ( s . copy ( 12 ) ) ;
2021-05-14 08:30:01 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'std::u16string_view' (aka 'basic_string_view<char16_t>'), pass a 'std::u16string_view' [loplugin:stringview]}}
2021-01-28 11:01:28 +02:00
buf . append ( OUString ( std : : u16string_view ( u " foo " ) ) ) ;
2021-05-13 11:57:17 +02:00
// expected-error@+1 {{instead of an 'rtl::OUString' constructed from a 'std::u16string_view' (aka 'basic_string_view<char16_t>'), pass a 'std::u16string_view' [loplugin:stringview]}}
s + = OUString ( std : : u16string_view ( u " foo " ) ) ;
2021-01-28 11:01:28 +02:00
}
2022-04-10 20:17:54 +02:00
void f6 ( OUString s )
{
// expected-error@+1 {{rather than getToken, pass with a view using o3tl::getToken() [loplugin:stringview]}}
s . getToken ( 1 , ' ' ) . toInt32 ( ) ;
}
2020-11-06 20:01:50 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */