Skip to content

Commit 254dd3b

Browse files
authored
[SYCL][Sema] Only imply float size conversion warnings in SYCL (intel#16857)
Before this change `-Wimplicit-float-conversion` (part of `-Wconversion`) enabled `-Wimplicit-float-size-conversion` for all language modes. This is problematic because it causes DPC++ to emit warnings where upstream clang does not, even when used as a plain C++ compiler. Projects that enable `-Werror` don't expect these (questionable) floating point size warnings when they enable `-Wconversion`, and as such cannot be compiled with the DPC++ compiler. Change `-Wimplicit-float-conversion` to only be emitted in SYCL language mode and rename it to `-Wsycl-implicit-float-conversion`. This preserves existing behaviour for SYCL users, but otherwise matches upstream Clang behaviour. Fixes: intel#16393
1 parent fdea2cb commit 254dd3b

10 files changed

+39
-29
lines changed

clang/include/clang/Basic/DiagnosticGroups.td

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,10 @@ def ImplicitIntFloatConversion : DiagGroup<"implicit-int-float-conversion",
115115
[ImplicitConstIntFloatConversion]>;
116116
def ObjCSignedCharBoolImplicitFloatConversion :
117117
DiagGroup<"objc-signed-char-bool-implicit-float-conversion">;
118-
def ImplicitFloatSizeConversion :
119-
DiagGroup<"implicit-float-size-conversion">;
118+
def SyclImplicitFloatSizeConversion : DiagGroup<"sycl-implicit-float-size-conversion">;
120119
def ImplicitFloatConversion : DiagGroup<"implicit-float-conversion",
121120
[ImplicitIntFloatConversion,
122-
ObjCSignedCharBoolImplicitFloatConversion, ImplicitFloatSizeConversion]>;
121+
ObjCSignedCharBoolImplicitFloatConversion, SyclImplicitFloatSizeConversion]>;
123122
def ImplicitFixedPointConversion : DiagGroup<"implicit-fixed-point-conversion">;
124123

125124
def FloatOverflowConversion : DiagGroup<"float-overflow-conversion">;

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ def warn_float_compare_literal : Warning<
131131
def warn_double_const_requires_fp64 : Warning<
132132
"double precision constant requires %select{cl_khr_fp64|cl_khr_fp64 and __opencl_c_fp64}0, "
133133
"casting to single precision">;
134-
def warn_imp_float_size_conversion : Warning<
134+
def warn_sycl_imp_float_size_conversion : Warning<
135135
"implicit conversion between floating point types of different sizes">,
136-
InGroup<ImplicitFloatSizeConversion>, DefaultIgnore;
136+
InGroup<SyclImplicitFloatSizeConversion>, DefaultIgnore;
137137
def err_half_const_requires_fp16 : Error<
138138
"half precision constant requires cl_khr_fp16">;
139139

clang/lib/Sema/SemaChecking.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11680,27 +11680,33 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC,
1168011680
result.Val,
1168111681
Context.getFloatTypeSemantics(QualType(TargetBT, 0)),
1168211682
Context.getFloatTypeSemantics(QualType(SourceBT, 0)))) {
11683-
if (getLangOpts().SYCLIsDevice)
11684-
SYCL().DiagIfDeviceCode(CC, diag::warn_imp_float_size_conversion);
11685-
else
11686-
DiagnoseImpCast(*this, E, T, CC,
11687-
diag::warn_imp_float_size_conversion);
11683+
if (getLangOpts().isSYCL()) {
11684+
if (getLangOpts().SYCLIsDevice)
11685+
SYCL().DiagIfDeviceCode(
11686+
CC, diag::warn_sycl_imp_float_size_conversion);
11687+
else
11688+
DiagnoseImpCast(*this, E, T, CC,
11689+
diag::warn_sycl_imp_float_size_conversion);
11690+
}
1168811691
return;
1168911692
}
1169011693
}
1169111694

1169211695
if (SourceMgr.isInSystemMacro(CC))
1169311696
return;
1169411697
// If there is a precision conversion between floating point types when
11695-
// -Wimplicit-float-size-conversion is passed but
11698+
// -Wsycl-implicit-float-size-conversion is passed but
1169611699
// -Wimplicit-float-conversion is not, make sure we emit at least a size
1169711700
// warning.
1169811701
if (Diags.isIgnored(diag::warn_impcast_float_precision, CC)) {
11699-
if (getLangOpts().SYCLIsDevice)
11700-
SYCL().DiagIfDeviceCode(CC, diag::warn_imp_float_size_conversion);
11701-
else
11702-
DiagnoseImpCast(*this, E, T, CC,
11703-
diag::warn_imp_float_size_conversion);
11702+
if (getLangOpts().isSYCL()) {
11703+
if (getLangOpts().SYCLIsDevice)
11704+
SYCL().DiagIfDeviceCode(
11705+
CC, diag::warn_sycl_imp_float_size_conversion);
11706+
else
11707+
DiagnoseImpCast(*this, E, T, CC,
11708+
diag::warn_sycl_imp_float_size_conversion);
11709+
}
1170411710
}
1170511711
DiagnoseImpCast(*this, E, T, CC, diag::warn_impcast_float_precision);
1170611712
}

clang/test/Sema/conversion.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,4 +443,3 @@ float double2float_test4(double a, float b) {
443443
b -= a; // expected-warning {{implicit conversion when assigning computation result loses floating-point precision: 'double' to 'float'}}
444444
return b;
445445
}
446-
float f = 1.0 / 2.0; // expected-warning {{implicit conversion between floating point types of different sizes}}

clang/test/Sema/ext_vector_casts.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ static void splats(int i, long l, __uint128_t t, float f, double d) {
119119

120120
vf = 1 + vf;
121121
vf = l + vf; // expected-warning {{implicit conversion from 'long' to 'float2' (vector of 2 'float' values) may lose precision}}
122-
vf = 2.0 + vf; // expected-warning {{implicit conversion between floating point types of different sizes}}
122+
vf = 2.0 + vf;
123123
vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}}
124124
vf = vf + 0xffffffff; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4294967296}}
125125
vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}}

clang/test/SemaHLSL/Types/Arithmetic/literal_suffixes.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-library -fnative-half-type -Wconversion -Wno-implicit-float-size-conversion -verify %s
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-library -fnative-half-type -Wconversion -verify %s
22

33
void literal_assignments() {
44
half h;

clang/test/SemaHLSL/Types/Arithmetic/literal_suffixes_no_16bit.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-library -Wconversion -Wno-implicit-float-size-conversion -verify %s
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-library -Wconversion -verify %s
22

33
void literal_assignments() {
44
half h;

clang/test/SemaHLSL/standard_conversion_sequences.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -Wconversion -Wno-implicit-float-size-conversion -verify -o - %s
2-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -Wno-conversion -Wno-implicit-float-size-conversion -DNO_ERR -ast-dump %s | FileCheck %s
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -Wconversion -verify -o - %s
2+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -Wno-conversion -DNO_ERR -ast-dump %s | FileCheck %s
33

44
void test() {
55

clang/test/SemaSYCL/implicit-float-size-conversion.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wimplicit-float-size-conversion -verify=size-only,always-size %s
1+
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wsycl-implicit-float-size-conversion -verify=size-only,always-size %s
22
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wimplicit-float-conversion -verify=always-size,precision-only %s
3-
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wimplicit-float-conversion -Wno-implicit-float-size-conversion -verify=prefer-precision %s
3+
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wimplicit-float-conversion -Wno-sycl-implicit-float-size-conversion -verify=prefer-precision %s
44
// RUN: %clang_cc1 -fsycl-is-device -triple spir64 -internal-isystem %S/Inputs -fsyntax-only -sycl-std=2020 -Wno-implicit-float-conversion -verify %s
55

66
// This test checks that floating point conversion warnings are emitted correctly when used in conjunction.

clang/test/Sema/precision-and-size-conversion.c renamed to clang/test/SemaSYCL/precision-and-size-conversion.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
1-
// RUN: %clang_cc1 -fsyntax-only -verify=precision-loss,precision-gain,size-change -Wimplicit-float-conversion -Wdouble-promotion -Wimplicit-float-size-conversion \
1+
// RUN: %clang_cc1 -fsyntax-only -verify=precision-loss,precision-gain,size-change -fsycl-is-host -Wimplicit-float-conversion -Wdouble-promotion -Wsycl-implicit-float-size-conversion \
22
// RUN: -triple x86_64-apple-darwin %s
33

4-
// RUN: %clang_cc1 -fsyntax-only -verify=size-only,precision-gain,size-change -Wdouble-promotion -Wimplicit-float-size-conversion \
4+
// RUN: %clang_cc1 -fsyntax-only -verify=size-only,precision-gain,size-change -fsycl-is-host -Wdouble-promotion -Wsycl-implicit-float-size-conversion \
55
// RUN: -triple x86_64-apple-darwin %s
66

7-
// RUN: %clang_cc1 -fsyntax-only -verify=precision-increase -Wdouble-promotion \
7+
// RUN: %clang_cc1 -fsyntax-only -verify=precision-increase -fsycl-is-host -Wdouble-promotion \
88
// RUN: -triple x86_64-apple-darwin %s
99

10-
// RUN: %clang_cc1 -fsyntax-only -verify=precision-loss,size-change -Wimplicit-float-conversion \
10+
// RUN: %clang_cc1 -fsyntax-only -verify=precision-loss,size-change -fsycl-is-host -Wimplicit-float-conversion \
1111
// RUN: -triple x86_64-apple-darwin %s
1212

13-
// RUN: %clang_cc1 -fsyntax-only -verify \
13+
// RUN: %clang_cc1 -fsyntax-only -verify=precision-loss -Wimplicit-float-conversion \
14+
// RUN: -triple x86_64-apple-darwin %s
15+
16+
// RUN: %clang_cc1 -fsyntax-only -verify -fsycl-is-host \
17+
// RUN: -triple x86_64-apple-darwin %s
18+
19+
// RUN: %clang_cc1 -fsyntax-only -verify -Wsycl-implicit-float-size-conversion \
1420
// RUN: -triple x86_64-apple-darwin %s
1521

1622
// This test checks that floating point conversion warnings are emitted correctly when used in conjunction.

0 commit comments

Comments
 (0)