Skip to content

Commit c72fbd4

Browse files
committed
add implicit trunc warnings
1 parent 144da9f commit c72fbd4

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4338,6 +4338,9 @@ def warn_param_typestate_mismatch : Warning<
43384338
def warn_unknown_sanitizer_ignored : Warning<
43394339
"unknown sanitizer '%0' ignored">, InGroup<UnknownSanitizers>;
43404340

4341+
def warn_impcast_matrix_scalar : Warning<
4342+
"implicit conversion turns matrix to scalar: %0 to %1">,
4343+
InGroup<Conversion>, DefaultIgnore;
43414344
def warn_impcast_vector_scalar : Warning<
43424345
"implicit conversion turns vector to scalar: %0 to %1">,
43434346
InGroup<Conversion>, DefaultIgnore;
@@ -13245,6 +13248,9 @@ def err_hlsl_builtin_scalar_vector_mismatch
1324513248
def warn_hlsl_impcast_vector_truncation : Warning<
1324613249
"implicit conversion truncates vector: %0 to %1">, InGroup<Conversion>;
1324713250

13251+
def warn_hlsl_impcast_matrix_truncation : Warning<
13252+
"implicit conversion truncates matrix: %0 to %1">, InGroup<Conversion>;
13253+
1324813254
def warn_hlsl_availability : Warning<
1324913255
"%0 is only available %select{|in %4 environment }3on %1 %2 or newer">,
1325013256
InGroup<HLSLAvailability>, DefaultError;

clang/lib/Sema/SemaChecking.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "clang/AST/TemplateBase.h"
3838
#include "clang/AST/TemplateName.h"
3939
#include "clang/AST/Type.h"
40+
#include "clang/AST/TypeBase.h"
4041
#include "clang/AST/TypeLoc.h"
4142
#include "clang/AST/UnresolvedSet.h"
4243
#include "clang/Basic/AddressSpaces.h"
@@ -12586,6 +12587,19 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC,
1258612587
if (auto VecTy = dyn_cast<VectorType>(Target))
1258712588
Target = VecTy->getElementType().getTypePtr();
1258812589

12590+
if (isa<ConstantMatrixType>(Source)) {
12591+
if (!isa<ConstantMatrixType>(Target)) {
12592+
return DiagnoseImpCast(*this, E, T, CC, diag::warn_impcast_matrix_scalar);
12593+
} else if (getLangOpts().HLSL &&
12594+
Target->castAs<ConstantMatrixType>()->getNumElementsFlattened() <
12595+
Source->castAs<ConstantMatrixType>()
12596+
->getNumElementsFlattened()) {
12597+
// Diagnose Matrix truncation but don't return. We may also want to
12598+
// diagnose an element conversion.
12599+
DiagnoseImpCast(*this, E, T, CC,
12600+
diag::warn_hlsl_impcast_matrix_truncation);
12601+
}
12602+
}
1258912603
// Strip complex types.
1259012604
if (isa<ComplexType>(Source)) {
1259112605
if (!isa<ComplexType>(Target)) {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-library -finclude-default-header -Wconversion -verify %s
2+
3+
export int3x4 trunc_cast(int4x4 i44) {
4+
int3x4 i34 = i44;
5+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 3, 4>'}}
6+
return i34;
7+
}
8+
9+
export int4x3 trunc_cast0(int4x4 i44) {
10+
int4x3 i43 = i44;
11+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 4, 3>'}}
12+
return i43;
13+
}
14+
15+
export int3x3 trunc_cast1(int4x4 i44) {
16+
int3x3 i33 = i44;
17+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 3, 3>'}}
18+
return i33;
19+
}
20+
21+
export int3x2 trunc_cast2(int4x4 i44) {
22+
int3x2 i32 = i44;
23+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 3, 2>'}}
24+
return i32;
25+
}
26+
27+
export int2x3 trunc_cast3(int4x4 i44) {
28+
int2x3 i23 = i44;
29+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 2, 3>'}}
30+
return i23;
31+
}
32+
33+
export int2x2 trunc_cast4(int4x4 i44) {
34+
int2x2 i22 = i44;
35+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 2, 2>'}}
36+
return i22;
37+
}
38+
39+
export int2x1 trunc_cast5(int4x4 i44) {
40+
int2x1 i21 = i44;
41+
// expected-warning@-1{{implicit conversion truncates matrix: 'int4x4' (aka 'matrix<int, 4, 4>') to 'matrix<int, 2, 1>'}}
42+
return i21;
43+
}
44+
45+
export int trunc_scalar_cast6(int4x4 i44) {
46+
int i1 = i44;
47+
// expected-warning@-1{{implicit conversion turns matrix to scalar: 'int4x4' (aka 'matrix<int, 4, 4>') to 'int'}}
48+
return i1;
49+
}
50+

0 commit comments

Comments
 (0)