aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/strict-flex-array-3.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-10-08 10:19:23 +0200
committerMartin Liska <mliska@suse.cz>2022-10-08 10:19:23 +0200
commitd9e7934d25da4a78ffef1f738206aa1d897911df (patch)
tree1bd1697c14259e095f4b4790946eae7df0c5a2e3 /gcc/testsuite/gcc.dg/strict-flex-array-3.c
parentda0970e441345f8349522ff1abac5c223044ebb1 (diff)
parent6ffbf87ca66f4ed9cd79cff675fabe2109e46e85 (diff)
downloadgcc-d9e7934d25da4a78ffef1f738206aa1d897911df.zip
gcc-d9e7934d25da4a78ffef1f738206aa1d897911df.tar.gz
gcc-d9e7934d25da4a78ffef1f738206aa1d897911df.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/testsuite/gcc.dg/strict-flex-array-3.c')
-rw-r--r--gcc/testsuite/gcc.dg/strict-flex-array-3.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/strict-flex-array-3.c b/gcc/testsuite/gcc.dg/strict-flex-array-3.c
new file mode 100644
index 0000000..602f99d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strict-flex-array-3.c
@@ -0,0 +1,60 @@
+/* test the combination of attribute strict_flex_array and option
+ -fstrict-flex-arrays: when both attribute and option specified,
+ attribute will have higher priority. */
+/* { dg-do run } */
+/* { dg-options "-O2 -fstrict-flex-arrays=0" } */
+
+#include <stdio.h>
+
+#define expect(p, _v) do { \
+ size_t v = _v; \
+ if (p == v) \
+ printf("ok: %s == %zd\n", #p, p); \
+ else \
+ { \
+ printf("WAT: %s == %zd (expected %zd)\n", #p, p, v); \
+ __builtin_abort (); \
+ } \
+} while (0);
+
+struct trailing_array_1 {
+ int a;
+ int b;
+ int c[4] __attribute__ ((strict_flex_array (1)));
+};
+
+struct trailing_array_2 {
+ int a;
+ int b;
+ int c[1] __attribute__ ((strict_flex_array (2)));
+};
+
+struct trailing_array_3 {
+ int a;
+ int b;
+ int c[0] __attribute__ ((strict_flex_array (3)));
+};
+struct trailing_array_4 {
+ int a;
+ int b;
+ int c[];
+};
+
+void __attribute__((__noinline__)) stuff(
+ struct trailing_array_1 *normal,
+ struct trailing_array_2 *trailing_1,
+ struct trailing_array_3 *trailing_0,
+ struct trailing_array_4 *trailing_flex)
+{
+ expect(__builtin_object_size(normal->c, 1), 16);
+ expect(__builtin_object_size(trailing_1->c, 1), 4);
+ expect(__builtin_object_size(trailing_0->c, 1), 0);
+ expect(__builtin_object_size(trailing_flex->c, 1), -1);
+}
+
+int main(int argc, char *argv[])
+{
+ stuff((void *)argv[0], (void *)argv[0], (void *)argv[0], (void *)argv[0]);
+
+ return 0;
+}