This revision was automatically updated to reflect the committed changes.
Closed by commit rL331424: [Sema] Do not match function type with const T in 
template argument deduction (authored by lliu0, committed by ).
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D45755?vs=142885&id=144968#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D45755

Files:
  cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
  cfe/trunk/test/CXX/drs/dr15xx.cpp
  cfe/trunk/test/CXX/drs/dr4xx.cpp
  cfe/trunk/test/SemaTemplate/function-pointer-qualifier.cpp

Index: cfe/trunk/test/SemaTemplate/function-pointer-qualifier.cpp
===================================================================
--- cfe/trunk/test/SemaTemplate/function-pointer-qualifier.cpp
+++ cfe/trunk/test/SemaTemplate/function-pointer-qualifier.cpp
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+template<class _Ty> inline
+	void testparam(_Ty **, _Ty **)
+	{
+	}
+
+template<class _Ty> inline
+	void testparam(_Ty *const *, _Ty **)
+	{
+	}
+
+template<class _Ty> inline
+	void testparam(_Ty **, const _Ty **)
+	{
+	}
+
+template<class _Ty> inline
+	void testparam(_Ty *const *, const _Ty **)
+	{
+	}
+
+void case0()
+{
+    void (**p1)();
+    void (**p2)();
+    testparam(p1, p2);
+}
Index: cfe/trunk/test/CXX/drs/dr4xx.cpp
===================================================================
--- cfe/trunk/test/CXX/drs/dr4xx.cpp
+++ cfe/trunk/test/CXX/drs/dr4xx.cpp
@@ -796,24 +796,9 @@
 }
 
 namespace dr469 { // dr469: no
-  // FIXME: The core issue here didn't really answer the question. We don't
-  // deduce 'const T' from a function or reference type in a class template...
-  template<typename T> struct X; // expected-note 2{{here}}
+  template<typename T> struct X; // expected-note {{here}}
   template<typename T> struct X<const T> {};
   X<int&> x; // expected-error {{undefined}}
-  X<int()> y; // expected-error {{undefined}}
-
-  // ... but we do in a function template. GCC and EDG fail deduction of 'f'
-  // and the second 'h'.
-  template<typename T> void f(const T *);
-  template<typename T> void g(T *, const T * = 0);
-  template<typename T> void h(T *) { T::error; }
-  template<typename T> void h(const T *);
-  void i() {
-    f(&i);
-    g(&i);
-    h(&i);
-  }
 }
 
 namespace dr470 { // dr470: yes
Index: cfe/trunk/test/CXX/drs/dr15xx.cpp
===================================================================
--- cfe/trunk/test/CXX/drs/dr15xx.cpp
+++ cfe/trunk/test/CXX/drs/dr15xx.cpp
@@ -357,6 +357,19 @@
 };
 } // end namespace dr1579
 
+namespace dr1584 {
+  // Deducing function types from cv-qualified types
+  template<typename T> void f(const T *); // expected-note {{candidate template ignored}}
+  template<typename T> void g(T *, const T * = 0);
+  template<typename T> void h(T *) { T::error; } // expected-error {{no members}}
+  template<typename T> void h(const T *);
+  void i() {
+    f(&i); // expected-error {{no matching function}}
+    g(&i);
+    h(&i); // expected-note {{here}}
+  }
+}
+
 namespace dr1589 {   // dr1589: 3.7 c++11
   // Ambiguous ranking of list-initialization sequences
 
Index: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
+++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
@@ -1273,6 +1273,12 @@
       return Sema::TDK_Underqualified;
     }
 
+    // Do not match a function type with a cv-qualified type.
+    // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584
+    if (Arg->isFunctionType() && Param.hasQualifiers()) {
+      return Sema::TDK_NonDeducedMismatch;
+    }
+
     assert(TemplateTypeParm->getDepth() == Info.getDeducedDepth() &&
            "saw template type parameter with wrong depth");
     assert(Arg != S.Context.OverloadTy && "Unresolved overloaded function");
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to