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:
Fariborz Jahanian 2009-10-19 21:30:45 +00:00
parent 9abd706881
commit b9e8c42ee6
1 changed files with 11 additions and 8 deletions

View File

@ -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;