cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
123 lines
3.4 KiB
HLSL
123 lines
3.4 KiB
HLSL
// 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{{packoffset cannot cross register boundary}}
|
|
ST A1 : packoffset(c0.y);
|
|
// expected-error@+1{{packoffset cannot cross register boundary}}
|
|
float A2[2] : packoffset(c1.w);
|
|
}
|
|
|
|
cbuffer Double {
|
|
// expected-error@+1{{packoffset at 'y' 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);
|
|
}
|