forked from OSchip/llvm-project
PR22566: a conversion from a floating-point type to bool is a narrowing conversion.
llvm-svn: 229792
This commit is contained in:
parent
3d62bbacb1
commit
64ecacf6cb
|
@ -286,6 +286,16 @@ StandardConversionSequence::getNarrowingKind(ASTContext &Ctx,
|
|||
QualType FromType = getToType(0);
|
||||
QualType ToType = getToType(1);
|
||||
switch (Second) {
|
||||
// 'bool' is an integral type; dispatch to the right place to handle it.
|
||||
case ICK_Boolean_Conversion:
|
||||
if (FromType->isRealFloatingType())
|
||||
goto FloatingIntegralConversion;
|
||||
if (FromType->isIntegralOrUnscopedEnumerationType())
|
||||
goto IntegralConversion;
|
||||
// Boolean conversions can be from pointers and pointers to members
|
||||
// [conv.bool], and those aren't considered narrowing conversions.
|
||||
return NK_Not_Narrowing;
|
||||
|
||||
// -- from a floating-point type to an integer type, or
|
||||
//
|
||||
// -- from an integer type or unscoped enumeration type to a floating-point
|
||||
|
@ -293,6 +303,7 @@ StandardConversionSequence::getNarrowingKind(ASTContext &Ctx,
|
|||
// value after conversion will fit into the target type and will produce
|
||||
// the original value when converted back to the original type, or
|
||||
case ICK_Floating_Integral:
|
||||
FloatingIntegralConversion:
|
||||
if (FromType->isRealFloatingType() && ToType->isIntegralType(Ctx)) {
|
||||
return NK_Type_Narrowing;
|
||||
} else if (FromType->isIntegralType(Ctx) && ToType->isRealFloatingType()) {
|
||||
|
@ -357,13 +368,8 @@ StandardConversionSequence::getNarrowingKind(ASTContext &Ctx,
|
|||
// the source is a constant expression and the actual value after
|
||||
// conversion will fit into the target type and will produce the original
|
||||
// value when converted back to the original type.
|
||||
case ICK_Boolean_Conversion: // Bools are integers too.
|
||||
if (!FromType->isIntegralOrUnscopedEnumerationType()) {
|
||||
// Boolean conversions can be from pointers and pointers to members
|
||||
// [conv.bool], and those aren't considered narrowing conversions.
|
||||
return NK_Not_Narrowing;
|
||||
} // Otherwise, fall through to the integral case.
|
||||
case ICK_Integral_Conversion: {
|
||||
case ICK_Integral_Conversion:
|
||||
IntegralConversion: {
|
||||
assert(FromType->isIntegralOrUnscopedEnumerationType());
|
||||
assert(ToType->isIntegralOrUnscopedEnumerationType());
|
||||
const bool FromSigned = FromType->isSignedIntegerOrEnumerationType();
|
||||
|
|
|
@ -57,6 +57,9 @@ void float_to_int() {
|
|||
|
||||
Agg<char> ce1 = { Convert<float>(1.0) }; // expected-error {{type 'float' cannot be narrowed to 'char'}} expected-note {{silence}}
|
||||
Agg<char> ce2 = { ConvertVar<double>() }; // expected-error {{type 'double' cannot be narrowed to 'char'}} expected-note {{silence}}
|
||||
|
||||
bool b{1.0}; // expected-error {{type 'double' cannot be narrowed to 'bool'}} expected-note {{silence}}
|
||||
Agg<bool> ab = {0.0}; // expected-error {{type 'double' cannot be narrowed to 'bool'}} expected-note {{silence}}
|
||||
}
|
||||
|
||||
// * from long double to double or float, or from double to float, except where
|
||||
|
|
Loading…
Reference in New Issue