]> granicus.if.org Git - clang/commitdiff
Remove suppression of dr547 test and instead test that deduction succeeds if we
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 5 Sep 2014 00:17:00 +0000 (00:17 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 5 Sep 2014 00:17:00 +0000 (00:17 +0000)
use __thiscall. (This doesn't actually work for MSVC; they don't allow the
__thiscall qualifier here, but it's sufficient to demonstrate that we do
implement the intent of the DR.)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217213 91177308-0d34-0410-b5e6-96231b3b80d8

test/CXX/drs/dr5xx.cpp
www/cxx_dr_status.html

index de98c396954fd05ff4e609d4d09dedde846a3427..9ff67f88ccd7e048b7f6859715147cdda87fd0be 100644 (file)
@@ -517,17 +517,25 @@ namespace dr546 { // dr546: yes
   template<typename T> void A<T>::f() { T::error; }
 }
 
-// This is incompatible to attribute(thiscall).
-#if !defined(_M_IX86) && !defined(__MINGW32__) && !defined(__MINGW64__)
-namespace dr547 { // d547: yes
+namespace dr547 { // dr547: yes
+  // When targeting the MS ABI, the type of a member function includes a
+  // __thiscall qualifier. This is non-conforming, but we still implement
+  // the intent of dr547
+#if defined(_M_IX86) || defined(__MINGW32__) || defined(__MINGW64__)
+#define THISCALL __thiscall
+#else
+#define THISCALL
+#endif
+
   template<typename T> struct X;
-  template<typename T> struct X<T() const> {};
+  template<typename T> struct X<THISCALL T() const> {};
   template<typename T, typename C> X<T> f(T C::*) { return X<T>(); }
 
   struct S { void f() const; };
-  X<void() const> x = f(&S::f);
+  X<THISCALL void() const> x = f(&S::f);
+
+#undef THISCALL
 }
-#endif
 
 namespace dr548 { // dr548: dup 482
   template<typename T> struct S {};
index 14ce95ac32363f26d9560ebaabdbc45fa933099f..dd20f5dd4b21730e0a64229e78189858186d6a54 100644 (file)
@@ -3325,7 +3325,7 @@ and <I>POD class</I></td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#547">547</a></td>
     <td>C++11</td>
     <td>Partial specialization on member function types</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="548">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#548">548</a></td>