@@ -967,7 +967,8 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
967
967
// Get out the qualifiers of the original type. This will always be
968
968
// re-applied to the WorkType to ensure it is the same qualification as the
969
969
// original From was.
970
- auto QualifiersToApply = From.split ().Quals .getAsOpaqueValue ();
970
+ auto FastQualifiersToApply = static_cast <unsigned >(
971
+ From.split ().Quals .getAsOpaqueValue () & Qualifiers::FastMask);
971
972
972
973
// LValue->RValue is irrelevant for the check, because it is a thing to be
973
974
// done at a call site, and will be performed if need be performed.
@@ -993,7 +994,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
993
994
// "const double -> double".
994
995
LLVM_DEBUG (llvm::dbgs ()
995
996
<< " --- approximateStdConv. Conversion between numerics.\n " );
996
- WorkType = QualType{ToBuiltin, QualifiersToApply };
997
+ WorkType = QualType{ToBuiltin, FastQualifiersToApply };
997
998
}
998
999
999
1000
const auto *FromEnum = WorkType->getAs <EnumType>();
@@ -1002,7 +1003,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
1002
1003
// Unscoped enumerations (or enumerations in C) convert to numerics.
1003
1004
LLVM_DEBUG (llvm::dbgs ()
1004
1005
<< " --- approximateStdConv. Unscoped enum to numeric.\n " );
1005
- WorkType = QualType{ToBuiltin, QualifiersToApply };
1006
+ WorkType = QualType{ToBuiltin, FastQualifiersToApply };
1006
1007
} else if (FromNumeric && ToEnum && ToEnum->isUnscopedEnumerationType ()) {
1007
1008
// Numeric types convert to enumerations only in C.
1008
1009
if (Ctx.getLangOpts ().CPlusPlus ) {
@@ -1013,7 +1014,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
1013
1014
1014
1015
LLVM_DEBUG (llvm::dbgs ()
1015
1016
<< " --- approximateStdConv. Numeric to unscoped enum.\n " );
1016
- WorkType = QualType{ToEnum, QualifiersToApply };
1017
+ WorkType = QualType{ToEnum, FastQualifiersToApply };
1017
1018
}
1018
1019
1019
1020
// Check for pointer conversions.
@@ -1022,14 +1023,14 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
1022
1023
if (FromPtr && ToPtr) {
1023
1024
if (ToPtr->isVoidPointerType ()) {
1024
1025
LLVM_DEBUG (llvm::dbgs () << " --- approximateStdConv. To void pointer.\n " );
1025
- WorkType = QualType{ToPtr, QualifiersToApply };
1026
+ WorkType = QualType{ToPtr, FastQualifiersToApply };
1026
1027
}
1027
1028
1028
1029
const auto *FromRecordPtr = FromPtr->getPointeeCXXRecordDecl ();
1029
1030
const auto *ToRecordPtr = ToPtr->getPointeeCXXRecordDecl ();
1030
1031
if (isDerivedToBase (FromRecordPtr, ToRecordPtr)) {
1031
1032
LLVM_DEBUG (llvm::dbgs () << " --- approximateStdConv. Derived* to Base*\n " );
1032
- WorkType = QualType{ToPtr, QualifiersToApply };
1033
+ WorkType = QualType{ToPtr, FastQualifiersToApply };
1033
1034
}
1034
1035
}
1035
1036
@@ -1039,7 +1040,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
1039
1040
const auto *ToRecord = To->getAsCXXRecordDecl ();
1040
1041
if (isDerivedToBase (FromRecord, ToRecord)) {
1041
1042
LLVM_DEBUG (llvm::dbgs () << " --- approximateStdConv. Derived To Base.\n " );
1042
- WorkType = QualType{ToRecord->getTypeForDecl (), QualifiersToApply };
1043
+ WorkType = QualType{ToRecord->getTypeForDecl (), FastQualifiersToApply };
1043
1044
}
1044
1045
1045
1046
if (Ctx.getLangOpts ().CPlusPlus17 && FromPtr && ToPtr) {
@@ -1054,7 +1055,7 @@ approximateStandardConversionSequence(const TheCheck &Check, QualType From,
1054
1055
!ToFunctionPtr->hasNoexceptExceptionSpec ()) {
1055
1056
LLVM_DEBUG (llvm::dbgs () << " --- approximateStdConv. noexcept function "
1056
1057
" pointer to non-noexcept.\n " );
1057
- WorkType = QualType{ToPtr, QualifiersToApply };
1058
+ WorkType = QualType{ToPtr, FastQualifiersToApply };
1058
1059
}
1059
1060
}
1060
1061
0 commit comments