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