aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c')
-rw-r--r--gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c
new file mode 100644
index 0000000..2c8e07d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-20.c
@@ -0,0 +1,49 @@
+/* PR 109334
+ * { dg-do run }
+ * { dg-options "-O1" } */
+
+
+[[gnu::noinline,gnu::noipa]]
+int f(int n, int buf[n])
+ [[gnu::access(read_only, 2, 1)]]
+{
+ return __builtin_dynamic_object_size(buf, 0);
+}
+
+[[gnu::noinline,gnu::noipa]]
+int g(int n, int buf[])
+ [[gnu::access(read_only, 2, 1)]]
+{
+ return __builtin_dynamic_object_size(buf, 0);
+}
+
+[[gnu::noinline,gnu::noipa]]
+int h(int n, int buf[n])
+{
+ return __builtin_dynamic_object_size(buf, 0);
+}
+
+int dummy(int x) { return x + 1; }
+
+[[gnu::noinline,gnu::noipa]]
+int i(int n, int buf[dummy(n)])
+{
+ return __builtin_dynamic_object_size(buf, 0);
+}
+
+int main()
+{
+ int n = 10;
+ int buf[n];
+ if (n * sizeof(int) != f(n, buf))
+ __builtin_abort();
+ if (n * sizeof(int) != g(n, buf))
+ __builtin_abort();
+ if (n * sizeof(int) != h(n, buf))
+ __builtin_abort();
+
+ (void)i(n, buf);
+
+ return 0;
+}
+