Skip to content

Commit b783cda

Browse files
committed
add implicit trunc warnings
1 parent ff0c2bc commit b783cda

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
@@ -4356,6 +4356,9 @@ def warn_param_typestate_mismatch : Warning<
43564356
def warn_unknown_sanitizer_ignored : Warning<
43574357
"unknown sanitizer '%0' ignored">, InGroup<UnknownSanitizers>;
43584358

4359+
def warn_impcast_matrix_scalar : Warning<
4360+
"implicit conversion turns matrix to scalar: %0 to %1">,
4361+
InGroup<Conversion>, DefaultIgnore;
43594362
def warn_impcast_vector_scalar : Warning<
43604363
"implicit conversion turns vector to scalar: %0 to %1">,
43614364
InGroup<Conversion>, DefaultIgnore;
@@ -13274,6 +13277,9 @@ def err_hlsl_builtin_scalar_vector_mismatch
1327413277
def warn_hlsl_impcast_vector_truncation : Warning<
1327513278
"implicit conversion truncates vector: %0 to %1">, InGroup<Conversion>;
1327613279

13280+
def warn_hlsl_impcast_matrix_truncation : Warning<
13281+
"implicit conversion truncates matrix: %0 to %1">, InGroup<Conversion>;
13282+
1327713283
def warn_hlsl_availability : Warning<
1327813284
"%0 is only available %select{|in %4 environment }3on %1 %2 or newer">,
1327913285
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"
@@ -12589,6 +12590,19 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC,
1258912590
if (auto VecTy = dyn_cast<VectorType>(Target))
1259012591
Target = VecTy->getElementType().getTypePtr();
1259112592

12593+
if (isa<ConstantMatrixType>(Source)) {
12594+
if (!isa<ConstantMatrixType>(Target)) {
12595+
return DiagnoseImpCast(*this, E, T, CC, diag::warn_impcast_matrix_scalar);
12596+
} else if (getLangOpts().HLSL &&
12597+
Target->castAs<ConstantMatrixType>()->getNumElementsFlattened() <
12598+
Source->castAs<ConstantMatrixType>()
12599+
->getNumElementsFlattened()) {
12600+
// Diagnose Matrix truncation but don't return. We may also want to
12601+
// diagnose an element conversion.
12602+
DiagnoseImpCast(*this, E, T, CC,
12603+
diag::warn_hlsl_impcast_matrix_truncation);
12604+
}
12605+
}
1259212606
// Strip complex types.
1259312607
if (isa<ComplexType>(Source)) {
1259412608
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)