forked from OSchip/llvm-project
Add the built-in candidate set reduction hueristic
to '+=', '-=', '*=' and '/=' builtin operators and fixes a logic bug exposed by doing this. llvm-svn: 84538
This commit is contained in:
parent
9abd706881
commit
b9e8c42ee6
|
@ -3201,6 +3201,9 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
|
||||||
// that make use of these types.
|
// that make use of these types.
|
||||||
Qualifiers VisibleTypeConversionsQuals;
|
Qualifiers VisibleTypeConversionsQuals;
|
||||||
VisibleTypeConversionsQuals.addConst();
|
VisibleTypeConversionsQuals.addConst();
|
||||||
|
for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx)
|
||||||
|
VisibleTypeConversionsQuals += CollectVRQualifiers(Context, Args[ArgIdx]);
|
||||||
|
|
||||||
BuiltinCandidateTypeSet CandidateTypes(*this);
|
BuiltinCandidateTypeSet CandidateTypes(*this);
|
||||||
if (Op == OO_Less || Op == OO_Greater || Op == OO_LessEqual ||
|
if (Op == OO_Less || Op == OO_Greater || Op == OO_LessEqual ||
|
||||||
Op == OO_GreaterEqual || Op == OO_EqualEqual || Op == OO_ExclaimEqual ||
|
Op == OO_GreaterEqual || Op == OO_EqualEqual || Op == OO_ExclaimEqual ||
|
||||||
|
@ -3208,9 +3211,6 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
|
||||||
Op == OO_PlusEqual || Op == OO_MinusEqual || Op == OO_Subscript ||
|
Op == OO_PlusEqual || Op == OO_MinusEqual || Op == OO_Subscript ||
|
||||||
Op == OO_ArrowStar || Op == OO_PlusPlus || Op == OO_MinusMinus ||
|
Op == OO_ArrowStar || Op == OO_PlusPlus || Op == OO_MinusMinus ||
|
||||||
(Op == OO_Star && NumArgs == 1) || Op == OO_Conditional) {
|
(Op == OO_Star && NumArgs == 1) || Op == OO_Conditional) {
|
||||||
for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx)
|
|
||||||
VisibleTypeConversionsQuals += CollectVRQualifiers(Context, Args[ArgIdx]);
|
|
||||||
|
|
||||||
for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx)
|
for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx)
|
||||||
CandidateTypes.AddTypesConvertedFrom(Args[ArgIdx]->getType(),
|
CandidateTypes.AddTypesConvertedFrom(Args[ArgIdx]->getType(),
|
||||||
true,
|
true,
|
||||||
|
@ -3636,7 +3636,8 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
|
||||||
AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, 2, CandidateSet,
|
AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, 2, CandidateSet,
|
||||||
/*IsAssigmentOperator=*/Op == OO_Equal);
|
/*IsAssigmentOperator=*/Op == OO_Equal);
|
||||||
|
|
||||||
if (!Context.getCanonicalType(*Ptr).isVolatileQualified()) {
|
if (!Context.getCanonicalType(*Ptr).isVolatileQualified() &&
|
||||||
|
VisibleTypeConversionsQuals.hasVolatile()) {
|
||||||
// volatile version
|
// volatile version
|
||||||
ParamTypes[0]
|
ParamTypes[0]
|
||||||
= Context.getLValueReferenceType(Context.getVolatileType(*Ptr));
|
= Context.getLValueReferenceType(Context.getVolatileType(*Ptr));
|
||||||
|
@ -3672,10 +3673,12 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
|
||||||
/*IsAssigmentOperator=*/Op == OO_Equal);
|
/*IsAssigmentOperator=*/Op == OO_Equal);
|
||||||
|
|
||||||
// Add this built-in operator as a candidate (VQ is 'volatile').
|
// Add this built-in operator as a candidate (VQ is 'volatile').
|
||||||
ParamTypes[0] = Context.getVolatileType(ArithmeticTypes[Left]);
|
if (VisibleTypeConversionsQuals.hasVolatile()) {
|
||||||
ParamTypes[0] = Context.getLValueReferenceType(ParamTypes[0]);
|
ParamTypes[0] = Context.getVolatileType(ArithmeticTypes[Left]);
|
||||||
AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, 2, CandidateSet,
|
ParamTypes[0] = Context.getLValueReferenceType(ParamTypes[0]);
|
||||||
/*IsAssigmentOperator=*/Op == OO_Equal);
|
AddBuiltinCandidate(ParamTypes[0], ParamTypes, Args, 2, CandidateSet,
|
||||||
|
/*IsAssigmentOperator=*/Op == OO_Equal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue