/* PR middle-end/92815 - spurious -Wstringop-overflow writing into
a flexible array of an extern struct
{ dg-do compile }
- { dg-options "-O -Wall -fdump-tree-optimized" } */
+ { dg-options "-O -Wall -fdump-tree-optimized" }
+ { dg-skip-if "test assumes that structs have padding" { default_packed } } */
#define ASSERT(expr) ((expr) ? (void)0 : fail (__LINE__))
#define bos0(expr) __builtin_object_size (expr, 1)
extern void fail (int);
-/* Verify sizes of a struct with a flexible array member and no padding. */
-
-struct ACX { char n, a[]; };
-
-struct ACX ac0 = { };
-struct ACX ac1 = { 1, { 1 } };
-struct ACX ac2 = { 2, { 1, 2 } };
-struct ACX ac3 = { 3, { 1, 2, 3 } };
-
-extern struct ACX eacx;
-
-void facx (void)
-{
- ASSERT (bos0 (&ac0) == sizeof ac0);
- ASSERT (bos0 (&ac1) == 2);
- ASSERT (bos0 (&ac2) == 3);
- ASSERT (bos0 (&ac3) == 4);
- ASSERT (bos0 (&eacx) == (size_t)-1);
-
- ASSERT (bos1 (&ac0) == sizeof ac0);
- ASSERT (bos1 (&ac1) == 2);
- ASSERT (bos1 (&ac2) == 3);
- ASSERT (bos1 (&ac3) == 4);
- ASSERT (bos1 (&eacx) == (size_t)-1);
-
- ASSERT (bos2 (&ac0) == sizeof ac0);
- ASSERT (bos2 (&ac1) == 2);
- ASSERT (bos2 (&ac2) == 3);
- ASSERT (bos2 (&ac3) == 4);
- ASSERT (bos2 (&eacx) == sizeof eacx);
-
- ASSERT (bos3 (&ac0) == sizeof ac0);
- ASSERT (bos3 (&ac1) == 2);
- ASSERT (bos3 (&ac2) == 3);
- ASSERT (bos3 (&ac3) == 4);
- ASSERT (bos3 (&eacx) == sizeof eacx);
-}
-
/* Verify sizes of a struct with a flexible array member and 1 byte
ASSERT (bos3 (&eai64cx) == sizeof eai64cx);
}
-
-/* Also verify sizes of a struct with a zero length array member. */
-
-struct A0C0 { char n, a[0]; };
-
-struct A0C0 a0c0 = { };
-extern struct A0C0 ea0c0;
-
-void fa0c0 (void)
-{
- ASSERT (bos0 (&a0c0) == sizeof a0c0);
- ASSERT (bos0 (&ea0c0) == sizeof ea0c0);
-
- ASSERT (bos1 (&a0c0) == sizeof a0c0);
- ASSERT (bos1 (&a0c0) == sizeof ea0c0);
-
- ASSERT (bos2 (&a0c0) == sizeof a0c0);
- ASSERT (bos2 (&a0c0) == sizeof ea0c0);
-
- ASSERT (bos3 (&a0c0) == sizeof a0c0);
- ASSERT (bos3 (&a0c0) == sizeof ea0c0);
-}
-
/* { dg-final { scan-tree-dump-not "fail" "optimized" } } */
--- /dev/null
+/* PR middle-end/92815 - a variant of gcc.dg/builtin-object-size-20.c
+ prepared for all targets, irregardless if they pack or not
+ the structs by default.
+ { dg-do compile }
+ { dg-options "-O -Wall -fdump-tree-optimized" } */
+
+#define ASSERT(expr) ((expr) ? (void)0 : fail (__LINE__))
+#define bos0(expr) __builtin_object_size (expr, 1)
+#define bos1(expr) __builtin_object_size (expr, 1)
+#define bos2(expr) __builtin_object_size (expr, 2)
+#define bos3(expr) __builtin_object_size (expr, 3)
+
+typedef __SIZE_TYPE__ size_t;
+
+
+extern void fail (int);
+
+
+/* Verify sizes of a struct with a flexible array member and no padding. */
+
+struct ACX { char n, a[]; };
+
+struct ACX ac0 = { };
+struct ACX ac1 = { 1, { 1 } };
+struct ACX ac2 = { 2, { 1, 2 } };
+struct ACX ac3 = { 3, { 1, 2, 3 } };
+
+extern struct ACX eacx;
+
+void facx (void)
+{
+ ASSERT (bos0 (&ac0) == sizeof ac0);
+ ASSERT (bos0 (&ac1) == 2);
+ ASSERT (bos0 (&ac2) == 3);
+ ASSERT (bos0 (&ac3) == 4);
+ ASSERT (bos0 (&eacx) == (size_t)-1);
+
+ ASSERT (bos1 (&ac0) == sizeof ac0);
+ ASSERT (bos1 (&ac1) == 2);
+ ASSERT (bos1 (&ac2) == 3);
+ ASSERT (bos1 (&ac3) == 4);
+ ASSERT (bos1 (&eacx) == (size_t)-1);
+
+ ASSERT (bos2 (&ac0) == sizeof ac0);
+ ASSERT (bos2 (&ac1) == 2);
+ ASSERT (bos2 (&ac2) == 3);
+ ASSERT (bos2 (&ac3) == 4);
+ ASSERT (bos2 (&eacx) == sizeof eacx);
+
+ ASSERT (bos3 (&ac0) == sizeof ac0);
+ ASSERT (bos3 (&ac1) == 2);
+ ASSERT (bos3 (&ac2) == 3);
+ ASSERT (bos3 (&ac3) == 4);
+ ASSERT (bos3 (&eacx) == sizeof eacx);
+}
+
+/* Also verify sizes of a struct with a zero length array member. */
+
+struct A0C0 { char n, a[0]; };
+
+struct A0C0 a0c0 = { };
+extern struct A0C0 ea0c0;
+
+void fa0c0 (void)
+{
+ ASSERT (bos0 (&a0c0) == sizeof a0c0);
+ ASSERT (bos0 (&ea0c0) == sizeof ea0c0);
+
+ ASSERT (bos1 (&a0c0) == sizeof a0c0);
+ ASSERT (bos1 (&a0c0) == sizeof ea0c0);
+
+ ASSERT (bos2 (&a0c0) == sizeof a0c0);
+ ASSERT (bos2 (&a0c0) == sizeof ea0c0);
+
+ ASSERT (bos3 (&a0c0) == sizeof a0c0);
+ ASSERT (bos3 (&a0c0) == sizeof ea0c0);
+}
+
+/* { dg-final { scan-tree-dump-not "fail" "optimized" } } */