Code refactoring and cleanup.

llvm-svn: 82566
This commit is contained in:
Fariborz Jahanian 2009-09-22 20:24:30 +00:00
parent 0b51c729c9
commit f0647a5fbc
2 changed files with 25 additions and 22 deletions

View File

@ -791,6 +791,8 @@ public:
OverloadCandidateSet& Conversions,
bool AllowConversionFunctions,
bool AllowExplicit, bool ForceRValue);
bool DiagnoseAmbiguousUserDefinedConversion(Expr *From, QualType ToType);
ImplicitConversionSequence::CompareKind
CompareImplicitConversionSequences(const ImplicitConversionSequence& ICS1,

View File

@ -1501,6 +1501,22 @@ Sema::OverloadingResult Sema::IsUserDefinedConversion(
return OR_No_Viable_Function;
}
bool
Sema::DiagnoseAmbiguousUserDefinedConversion(Expr *From, QualType ToType) {
ImplicitConversionSequence ICS;
OverloadCandidateSet CandidateSet;
OverloadingResult OvResult =
IsUserDefinedConversion(From, ToType, ICS.UserDefined,
CandidateSet, true, false, false);
if (OvResult != OR_Ambiguous)
return false;
Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_ambiguous_condition)
<< From->getType() << ToType << From->getSourceRange();
PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
return true;
}
/// CompareImplicitConversionSequences - Compare two implicit
/// conversion sequences to determine whether one is better than the
@ -1983,18 +1999,10 @@ bool Sema::PerformCopyInitialization(Expr *&From, QualType ToType,
if (!PerformImplicitConversion(From, ToType, Flavor,
/*AllowExplicit=*/false, Elidable))
return false;
ImplicitConversionSequence ICS;
OverloadCandidateSet CandidateSet;
if (IsUserDefinedConversion(From, ToType, ICS.UserDefined,
CandidateSet,
true, false, false) != OR_Ambiguous)
if (!DiagnoseAmbiguousUserDefinedConversion(From, ToType))
return Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_convert_incompatible)
<< ToType << From->getType() << Flavor << From->getSourceRange();
Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_ambiguous_condition)
<< From->getType() << ToType << From->getSourceRange();
PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
return true;
}
@ -2109,19 +2117,12 @@ bool Sema::PerformContextuallyConvertToBool(Expr *&From) {
ImplicitConversionSequence ICS = TryContextuallyConvertToBool(From);
if (!PerformImplicitConversion(From, Context.BoolTy, ICS, "converting"))
return false;
OverloadCandidateSet CandidateSet;
if (IsUserDefinedConversion(From, Context.BoolTy, ICS.UserDefined,
CandidateSet,
true, false, false) != OR_Ambiguous)
return Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_bool_condition)
<< From->getType() << From->getSourceRange();
Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_ambiguous_condition)
<< From->getType() << Context.BoolTy << From->getSourceRange();
PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);
return true;
if (!DiagnoseAmbiguousUserDefinedConversion(From, Context.BoolTy))
return Diag(From->getSourceRange().getBegin(),
diag::err_typecheck_bool_condition)
<< From->getType() << From->getSourceRange();
return true;
}
/// AddOverloadCandidate - Adds the given function to the set of