зеркало из https://github.com/microsoft/clang-1.git
Enable warn_impcast_literal_float_to_integer by default.
This diagnostic seems to be production ready, it's just an oversight that it wasn't turned on by default. The test changes are a bit of a mixed bag. Some tests that seemed like they clearly didn't need to use this behavior have been modified not to use it. Others that I couldn't be sure about, I added the necessary expected-warnings to. It's possible the diagnostic message could be improved to make it clearer that this warning can be suppressed by using a value that won't lose precision when converted to the target type (but can still be a floating point literal, such as "bool b = 1.0;"). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
371a0c8bd3
Коммит
e31b8fb25b
|
@ -1732,7 +1732,7 @@ def warn_impcast_bitfield_precision_constant : Warning<
|
|||
def warn_impcast_literal_float_to_integer : Warning<
|
||||
"implicit conversion turns literal floating-point number into integer: "
|
||||
"%0 to %1">,
|
||||
InGroup<LiteralConversion>, DefaultIgnore;
|
||||
InGroup<LiteralConversion>;
|
||||
def warn_impcast_string_literal_to_bool : Warning<
|
||||
"implicit conversion turns string literal into bool: %0 to %1">,
|
||||
InGroup<StringConversion>, DefaultIgnore;
|
||||
|
|
|
@ -25,8 +25,8 @@ int string_literal_init() {
|
|||
}
|
||||
|
||||
void nested_compound_literals(int rad) {
|
||||
int vec[6][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
|
||||
{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
|
||||
int vec[6][2] = {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, // expected-warning 6 {{implicit conversion turns literal floating-point number into integer}}
|
||||
{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}}; // expected-warning 6 {{implicit conversion turns literal floating-point number into integer}}
|
||||
int a;
|
||||
|
||||
for (a = 0; a < 6; ++a) {
|
||||
|
|
|
@ -14,9 +14,10 @@ struct X0 {
|
|||
};
|
||||
|
||||
template<typename T>
|
||||
T X0<T>::value = 3.14;
|
||||
T X0<T>::value = 3.14; // expected-warning{{implicit conversion turns literal floating-point number into integer}}
|
||||
|
||||
template struct X0<int>; // expected-note{{previous explicit instantiation}}
|
||||
template struct X0<int>; // expected-note{{previous explicit instantiation}} \
|
||||
expected-note{{requested here}}
|
||||
template struct X0<int>; // expected-error{{duplicate explicit instantiation}}
|
||||
|
||||
template void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
|
||||
|
|
|
@ -86,7 +86,9 @@ double double_array[3] = { 1.0, 2.0 };
|
|||
struct {
|
||||
int x;
|
||||
float y;
|
||||
} designated_inits[3] = { [0].y = 17, [2].x = 12.3, 3.5 };
|
||||
} designated_inits[3] = { [0].y = 17,
|
||||
[2].x = 12.3, // expected-warning {{implicit conversion turns literal floating-point number into integer}}
|
||||
3.5 };
|
||||
|
||||
// TypesCompatibleExpr
|
||||
typedef typeof(__builtin_types_compatible_p(float, double)) types_compatible;
|
||||
|
|
|
@ -48,7 +48,9 @@ void func() {
|
|||
|
||||
extern int blockScopeExtern[3] = { 1, 3, 5 }; // expected-error{{'extern' variable cannot have an initializer}}
|
||||
|
||||
static long x2[3] = { 1.0, "abc" , 5.8 }; // expected-warning{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char [4]'}}
|
||||
static long x2[3] = { 1.0,
|
||||
"abc", // expected-warning{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char [4]'}}
|
||||
5.8 }; // expected-warning {{implicit conversion turns literal floating-point number into integer}}
|
||||
}
|
||||
|
||||
void test() {
|
||||
|
|
|
@ -233,7 +233,7 @@ float* intref(const int&);
|
|||
|
||||
void intref_test() {
|
||||
float* ir1 = intref(5);
|
||||
float* ir2 = intref(5.5);
|
||||
float* ir2 = intref(5.5); // expected-warning{{implicit conversion turns literal floating-point number into integer}}
|
||||
}
|
||||
|
||||
void derived5(C&); // expected-note{{candidate function not viable: cannot bind base class object of type 'A' to derived class reference 'C &' for 1st argument}}
|
||||
|
|
|
@ -1153,7 +1153,7 @@ class Foo {
|
|||
int Foo::foo()
|
||||
{
|
||||
int res;
|
||||
w = 5.2;
|
||||
w = 5;
|
||||
res = a_ + 5;
|
||||
return res;
|
||||
}
|
||||
|
@ -1167,7 +1167,7 @@ void Foo::bar()
|
|||
mu_.Unlock();
|
||||
if (x > 5) {
|
||||
mu1.Lock();
|
||||
g = 2.3;
|
||||
g = 2;
|
||||
mu1.Unlock();
|
||||
}
|
||||
}
|
||||
|
@ -1185,7 +1185,7 @@ void main()
|
|||
f2->bar(); // expected-warning {{cannot call function 'bar' while mutex 'mu_' is locked}}
|
||||
f2->mu_.Unlock();
|
||||
mu2.Lock();
|
||||
w = 2.5;
|
||||
w = 2;
|
||||
mu2.Unlock();
|
||||
}
|
||||
} // end namespace thread_annot_lock_13
|
||||
|
|
|
@ -60,7 +60,7 @@ struct X1 {
|
|||
|
||||
void test_X1(X1 x1) {
|
||||
float *fp1 = x1.f1<>(17);
|
||||
float *fp2 = x1.f1<int>(3.14);
|
||||
float *fp2 = x1.f1<int>(3.14); // expected-warning {{implicit conversion turns literal floating-point number into integer}}
|
||||
int *ip1 = x1.f1(17);
|
||||
float *ip2 = x1.f1(3.14);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче