Skip to content

Commit 3ddf29b

Browse files
authored
Disallow swizzling on long vectors (#7215)
This PR addresses #7194 by adding a new error string in DiagnosticSemaKinds.td and emitting it in SemaHLSL.cpp. @pow2clk implemented most of this in his [fork](a41e0a6). I'm just helping to finish it. **How verified:** 1. Several new test cases were added and verified locally 2. Ran hcttest locally
1 parent 503ef3c commit 3ddf29b

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

tools/clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7549,6 +7549,8 @@ def err_hlsl_vector_element_index_out_of_bounds: Error<
75497549
"vector element index '%0' is out of bounds">;
75507550
def err_hlsl_vector_member_too_many_positions: Error<
75517551
"more than four positions are referenced in '%0'">;
7552+
def err_hlsl_vector_member_on_long_vector: Error<
7553+
"invalid swizzle '%0' on vector of over 4 elements.">;
75527554
def err_hlsl_missing_type_specifier : Error< // Patterened after err_missing_type_specifier
75537555
"HLSL requires a type specifier for all declarations">;
75547556
def err_hlsl_multiple_concrete_bases : Error<

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8643,6 +8643,9 @@ ExprResult HLSLExternalSource::LookupVectorMemberExprForHLSL(
86438643
llvm_unreachable("Unknown VectorMemberAccessError value");
86448644
}
86458645

8646+
if (colCount > 4)
8647+
msg = diag::err_hlsl_vector_member_on_long_vector;
8648+
86468649
if (msg != 0) {
86478650
m_sema->Diag(MemberLoc, msg) << memberText;
86488651

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %dxc -Tlib_6_9 -verify %s -DTYPE=float
2+
// RUN: %dxc -Tlib_6_9 -verify %s -DTYPE=bool
3+
// RUN: %dxc -Tlib_6_9 -verify %s -DTYPE=uint64_t
4+
// RUN: %dxc -Tlib_6_9 -verify %s -DTYPE=double
5+
// RUN: %dxc -Tlib_6_9 -verify %s -enable-16bit-types -DTYPE=float16_t
6+
// RUN: %dxc -Tlib_6_9 -verify %s -enable-16bit-types -DTYPE=int16_t
7+
8+
export
9+
vector<double, 3> doit(vector<double, 5> vec5) {
10+
vec5.x = 1; // expected-error {{invalid swizzle 'x' on vector of over 4 elements.}}
11+
return vec5.xyw; // expected-error {{invalid swizzle 'xyw' on vector of over 4 elements.}}
12+
}
13+
14+
export
15+
TYPE arr_to_vec(TYPE arr[5]) {
16+
17+
TYPE val = (vector<TYPE, 6>(arr, 1)).x; // expected-error {{invalid swizzle 'x' on vector of over 4 elements.}}
18+
19+
TYPE val2 = ((vector<TYPE, 5>)arr).x; // expected-error {{invalid swizzle 'x' on vector of over 4 elements.}}
20+
21+
return val;
22+
}
23+
24+
export TYPE lv_ctor(TYPE s) {
25+
TYPE ret = (vector<TYPE,6>(1, 2, 3, 4, 5, s)).x; // expected-error {{invalid swizzle 'x' on vector of over 4 elements.}}
26+
return ret;
27+
}

0 commit comments

Comments
 (0)