diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticGroups.td | 5 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 4 | ||||
-rw-r--r-- | clang/test/Sema/conversion-64-32.c | 5 |
4 files changed, 16 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 76147ffed8b..0c1ae8d10a7 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -28,7 +28,6 @@ def : DiagGroup<"cast-align">; def : DiagGroup<"cast-qual">; def : DiagGroup<"char-align">; def Comment : DiagGroup<"comment">; -def Conversion : DiagGroup<"conversion">; def : DiagGroup<"declaration-after-statement">; def : DiagGroup<"disabled-optimization">; def : DiagGroup<"discard-qual">; @@ -114,6 +113,10 @@ def CharSubscript : DiagGroup<"char-subscripts">; // Aggregation warning settings. +// -Wconversion has its own warnings, but we split this one out for +// legacy reasons. +def Conversion : DiagGroup<"conversion", + [DiagGroup<"shorten-64-to-32">]>; def Unused : DiagGroup<"unused", [UnusedArgument, UnusedFunction, UnusedLabel, diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e1cbab692e1..29b207927f2 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -647,6 +647,9 @@ def warn_impcast_float_integer : Warning< def warn_impcast_integer_precision : Warning< "implicit cast loses integer precision: %0 to %1">, InGroup<DiagGroup<"conversion">>, DefaultIgnore; +def warn_impcast_integer_64_32 : Warning< + "implicit cast loses integer precision: %0 to %1">, + InGroup<DiagGroup<"shorten-64-to-32">>, DefaultIgnore; def warn_attribute_ignored_for_field_of_type : Warning< "%0 attribute ignored for field of type %1">; diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 951856db713..38063ac0185 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -665,6 +665,10 @@ static void CheckImplicitConversion(Sema &S, Expr *E, QualType T) { if (IsExprValueWithinWidth(S.Context, E, TargetWidth)) return; + // People want to build with -Wshorten-64-to-32 and not -Wconversion + // and by god we'll let them. + if (SourceWidth == 64 && TargetWidth == 32) + return DiagnoseImpCast(S, E, T, diag::warn_impcast_integer_64_32); return DiagnoseImpCast(S, E, T, diag::warn_impcast_integer_precision); } diff --git a/clang/test/Sema/conversion-64-32.c b/clang/test/Sema/conversion-64-32.c new file mode 100644 index 00000000000..53830fd061c --- /dev/null +++ b/clang/test/Sema/conversion-64-32.c @@ -0,0 +1,5 @@ +// RUN: clang-cc -fsyntax-only -verify -Wshorten-64-to-32 -triple x86_64-apple-darwin %s + +int test0(long v) { + return v; // expected-warning {{implicit cast loses integer precision}} +} |