[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