Skip to content

Commit

Permalink
[Sema] Fix-up a -Wfloat-conversion diagnostic
Browse files Browse the repository at this point in the history
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354074 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
epilk committed Feb 14, 2019
1 parent 4b7025f commit d941de8
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 16 deletions.
20 changes: 10 additions & 10 deletions lib/Sema/SemaChecking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10624,16 +10624,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 test/SemaCXX/warn-float-conversion.cpp
Original file line number Diff line number Diff line change
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 test/SemaObjC/conversion.m
Original file line number Diff line number Diff line change
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 d941de8

Please sign in to comment.