On Jun 17, 2011, at 7:42 AM, Douglas Gregor wrote: > > On Jun 17, 2011, at 6:11 AM, Francois Pichet wrote: > >> On Fri, Jun 17, 2011 at 1:18 AM, Douglas Gregor <[email protected]> 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 > > Oops! It was a refactoro, fixed in r133257. Thanks!
Looks like the warning was useful. Francois, could you please file a bug report with a test case so that we implement the warning in clang as well ? > > - Doug > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
