1#version 450
2
3#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable
4#extension GL_EXT_buffer_reference2 : enable
5#extension GL_EXT_scalar_block_layout : enable
6
7layout(buffer_reference, buffer_reference_align = 8) buffer T1 {
8    int x;
9    bool y;
10};
11layout(buffer_reference, buffer_reference_align = 64) buffer T2 {
12    int x;
13};
14
15const int s = int(uint64_t(T1(T2(uint64_t(3)))));
16int x[s];
17const uint64_t t = uint64_t(true ? T2(uint64_t(10)) : T2(uint64_t(11)));
18
19
20#define sizeof(T) (uint64_t(T(uint64_t(0))+1))
21
22const uint64_t s2 = sizeof(T1);
23uint buf[int(s2)];
24
25
26void main()
27{
28    T1 a = T1(uint64_t(4)), b = T1(uint64_t(5));
29    T1 c = true ? a : b;
30    T1 d = (a,b);
31    T1 e = true ? T1(uint64_t(6)) : T1(uint64_t(7));
32    T1 f = a.y ? T1(uint64_t(8)) : T1(uint64_t(9));
33
34    f[3].x = 1;
35    (f+5).x = 1;
36
37    T1 arr[2] = {a, f};
38    arr[1][7].x = 1;
39    int i;
40    arr[i][i].x = 1;
41    // Since we don't distinguish between "pointer" and "reference" type,
42    // a reference type can have [] applied to it repeatedly and it has
43    // the effect of adding up the indices.
44    arr[i][i][i][i][i][i][i].x = 1;
45
46    T1 j;
47    j = j+1;
48    j = j-2;
49    j += 3;
50    j -= 4;
51    j = 5+j;
52    T1 k = j + 6;
53    int64_t x = k - j;
54    uint64_t y = sizeof(T1);
55    k = k + (-1);
56
57    T2 m;
58    m = m+1;
59}
60