summaryrefslogtreecommitdiffstats
path: root/tests/initializer-list/struct-visibility-1.slang
blob: 691e8c991b342550cf92d08a15fdab0ba43e5230 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUFFER):-shaderobj -vk
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUFFER):-shaderobj

public struct Visibility
{
  internal int x = 1;
  public int y = 5;

  int getX() { return x; }
}


//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<int> outputBuffer;
void test(inout uint index)
{
  Visibility t1 = {}; // OK, initialized to {1,5} via ctor call.
  // BUFFER: 1
  outputBuffer[index++] = t1.getX();
  // BUFFER-NEXT: 5
  outputBuffer[index++] = t1.y;

  Visibility t2 = {1}; // OK, initialized to {1,1} via ctor call.
  // BUFFER-NEXT: 1
  outputBuffer[index++] = t2.getX();
  // BUFFER-NEXT: 1
  outputBuffer[index++] = t2.y;
}

internal struct Visibility2
{
  // Visibility3 type is considered as C-style struct.
  // Because all members have the same visibility as the type.
  // Therefore we will attempt the legacy fallback logic for
  // initializer-list syntax.
  // Note that c-style structs can still have init exprs on members.
  internal int x;
  internal int y = 2;
  // compiler synthesizes:
  // internal __init(int x, int y = 2);
}

internal void test2(inout uint index)
{
  Visibility2 t = {3, 4}; // OK, initialized to {3,4} via ctor call.
  // BUFFER-NEXT: 3
  outputBuffer[index++] = t.x;
  // BUFFER-NEXT: 4
  outputBuffer[index++] = t.y;

  Visibility2 t1 = {1}; // OK, initialized to {1,2} via ctor call.
  // BUFFER-NEXT: 1
  outputBuffer[index++] = t1.x;
  // BUFFER-NEXT: 2
  outputBuffer[index++] = t1.y;

  Visibility2 t2 = {}; // OK, initialized to {0, 2} via legacy logic.
  // BUFFER-NEXT: 0
  outputBuffer[index++] = t2.x;
  // BUFFER-NEXT: 2
  outputBuffer[index++] = t2.y;
}

internal struct Visibility3
{
  // Visibility4 type is considered as C-style struct.
  // And we still synthesize a ctor for member initialization.
  // Because Visibility4 has no public members, the synthesized
  // ctor will take 0 arguments.
  internal int x = 1;
  internal int y = 2;
  // compiler synthesizes:
  // internal __init(int x = 1, int y = 2);
}

internal void test3(inout uint index)
{
  Visibility3 t = {0, 0}; // OK, initialized to {0,0} via ctor call.
  // BUFFER-NEXT: 0
  outputBuffer[index++] = t.x;
  // BUFFER-NEXT: 0
  outputBuffer[index++] = t.y;

  Visibility3 t1 = {3}; // OK, initialized to {3,2} via ctor call.
  // BUFFER-NEXT: 3
  outputBuffer[index++] = t1.x;
  // BUFFER-NEXT: 2
  outputBuffer[index++] = t1.y;

  Visibility3 t2 = {}; // OK, initialized to {1,2} via ctor call.
  // BUFFER-NEXT: 1
  outputBuffer[index++] = t2.x;
  // BUFFER-NEXT: 2
  outputBuffer[index++] = t2.y;
}

[shader("compute")]
void computeMain()
{
    uint index = 0;
    test(index);
    test2(index);
    test3(index);
}