1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library \ 2// RUN: -fsyntax-only -Wno-error=hlsl-availability -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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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-warning@#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 144// Shader entry point without body 145[shader("compute")] 146[numthreads(4,1,1)] 147float main(); 148 149// Shader entry point with body 150[shader("compute")] 151[numthreads(4,1,1)] 152float main() { 153 float f = 3; 154 MyClass C = { 1.0f }; 155 float a = alive(f); 156 float b = aliveTemp<float>(f); // #aliveTemp_inst 157 float c = C.makeF(); 158 float d = test((float)1.0); 159 float e = test((half)1.0); 160 exportedFunctionUsed(1.0f); 161 return a * b * c; 162} 163