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

llvm-svn: 354074
  • Loading branch information
epilk committed Feb 14, 2019
1 parent 3c76c09 commit d5b017d
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 @@ -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 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 d5b017d

Please sign in to comment.