@@ -93,7 +93,8 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
93
93
bool InOverloadResolution,
94
94
StandardConversionSequence &SCS,
95
95
bool CStyle,
96
- bool AllowObjCWritebackConversion);
96
+ bool AllowObjCWritebackConversion,
97
+ bool AllowPointerToBoolConversion);
97
98
98
99
static bool IsTransparentUnionStandardConversion(Sema &S, Expr* From,
99
100
QualType &ToType,
@@ -1785,11 +1786,13 @@ TryImplicitConversion(Sema &S, Expr *From, QualType ToType,
1785
1786
bool AllowObjCConversionOnExplicit) {
1786
1787
ImplicitConversionSequence ICS;
1787
1788
if (IsStandardConversion(S, From, ToType, InOverloadResolution,
1788
- ICS.Standard, CStyle, AllowObjCWritebackConversion)){
1789
+ ICS.Standard, CStyle, AllowObjCWritebackConversion,
1790
+ /*AllowPointerToBoolConversion=*/(AllowExplicit != AllowedExplicit::None))){
1789
1791
ICS.setStandard();
1790
1792
return ICS;
1791
1793
}
1792
1794
1795
+
1793
1796
if (!S.getLangOpts().CPlusPlus) {
1794
1797
ICS.setBad(BadConversionSequence::no_conversion, From, ToType);
1795
1798
return ICS;
@@ -2249,7 +2252,8 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
2249
2252
bool InOverloadResolution,
2250
2253
StandardConversionSequence &SCS,
2251
2254
bool CStyle,
2252
- bool AllowObjCWritebackConversion) {
2255
+ bool AllowObjCWritebackConversion,
2256
+ bool AllowPointerToBoolConversion) {
2253
2257
QualType FromType = From->getType();
2254
2258
2255
2259
// Standard conversions (C++ [conv])
@@ -2428,8 +2432,13 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType,
2428
2432
SCS.Second = ICK_Complex_Promotion;
2429
2433
FromType = ToType.getUnqualifiedType();
2430
2434
} else if (ToType->isBooleanType() &&
2431
- (FromType->isArithmeticType() ||
2432
- FromType->isAnyPointerType() ||
2435
+ FromType->isArithmeticType()) {
2436
+ // Boolean conversions (C++ 4.12).
2437
+ SCS.Second = ICK_Boolean_Conversion;
2438
+ FromType = S.Context.BoolTy;
2439
+ } else if (AllowPointerToBoolConversion &&
2440
+ ToType->isBooleanType() &&
2441
+ (FromType->isAnyPointerType() ||
2433
2442
FromType->isBlockPointerType() ||
2434
2443
FromType->isMemberPointerType())) {
2435
2444
// Boolean conversions (C++ 4.12).
@@ -2621,7 +2630,8 @@ IsTransparentUnionStandardConversion(Sema &S, Expr* From,
2621
2630
// It's compatible if the expression matches any of the fields.
2622
2631
for (const auto *it : UD->fields()) {
2623
2632
if (IsStandardConversion(S, From, it->getType(), InOverloadResolution, SCS,
2624
- CStyle, /*AllowObjCWritebackConversion=*/false)) {
2633
+ CStyle, /*AllowObjCWritebackConversion=*/false,
2634
+ /*AllowPointerToBoolConversion=*/true)) {
2625
2635
ToType = it->getType();
2626
2636
return true;
2627
2637
}
@@ -3865,7 +3875,8 @@ static bool tryAtomicConversion(Sema &S, Expr *From, QualType ToType,
3865
3875
StandardConversionSequence InnerSCS;
3866
3876
if (!IsStandardConversion(S, From, ToAtomic->getValueType(),
3867
3877
InOverloadResolution, InnerSCS,
3868
- CStyle, /*AllowObjCWritebackConversion=*/false))
3878
+ CStyle, /*AllowObjCWritebackConversion=*/false,
3879
+ /*AllowPointerToBoolConversion=*/true))
3869
3880
return false;
3870
3881
3871
3882
SCS.Second = InnerSCS.Second;
0 commit comments