[cfe-commits] r133237 - /cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
Argyrios Kyrtzidis
kyrtzidis at apple.com
Fri Jun 17 08:36:48 PDT 2011
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 <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
>
> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list