aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/gimple-ssa-warn-access.cc4
-rw-r--r--gcc/testsuite/c-c++-common/attr-nonstring-11.c8
-rw-r--r--gcc/testsuite/c-c++-common/attr-nonstring-12.c14
3 files changed, 20 insertions, 6 deletions
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index 351f487..305b6356 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -602,6 +602,10 @@ maybe_warn_nonstring_arg (tree fndecl, GimpleOrTree exp)
bool known_size = false;
tree type = TREE_TYPE (decl);
+ while (TREE_CODE (type) == ARRAY_TYPE
+ && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
+ type = TREE_TYPE (type);
+
/* Determine the array size. For arrays of unknown bound and
pointers reset BOUND to trigger the appropriate warning. */
if (TREE_CODE (type) == ARRAY_TYPE)
diff --git a/gcc/testsuite/c-c++-common/attr-nonstring-11.c b/gcc/testsuite/c-c++-common/attr-nonstring-11.c
index 12fbc90..745e993 100644
--- a/gcc/testsuite/c-c++-common/attr-nonstring-11.c
+++ b/gcc/testsuite/c-c++-common/attr-nonstring-11.c
@@ -165,8 +165,8 @@ void test_strcmp (struct MemArrays *p)
void test_strncmp_warn (struct MemArrays *p)
{
enum { N = sizeof arr[2] };
- T (strncmp (str[2], arr[2], N)); /* { dg-bogus "argument 2 declared attribute 'nonstring' is smaller than the specified bound 4" "" { xfail *-*-* } } */
- T (strncmp (arr[2], str[2], N)); /* { dg-bogus "argument 1 declared attribute 'nonstring' is smaller than the specified bound 4" "" { xfail *-*-* } } */
+ T (strncmp (str[2], arr[2], N));
+ T (strncmp (arr[2], str[2], N));
T (strncmp (str[2], arr[2], N + 1)); /* { dg-warning "argument 2 declared attribute .nonstring. is smaller than the specified bound 5" } */
T (strncmp (arr[2], str[2], N + 1)); /* { dg-warning "argument 1 declared attribute .nonstring. is smaller than the specified bound 5" } */
@@ -237,7 +237,7 @@ void test_stpncpy_warn (struct MemArrays *p, unsigned n)
enum { N = sizeof arr[2] };
T (stpncpy (str[2], str[2], N));
- T (stpncpy (str[2], arr[2], N)); /* { dg-bogus "argument 2 declared attribute 'nonstring' is smaller than the specified bound 4" "" { xfail *-*-* } } */
+ T (stpncpy (str[2], arr[2], N));
T (stpncpy (arr[2], str[2], N));
T (stpncpy (str[2], *ptr, N));
@@ -370,7 +370,7 @@ void test_stnrdup_warn (struct MemArrays *p)
enum { N = sizeof arr[2] };
T (strndup (str[2], N));
- T (strndup (arr[2], N)); /* { dg-bogus "argument 1 declared attribute 'nonstring' is smaller than the specified bound 4" "" { xfail *-*-* } } */
+ T (strndup (arr[2], N));
T (strndup (*ptr, N));
T (strndup (*parr, N));
diff --git a/gcc/testsuite/c-c++-common/attr-nonstring-12.c b/gcc/testsuite/c-c++-common/attr-nonstring-12.c
index 75787e8..739e336 100644
--- a/gcc/testsuite/c-c++-common/attr-nonstring-12.c
+++ b/gcc/testsuite/c-c++-common/attr-nonstring-12.c
@@ -26,12 +26,22 @@ enum { X = sizeof ar5[2] + 1 };
int warn_strcmp_cst_1 (void)
{
- return strcmp ("bar", arx[3]); /* { dg-warning "argument 2 declared attribute .nonstring." } */
+ return strcmp ("bar", arx[3]);
}
int warn_strcmp_cst_2 (void)
{
- return strcmp (arx[3], "foo"); /* { dg-warning "argument 1 declared attribute .nonstring." } */
+ return strcmp (arx[3], "foo");
+}
+
+int warn_strcmp_cst_3 (void)
+{
+ return strcmp ("barfoobazquxcorge1", arx[3]); /* { dg-warning "argument 2 declared attribute .nonstring." } */
+}
+
+int warn_strcmp_cst_4 (void)
+{
+ return strcmp (arx[3], "foobarbazquxcorge1"); /* { dg-warning "argument 1 declared attribute .nonstring." } */
}