if (idx >= 3)
return;
- if (sizeof_arg[idx] == NULL || sizeof_arg[idx] == error_mark_node)
+ /* Use error_operand_p to detect non-error arguments with an error
+ type that the C++ front-end constructs. */
+ if (error_operand_p (src)
+ || error_operand_p (dest)
+ || !sizeof_arg[idx]
+ || error_operand_p (sizeof_arg[idx]))
return;
type = TYPE_P (sizeof_arg[idx])
+2018-11-28 Martin Sebor <msebor@redhat.com>
+
+ PR c/88065
+ PR c/87297
+ * c-c++-common/Wsizeof-pointer-memaccess4.c: New test.
+
2018-11-28 Marek Polacek <polacek@redhat.com>
Implement P1094R2, Nested inline namespaces.
--- /dev/null
+/* PR c/88065 - ICE in -Wsizeof-pointer-memaccess on an invalid strncpy
+ PR c/87297 - ICE on strncpy with an undeclared argument
+ { dg-do compile }
+ { dg-options "-Wall -Wsizeof-pointer-memaccess" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+char* strncpy (char*, const char*, size_t);
+
+struct A { char a[4], b[6]; };
+
+void test_invalid_dst (struct A *p)
+{
+ strncpy (q->a, p->b, sizeof p->b); /* { dg-error ".q. undeclared|not declared" } */
+}
+
+void test_invalid_src (struct A *p)
+{
+ strncpy (p->a, q->b, sizeof p->b); /* { dg-error ".q. undeclared|not declared" } */
+}
+
+void test_invalid_bound (struct A *p)
+{
+ strncpy (p->a, p->b, sizeof q->b); /* { dg-error ".q. undeclared|not declared" } */
+}
+
+/* Verify the C++ front end doesn't ICE (the verifies that the fix
+ for PR c/87297 uses error_operand_p to detect the invalid source
+ argument rather than just checking its equality to error_mark_node. */
+struct B { char a[4]; };
+
+void test_cxx_invalid_dst (struct B *p, const char *s)
+{
+ struct T x; /* { dg-error "storage size|incomplete type|unused" } */
+ __builtin_strncpy (x, s, sizeof p->a);
+}