diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-23 22:36:54 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-23 22:36:54 +0000 |
commit | 88a3ea34080ad3087a8191fbf479543153175d59 (patch) | |
tree | 34eaec34d3588e09f9a77abba776266f124dc823 /gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C | |
parent | 25e15aaed275cdfef34b3ee6eb3cb4b43a48d44f (diff) | |
parent | e65055a558093bd4fc0b1b0024b7814cc187b8e8 (diff) | |
download | gcc-88a3ea34080ad3087a8191fbf479543153175d59.tar.gz |
Merge from trunk revision 257954.gccgo
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gccgo@257955 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C')
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C new file mode 100644 index 00000000000..a502b78b711 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C @@ -0,0 +1,126 @@ +/* PR/tree-optimization/84480 - bogus -Wstringop-truncation despite + assignment with an inlined string literal + { dg-do compile } + { dg-options "-O2 -Wstringop-truncation" } */ + +#include <string.h> + +template <size_t N> +class GoodString +{ +public: + GoodString (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); + + str[slen] = '\0'; + } + +private: + char str[N + 1]; +}; + +void sink (void*); + +void good_nowarn_size_m2 () +{ + GoodString<3> str ("12"); + sink (&str); +} + +void good_nowarn_size_m1 () +{ + GoodString<3> str ("123"); // { dg-bogus "\\\[-Wstringop-truncation]" } + sink (&str); +} + +void good_nowarn_size_m1_var (const char* s) +{ + GoodString<3> str (s); // { dg-bogus "\\\[-Wstringop-truncation]" } + sink (&str); +} + +void call_good_nowarn_size_m1_var () +{ + good_nowarn_size_m1_var ("456"); +} + + +template <size_t N> +class BadString1 +{ +public: + BadString1 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); + } + +private: + char str[N + 1]; +}; + +void bad1_nowarn_size_m2 () +{ + BadString1<3> str ("12"); + sink (&str); +} + + +template <size_t N> +class BadString2 +{ +public: + BadString2 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); // { dg-warning "\\\[-Wstringop-truncation]" } + } + +private: + char str[N + 1]; +}; + +void bad2_warn_size_m1 () +{ + BadString2<3> str ("123"); + sink (&str); +} + +// { dg-message "inlined from .void bad2_warn_size_m1." "" { target *-*-* } 0 } + +template <size_t N> +class BadString3 +{ +public: + BadString3 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); // { dg-warning "\\\[-Wstringop-truncation]" } + } + +private: + char str[N + 1]; +}; + +void bad3_warn_size_m1_var (const char *s) +{ + BadString3<3> str (s); + sink (&str); +} + +void call_bad3_warn_size_m1_var () +{ + bad3_warn_size_m1_var ("456"); +} + +// { dg-message "inlined from .void call_bad3_warn_size_m1_var." "" { target *-*-* } 0 } |