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)
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" } */
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));
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));
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." } */
}