[cfe-commits] r133237 - /cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
Francois Pichet
pichet2000 at gmail.com
Fri Jun 17 06:11:29 PDT 2011
On Fri, Jun 17, 2011 at 1:18 AM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Fri Jun 17 00:18:17 2011
> New Revision: 133237
>
> URL: http://llvm.org/viewvc/llvm-project?rev=133237&view=rev
> Log:
> Factor the checking of the deduced argument type against the actual
> argument type for C++ [temp.deduct.call]p4 out of
> Sema::FinishTemplateArgumentDeduction(). No functionality change.
>
>
> Modified:
> cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=133237&r1=133236&r2=133237&view=diff
> ==============================================================================
> /// \brief Finish template argument deduction for a function template,
> /// checking the deduced template arguments for completeness and forming
> /// the function template specialization.
> @@ -2487,85 +2569,14 @@
> // is transformed as described above). [...]
> for (unsigned I = 0, N = OriginalCallArgs->size(); I != N; ++I) {
> OriginalCallArg OriginalArg = (*OriginalCallArgs)[I];
> - QualType A = OriginalArg.OriginalArgType;
> unsigned ParamIdx = OriginalArg.ArgIdx;
>
> if (ParamIdx >= Specialization->getNumParams())
> continue;
>
> QualType DeducedA = Specialization->getParamDecl(ParamIdx)->getType();
> - QualType OriginalParamType = OriginalArg.OriginalParamType;
> -
> - // Check for type equality (top-level cv-qualifiers are ignored).
> - if (Context.hasSameUnqualifiedType(A, DeducedA))
> - continue;
> -
> - // Strip off references on the argument types; they aren't needed for
> - // the following checks.
> - if (const ReferenceType *DeducedARef = DeducedA->getAs<ReferenceType>())
> - DeducedA = DeducedARef->getPointeeType();
> - if (const ReferenceType *ARef = A->getAs<ReferenceType>())
> - A = ARef->getPointeeType();
> -
> - // C++ [temp.deduct.call]p4:
> - // [...] However, there are three cases that allow a difference:
> - // - If the original P is a reference type, the deduced A (i.e., the
> - // type referred to by the reference) can be more cv-qualified than
> - // the transformed A.
> - if (const ReferenceType *OriginalParamRef
> - = OriginalParamType->getAs<ReferenceType>()) {
> - // We don't want to keep the reference around any more.
> - OriginalParamType = OriginalParamRef->getPointeeType();
> -
> - Qualifiers AQuals = A.getQualifiers();
> - Qualifiers DeducedAQuals = DeducedA.getQualifiers();
> - if (AQuals == DeducedAQuals) {
> - // Qualifiers match; there's nothing to do.
> - } else if (!DeducedAQuals.compatiblyIncludes(AQuals)) {
> - return Sema::TDK_SubstitutionFailure;
why not return true here?
Otherwise it warns under MSVC with suspicious conversion to bool
More information about the cfe-commits
mailing list