diff options
author | Jason Merrill <jason@redhat.com> | 2011-09-26 22:12:51 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-09-26 22:12:51 -0400 |
commit | 69d28b4f42a1226adb8507083314915dd4a69192 (patch) | |
tree | 252aadf72d57ed1807e5c65376923e98f5088fa0 | |
parent | 15442c9c4fc7bb169629a75c170d801e9fa07fd7 (diff) | |
download | gcc-69d28b4f42a1226adb8507083314915dd4a69192.zip gcc-69d28b4f42a1226adb8507083314915dd4a69192.tar.gz gcc-69d28b4f42a1226adb8507083314915dd4a69192.tar.bz2 |
re PR c++/46105 (Ordering failure among partial specializations with non-deduced context)
PR c++/46105
* typeck.c (structural_comptypes): Ignore cv-quals on typename scope.
From-SVN: r179229
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/partial12.C | 27 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0efa0d6..abde58c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 ==. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 955e37a..10f17bf 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bc362ed..32cf960 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..05a3eca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial12.C @@ -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; |