From: Douglas Gregor Date: Sun, 12 Sep 2010 07:22:28 +0000 (+0000) Subject: Don't complain about useless user-defined conversion functions when X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da0fd9a7faa8b8a666e3c31ff0b5897e0f73f892;p=clang Don't complain about useless user-defined conversion functions when they were instantiated from a template. In template metaprogramming, stuff happens. Fixes PR8065. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113722 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 86533cdb0f..3157f9c706 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -3233,7 +3233,10 @@ Decl *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) { = Context.getCanonicalType(Context.getTypeDeclType(ClassDecl)); if (const ReferenceType *ConvTypeRef = ConvType->getAs()) ConvType = ConvTypeRef->getPointeeType(); - if (ConvType->isRecordType()) { + if (Conversion->getTemplateSpecializationKind() != TSK_Undeclared && + Conversion->getTemplateSpecializationKind() != TSK_ExplicitSpecialization) + /* Suppress disanogstics for instantiations. */; + else if (ConvType->isRecordType()) { ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType(); if (ConvType == ClassType) Diag(Conversion->getLocation(), diag::warn_conv_to_self_not_used) diff --git a/test/SemaCXX/conversion-function.cpp b/test/SemaCXX/conversion-function.cpp index 7f8fdd5340..8d5e01039c 100644 --- a/test/SemaCXX/conversion-function.cpp +++ b/test/SemaCXX/conversion-function.cpp @@ -325,3 +325,21 @@ namespace rdar8018274 { int i = ed; } } + +namespace PR8065 { + template struct Iterator; + template struct Container; + + template<> + struct Iterator { + typedef Container container_type; + }; + + template + struct Container { + typedef typename Iterator::container_type X; + operator X(void) { return X(); } + }; + + Container test; +}