xref: /llvm-project/clang/test/SemaHLSL/Availability/avail-diag-default-lib.hlsl (revision 5196a91b0827b895aba63ce150ebc8f10795316c)
1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \
2// RUN: -fsyntax-only -verify %s
3
4__attribute__((availability(shadermodel, introduced = 6.5)))
5float fx(float);  // #fx
6
7__attribute__((availability(shadermodel, introduced = 6.6)))
8half fx(half);  // #fx_half
9
10__attribute__((availability(shadermodel, introduced = 5.0, environment = pixel)))
11__attribute__((availability(shadermodel, introduced = 6.5, environment = compute)))
12float fy(float); // #fy
13
14__attribute__((availability(shadermodel, introduced = 5.0, environment = pixel)))
15__attribute__((availability(shadermodel, introduced = 6.5, environment = mesh)))
16float fz(float); // #fz
17
18float also_alive(float f) {
19  // expected-error@#also_alive_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
20  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
21  float A = fx(f); // #also_alive_fx_call
22
23  // expected-error@#also_alive_fy_call {{'fy' is only available in compute environment on Shader Model 6.5 or newer}}
24  // expected-note@#fy {{'fy' has been marked as being introduced in Shader Model 6.5 in compute environment here, but the deployment target is Shader Model 6.0 compute environment}}
25  float B = fy(f); // #also_alive_fy_call
26
27  // expected-error@#also_alive_fz_call {{'fz' is unavailable}}
28  // expected-note@#fz {{'fz' has been marked as being introduced in Shader Model 6.5 in mesh environment here, but the deployment target is Shader Model 6.0 compute environment}}
29  float C = fz(f); // #also_alive_fz_call
30
31  return 0;
32}
33
34float alive(float f) {
35  // expected-error@#alive_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
36  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
37  float A = fx(f); // #alive_fx_call
38
39  // expected-error@#alive_fy_call {{'fy' is only available in compute environment on Shader Model 6.5 or newer}}
40  // expected-note@#fy {{'fy' has been marked as being introduced in Shader Model 6.5 in compute environment here, but the deployment target is Shader Model 6.0 compute environment}}
41  float B = fy(f); // #alive_fy_call
42
43  // expected-error@#alive_fz_call {{'fz' is unavailable}}
44  // expected-note@#fz {{'fz' has been marked as being introduced in Shader Model 6.5 in mesh environment here, but the deployment target is Shader Model 6.0 compute environment}}
45  float C = fz(f); // #alive_fz_call
46
47  return also_alive(f);
48}
49
50float also_dead(float f) {
51  // unreachable code - no errors expected
52  float A = fx(f);
53  float B = fy(f);
54  float C = fz(f);
55  return 0;
56}
57
58float dead(float f) {
59  // unreachable code - no errors expected
60  float A = fx(f);
61  float B = fy(f);
62  float C = fz(f);
63  return also_dead(f);
64}
65
66template<typename T>
67T aliveTemp(T f) {
68  // expected-error@#aliveTemp_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
69  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
70  float A = fx(f); // #aliveTemp_fx_call
71  // expected-error@#aliveTemp_fy_call {{'fy' is only available in compute environment on Shader Model 6.5 or newer}}
72  // expected-note@#fy {{'fy' has been marked as being introduced in Shader Model 6.5 in compute environment here, but the deployment target is Shader Model 6.0 compute environment}}
73  float B = fy(f); // #aliveTemp_fy_call
74  // expected-error@#aliveTemp_fz_call {{'fz' is unavailable}}
75  // expected-note@#fz {{'fz' has been marked as being introduced in Shader Model 6.5 in mesh environment here, but the deployment target is Shader Model 6.0 compute environment}}
76  float C = fz(f); // #aliveTemp_fz_call
77  return 0;
78}
79
80template<typename T> T aliveTemp2(T f) {
81  // expected-error@#aliveTemp2_fx_call {{'fx' is only available on Shader Model 6.6 or newer}}
82  // expected-note@#fx_half {{'fx' has been marked as being introduced in Shader Model 6.6 here, but the deployment target is Shader Model 6.0}}
83  // expected-error@#aliveTemp2_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
84  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
85  return fx(f); // #aliveTemp2_fx_call
86}
87
88half test(half x) {
89  return aliveTemp2(x);
90}
91
92float test(float x) {
93  return aliveTemp2(x);
94}
95
96class MyClass
97{
98  float F;
99  float makeF() {
100    // expected-error@#MyClass_makeF_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
101    // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
102    float A = fx(F); // #MyClass_makeF_fx_call
103    // expected-error@#MyClass_makeF_fy_call {{'fy' is only available in compute environment on Shader Model 6.5 or newer}}
104    // expected-note@#fy {{'fy' has been marked as being introduced in Shader Model 6.5 in compute environment here, but the deployment target is Shader Model 6.0 compute environment}}
105    float B = fy(F); // #MyClass_makeF_fy_call
106    // expected-error@#MyClass_makeF_fz_call {{'fz' is unavailable}}
107    // expected-note@#fz {{'fz' has been marked as being introduced in Shader Model 6.5 in mesh environment here, but the deployment target is Shader Model 6.0 compute environment}}
108    float C = fz(F); // #MyClass_makeF_fz_call
109    return 0;
110  }
111};
112
113// Exported function without body, not used
114export void exportedFunctionUnused(float f);
115
116// Exported function with body, without export, not used
117void exportedFunctionUnused(float f) {
118  // expected-error@#exportedFunctionUnused_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
119  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
120  float A = fx(f); // #exportedFunctionUnused_fx_call
121
122  // API with shader-stage-specific availability in unused exported library function
123  // - no errors expected because the actual shader stage this function
124  // will be used in not known at this time
125  float B = fy(f);
126  float C = fz(f);
127}
128
129// Exported function with body - called from main() which is a compute shader entry point
130export void exportedFunctionUsed(float f) {
131  // expected-error@#exportedFunctionUsed_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
132  // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
133  float A = fx(f); // #exportedFunctionUsed_fx_call
134
135  // expected-error@#exportedFunctionUsed_fy_call {{'fy' is only available in compute environment on Shader Model 6.5 or newer}}
136  // expected-note@#fy {{'fy' has been marked as being introduced in Shader Model 6.5 in compute environment here, but the deployment target is Shader Model 6.0 compute environment}}
137  float B = fy(f); // #exportedFunctionUsed_fy_call
138
139  // expected-error@#exportedFunctionUsed_fz_call {{'fz' is unavailable}}
140  // expected-note@#fz {{'fz' has been marked as being introduced in Shader Model 6.5 in mesh environment here, but the deployment target is Shader Model 6.0 compute environment}}
141  float C = fz(f); // #exportedFunctionUsed_fz_call
142}
143
144namespace A {
145  namespace B {
146    export {
147      void exportedFunctionInNS(float x) {
148        // expected-error@#exportedFunctionInNS_fx_call {{'fx' is only available on Shader Model 6.5 or newer}}
149        // expected-note@#fx {{'fx' has been marked as being introduced in Shader Model 6.5 here, but the deployment target is Shader Model 6.0}}
150        float A = fx(x); // #exportedFunctionInNS_fx_call
151
152        // API with shader-stage-specific availability in exported library function
153        // - no errors expected because the actual shader stage this function
154        // will be used in not known at this time
155        float B = fy(x);
156        float C = fz(x);
157      }
158    }
159  }
160}
161
162// Shader entry point without body
163[shader("compute")]
164[numthreads(4,1,1)]
165float main();
166
167// Shader entry point with body
168[shader("compute")]
169[numthreads(4,1,1)]
170float main() {
171  float f = 3;
172  MyClass C = { 1.0f };
173  float a = alive(f);
174  float b = aliveTemp<float>(f); // #aliveTemp_inst
175  float c = C.makeF();
176  float d = test((float)1.0);
177  float e = test((half)1.0);
178  exportedFunctionUsed(1.0f);
179  return a * b * c;
180}
181