]> granicus.if.org Git - clang/commitdiff
Don't complain about useless user-defined conversion functions when
authorDouglas Gregor <dgregor@apple.com>
Sun, 12 Sep 2010 07:22:28 +0000 (07:22 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 12 Sep 2010 07:22:28 +0000 (07:22 +0000)
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

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/conversion-function.cpp

index 86533cdb0fb6bfc4162ce46245a24242d84fe6d9..3157f9c706137c26155297dac1399459f9ff8a23 100644 (file)
@@ -3233,7 +3233,10 @@ Decl *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) {
     = Context.getCanonicalType(Context.getTypeDeclType(ClassDecl));
   if (const ReferenceType *ConvTypeRef = ConvType->getAs<ReferenceType>())
     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)
index 7f8fdd534007d6e36d17d4324ec7e8b229459aa7..8d5e01039c14bb876ee2573388263aac9e961d71 100644 (file)
@@ -325,3 +325,21 @@ namespace rdar8018274 {
     int i = ed;
   }
 }
+
+namespace PR8065 {
+  template <typename T> struct Iterator;
+  template <typename T> struct Container;
+
+  template<>
+  struct Iterator<int> {
+    typedef Container<int> container_type;
+  };
+
+  template <typename T>
+  struct Container {
+    typedef typename Iterator<T>::container_type X;
+    operator X(void) { return X(); }
+  };
+
+  Container<int> test;
+}