Adds support for elementwise and aggregate splat casting struct types with bitfields. Replacing existing Flattening function which used to produce a list of GEPs representing a flattened object with one that produces a list of LValues representing a flattened object. The LValues can be used by EmitStoreThroughLValue and EmitLoadOfLValue, ensuring bitfields are properly loaded and stored. This also simplifies the code in the elementwise and aggregate splat casting functions. Closes #125986
31 lines
1.1 KiB
HLSL
31 lines
1.1 KiB
HLSL
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify
|
|
|
|
export void cantCast() {
|
|
int A[3] = {1,2,3};
|
|
int B[4] = {1,2,3,4};
|
|
B = (int[4])A;
|
|
// expected-error@-1 {{C-style cast from 'int[3]' to 'int[4]' is not allowed}}
|
|
}
|
|
|
|
struct R {
|
|
// expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int2' (aka 'vector<int, 2>') to 'const R' for 1st argument}}
|
|
// expected-note@-2 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int2' (aka 'vector<int, 2>') to 'R' for 1st argument}}
|
|
// expected-note@-3 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
|
|
int A;
|
|
union {
|
|
float F;
|
|
int4 G;
|
|
};
|
|
};
|
|
|
|
export void cantCast4() {
|
|
int2 A = {1,2};
|
|
R r = R(A);
|
|
// expected-error@-1 {{no matching conversion for functional-style cast from 'int2' (aka 'vector<int, 2>') to 'R'}}
|
|
R r2;
|
|
r2.A = 1;
|
|
r2.F = 2.0;
|
|
int2 B = (int2)r2;
|
|
// expected-error@-1 {{cannot convert 'R' to 'int2' (aka 'vector<int, 2>') without a conversion operator}}
|
|
}
|