Skip to content

Commit

Permalink
Merging r354074:
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
r354074 | epilk | 2019-02-14 23:48:01 +0100 (Thu, 14 Feb 2019) | 9 lines

[Sema] Fix-up a -Wfloat-conversion diagnostic

We were warning on valid ObjC property reference exprs, and passing
in the wrong arguments to DiagnoseFloatingImpCast (leading to a badly
worded diagnostic).

rdar://47644670

Differential revision: https://reviews.llvm.org/D58145
------------------------------------------------------------------------

llvm-svn: 354129
  • Loading branch information
zmodem committed Feb 15, 2019
1 parent 1152134 commit ff29092
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 16 deletions.
20 changes: 10 additions & 10 deletions clang/lib/Sema/SemaChecking.cpp
Expand Up @@ -10622,16 +10622,16 @@ static void AnalyzeCompoundAssignment(Sema &S, BinaryOperator *E) {
// The below checks assume source is floating point.
if (!ResultBT || !RBT || !RBT->isFloatingPoint()) return;

// If source is floating point but target is not.
if (!ResultBT->isFloatingPoint())
return DiagnoseFloatingImpCast(S, E, E->getRHS()->getType(),
E->getExprLoc());

// If both source and target are floating points.
// Builtin FP kinds are ordered by increasing FP rank.
if (ResultBT->getKind() < RBT->getKind() &&
// We don't want to warn for system macro.
!S.SourceMgr.isInSystemMacro(E->getOperatorLoc()))
// If source is floating point but target is an integer.
if (ResultBT->isInteger())
DiagnoseImpCast(S, E, E->getRHS()->getType(), E->getLHS()->getType(),
E->getExprLoc(), diag::warn_impcast_float_integer);
// If both source and target are floating points. Builtin FP kinds are ordered
// by increasing FP rank. FIXME: except _Float16, we currently emit a bogus
// warning.
else if (ResultBT->isFloatingPoint() && ResultBT->getKind() < RBT->getKind() &&
// We don't want to warn for system macro.
!S.SourceMgr.isInSystemMacro(E->getOperatorLoc()))
// warn about dropping FP rank.
DiagnoseImpCast(S, E->getRHS(), E->getLHS()->getType(), E->getOperatorLoc(),
diag::warn_impcast_float_result_precision);
Expand Down
12 changes: 6 additions & 6 deletions clang/test/SemaCXX/warn-float-conversion.cpp
Expand Up @@ -44,17 +44,17 @@ void Convert(float f, double d, long double ld) {
void CompoundAssignment() {
int x = 3;

x += 1.234; //expected-warning{{conversion}}
x -= -0.0; //expected-warning{{conversion}}
x *= 1.1f; //expected-warning{{conversion}}
x /= -2.2f; //expected-warning{{conversion}}
x += 1.234; // expected-warning {{implicit conversion turns floating-point number into integer: 'double' to 'int'}}
x -= -0.0; // expected-warning {{implicit conversion turns floating-point number into integer: 'double' to 'int'}}
x *= 1.1f; // expected-warning {{implicit conversion turns floating-point number into integer: 'float' to 'int'}}
x /= -2.2f; // expected-warning {{implicit conversion turns floating-point number into integer: 'float' to 'int'}}

int y = x += 1.4f; //expected-warning{{conversion}}
int y = x += 1.4f; // expected-warning {{implicit conversion turns floating-point number into integer: 'float' to 'int'}}

float z = 1.1f;
double w = -2.2;

y += z + w; //expected-warning{{conversion}}
y += z + w; // expected-warning {{implicit conversion turns floating-point number into integer: 'double' to 'int'}}
}

# 1 "foo.h" 3
Expand Down
7 changes: 7 additions & 0 deletions clang/test/SemaObjC/conversion.m
Expand Up @@ -14,4 +14,11 @@ void radar14415662(RDar14415662 *f, char x, int y) {
x = y; // expected-warning {{implicit conversion loses integer precision: 'int' to 'char'}}
}

__attribute__((objc_root_class)) @interface DoubleProp
@property double d;
@end

void use_double_prop(DoubleProp *dp) {
double local = 42;
dp.d += local; // no warning
}

0 comments on commit ff29092

Please sign in to comment.