]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/46105 (Ordering failure among partial specializations with non-deduced...
authorJason Merrill <jason@redhat.com>
Tue, 27 Sep 2011 02:12:51 +0000 (22:12 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 27 Sep 2011 02:12:51 +0000 (22:12 -0400)
PR c++/46105
* typeck.c (structural_comptypes): Ignore cv-quals on typename scope.

From-SVN: r179229

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/partial12.C [new file with mode: 0644]

index 0efa0d682e72b438d426ec6ec7bc7d0d880b5639..abde58c856e48dbc24fa04cee718f66138a49b59 100644 (file)
@@ -1,5 +1,8 @@
 2011-09-26  Jason Merrill  <jason@redhat.com>
 
+       PR c++/46105
+       * typeck.c (structural_comptypes): Ignore cv-quals on typename scope.
+
        PR c++/50508
        * semantics.c (cxx_eval_logical_expression): Use tree_int_cst_equal
        rather than ==.
index 955e37a28893d596c9e05defa8b252ac3ab7234a..10f17bf0494a900d47328a39afd89bc75693d847 100644 (file)
@@ -1300,7 +1300,9 @@ structural_comptypes (tree t1, tree t2, int strict)
       if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
                          TYPENAME_TYPE_FULLNAME (t2)))
        return false;
-      if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
+      /* Qualifiers don't matter on scopes.  */
+      if (!same_type_ignoring_top_level_qualifiers_p (TYPE_CONTEXT (t1),
+                                                     TYPE_CONTEXT (t2)))
        return false;
       break;
 
index bc362edf21b7db1021c83a84d738a39b69945e36..32cf9600ca6117000660bcafbfcd69e4e0da0d75 100644 (file)
@@ -1,5 +1,8 @@
 2011-09-26  Jason Merrill  <jason@redhat.com>
 
+       PR c++/46105
+       * g++.dg/template/partial12.C: New.
+
        PR c++/50508
        * g++.dg/cpp0x/constexpr-typedef1.C: New.
 
diff --git a/gcc/testsuite/g++.dg/template/partial12.C b/gcc/testsuite/g++.dg/template/partial12.C
new file mode 100644 (file)
index 0000000..05a3eca
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/46105
+
+template< typename T >
+struct empty { // support class is like stripped-down enable_if
+    typedef void type;
+};
+
+template< class T, typename v = void > // v is always void!
+struct element {
+    typedef typename T::value_type type;
+};
+
+template< class T > // T in deduced context, T::element_type is SFINAE:
+struct element< T, typename empty< typename T::element_type >::type > {
+    typedef typename T::element_type type;
+};
+
+template< class T >
+struct element< T const, typename empty< typename T::element_type >::type > {
+    typedef typename T::element_type const type;
+};
+
+struct has_et {
+    typedef int element_type;
+};
+
+element<has_et const>::type ip = 0;