From: Martin Sebor Date: Tue, 15 May 2018 21:52:16 +0000 (+0000) Subject: PR middle-end/85643 - attribute nonstring fails to squash -Wstringop-truncation warning X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=275605696b6754f178af04ef6187b1faed6092e9;p=gcc.git PR middle-end/85643 - attribute nonstring fails to squash -Wstringop-truncation warning gcc/ChangeLog: PR middle-end/85643 * calls.c (get_attr_nonstring_decl): Handle MEM_REF. gcc/testsuite/ChangeLog: PR middle-end/85643 * c-c++-common/attr-nonstring-7.c: New test. From-SVN: r260271 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ecb524195ba..53fcbb1ff18 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-05-15 Martin Sebor + + PR middle-end/85643 + * calls.c (get_attr_nonstring_decl): Handle MEM_REF. + 2018-05-15 Richard Biener * tree-ssa-dse.c (dse_classify_store): Remove use_stmt parameter, diff --git a/gcc/calls.c b/gcc/calls.c index 9eb0467311b..f0e9d3b1cbb 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1586,8 +1586,12 @@ get_attr_nonstring_decl (tree expr, tree *ref) if (ref) *ref = decl; - if (TREE_CODE (decl) == COMPONENT_REF) + if (TREE_CODE (decl) == ARRAY_REF) + decl = TREE_OPERAND (decl, 0); + else if (TREE_CODE (decl) == COMPONENT_REF) decl = TREE_OPERAND (decl, 1); + else if (TREE_CODE (decl) == MEM_REF) + return get_attr_nonstring_decl (TREE_OPERAND (decl, 0), ref); if (DECL_P (decl) && lookup_attribute ("nonstring", DECL_ATTRIBUTES (decl))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe012a4d87e..b6e0e78c4a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-05-15 Martin Sebor + + PR middle-end/85643 + * c-c++-common/attr-nonstring-7.c: New test. + 2018-05-15 Richard Biener * gcc.dg/tree-ssa/ssa-dse-31.c: New testcase. diff --git a/gcc/testsuite/c-c++-common/attr-nonstring-7.c b/gcc/testsuite/c-c++-common/attr-nonstring-7.c new file mode 100644 index 00000000000..a32cbfedfa5 --- /dev/null +++ b/gcc/testsuite/c-c++-common/attr-nonstring-7.c @@ -0,0 +1,90 @@ +/* PR 85643 - attribute nonstring fails to squash -Wstringop-truncation + warning + { dg-do compile } + { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */ + +#define strncpy __builtin_strncpy + +struct A { + char a[16 + 1]; +}; + +struct B { + char a[16] __attribute__ ((__nonstring__)); +}; + +struct B* +test_memarray (const struct A *s) +{ + static struct B b; + strncpy (b.a, s->a, sizeof b.a); + return &b; +} + +const char* +test_array (const char *s) +{ + static char a[80] __attribute__ ((__nonstring__)); + strncpy (a, s, sizeof a); + return a; +} + +const char* +test_array_idx (const char *s) +{ + static char a[80] __attribute__ ((__nonstring__)); + char *p __attribute__ ((__nonstring__)) = &a[20]; + strncpy (p, s, 60); /* { dg-bogus "-Wstringop-truncation" } */ + return a; +} + +const char* +test_array_off (const char *s) +{ + static char a[80] __attribute__ ((__nonstring__)); + char *p __attribute__ ((__nonstring__)) = a + 20; + strncpy (p, s, 60); /* { dg-bogus "-Wstringop-truncation" } */ + return a; +} + +struct B* +test_memarray_cstidx_idx (const char *s) +{ + static struct B b[2]; + char *p __attribute__ ((__nonstring__)) = &b[1].a[4]; + + /* The destination below is represented as &MEM[(void *)&a + 20B] and + which (in general) doesn't make it possible to determine what member + it refers to. */ + strncpy (p, s, sizeof b[1].a - 4); /* { dg-bogus "-Wstringop-truncation" "" { xfail *-*-*} } */ + return b; +} + +struct B* +test_memarray_cstidx_off (const char *s) +{ + static struct B b[2]; + char *p __attribute__ ((__nonstring__)) = b[1].a + 4; + + /* Same as above. */ + strncpy (p, s, sizeof b[1].a - 4); /* { dg-bogus "-Wstringop-truncation" "" { xfail *-*-*} } */ + return b; +} + +struct B* +test_memarray_varidx_idx (const char *s, int i) +{ + static struct B b[3]; + char *p __attribute__ ((__nonstring__)) = &b[i].a[4]; + strncpy (p, s, sizeof b[i].a - 4); + return b; +} + +struct B* +test_memarray_varidx_off (const char *s, int i) +{ + static struct B b[3]; + char *p __attribute__ ((__nonstring__)) = b[i].a + 4; + strncpy (p, s, sizeof b[i].a - 4); + return b; +}