// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -fnative-half-type -verify %s // expected-warning@+1{{cannot mix packoffset elements with nonpackoffset elements in a cbuffer}} cbuffer Mix { float4 M1 : packoffset(c0); float M2; float M3 : packoffset(c1.y); } // expected-warning@+1{{cannot mix packoffset elements with nonpackoffset elements in a cbuffer}} cbuffer Mix2 { float4 M4; float M5 : packoffset(c1.y); float M6 ; } // expected-error@+1{{attribute 'packoffset' only applies to shader constant in a constant buffer}} float4 g : packoffset(c0); cbuffer IllegalOffset { // expected-error@+1{{invalid resource class specifier 't2' for packoffset, expected 'c'}} float4 i1 : packoffset(t2); // expected-error@+1{{invalid component 'm' used; expected 'x', 'y', 'z', or 'w'}} float i2 : packoffset(c1.m); } cbuffer Overlap { float4 o1 : packoffset(c0); // expected-error@+1{{packoffset overlap between 'o2', 'o1'}} float2 o2 : packoffset(c0.z); } cbuffer CrossReg { // expected-error@+1{{packoffset cannot cross register boundary}} float4 c1 : packoffset(c0.y); // expected-error@+1{{packoffset cannot cross register boundary}} float2 c2 : packoffset(c1.w); } struct ST { float s; }; cbuffer Aggregate { // expected-error@+1{{register or packoffset bind is not valid}} ST A1 : packoffset(c0.y); // expected-error@+1{{register or packoffset bind is not valid}} float A2[2] : packoffset(c1.w); } cbuffer Double { // expected-error@+1{{packoffset at 'y' does not match alignment 64 required by 'double'}} double d : packoffset(c.y); // expected-error@+1{{packoffset cannot cross register boundary}} double2 d2 : packoffset(c.z); // expected-error@+1{{packoffset cannot cross register boundary}} double3 d3 : packoffset(c.z); } cbuffer ParsingFail { // expected-error@+1{{expected identifier}} float pf0 : packoffset(); // expected-error@+1{{expected identifier}} float pf1 : packoffset((c0)); // expected-error@+1{{expected ')'}} float pf2 : packoffset(c0, x); // expected-error@+1{{invalid component 'X' used}} float pf3 : packoffset(c.X); // expected-error@+1{{expected '(' after ''}} float pf4 : packoffset; // expected-error@+1{{expected identifier}} float pf5 : packoffset(; // expected-error@+1{{expected '(' after '}} float pf6 : packoffset); // expected-error@+1{{expected '(' after '}} float pf7 : packoffset c0.x; // expected-error@+1{{invalid component 'xy' used}} float pf8 : packoffset(c0.xy); // expected-error@+1{{invalid component 'rg' used}} float pf9 : packoffset(c0.rg); // expected-error@+1{{invalid component 'yes' used}} float pf10 : packoffset(c0.yes); // expected-error@+1{{invalid component 'woo'}} float pf11 : packoffset(c0.woo); // expected-error@+1{{invalid component 'xr' used}} float pf12 : packoffset(c0.xr); } struct ST2 { float a; float2 b; }; cbuffer S { float S0 : packoffset(c0.y); ST2 S1[2] : packoffset(c1); // expected-error@+1{{packoffset overlap between 'S2', 'S1'}} half2 S2 : packoffset(c1.w); half2 S3 : packoffset(c2.w); } struct ST23 { float s0; ST2 s1; }; cbuffer S2 { float S20 : packoffset(c0.y); ST2 S21 : packoffset(c1); half2 S22 : packoffset(c2.w); double S23[2] : packoffset(c3); // expected-error@+1{{packoffset overlap between 'S24', 'S23'}} float S24 : packoffset(c3.z); float S25 : packoffset(c4.z); }