diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-06-24 19:59:28 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-06-24 19:59:28 +0000 |
commit | fa4f365b8559743b59ae52801d74b7dbd4da4fce (patch) | |
tree | 67aac9552e4bc47a5bf9c85db3df018f44127c60 | |
parent | 14a6e10c3985adc02f126b1ce5a2f52906e52349 (diff) |
PR c++/66647
* pt.c (dependent_type_p_r): Check for dependent alias template
specialization sooner.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224917 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/alias-decl-49.C | 54 |
3 files changed, 64 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2fa1732f779..9dc92669ced 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2015-06-24 Jason Merrill <jason@redhat.com> + PR c++/66647 + * pt.c (dependent_type_p_r): Check for dependent alias template + specialization sooner. + PR c++/66501 * class.c (type_has_nontrivial_assignment): Remove. * cp-tree.h: Remove declaration. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8800af819ec..b63c0d4b7db 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -20992,6 +20992,12 @@ dependent_type_p_r (tree type) names a dependent type. */ if (TREE_CODE (type) == TYPENAME_TYPE) return true; + + /* An alias template specialization can be dependent even if the + resulting type is not. */ + if (dependent_alias_template_spec_p (type)) + return true; + /* -- a cv-qualified type where the cv-unqualified type is dependent. No code is necessary for this bullet; the code below handles @@ -21043,10 +21049,6 @@ dependent_type_p_r (tree type) && (any_dependent_template_arguments_p (INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type))))) return true; - /* For an alias template specialization, check the arguments both to the - class template and the alias template. */ - else if (dependent_alias_template_spec_p (type)) - return true; /* All TYPEOF_TYPEs, DECLTYPE_TYPEs, and UNDERLYING_TYPEs are dependent; if the argument of the `typeof' expression is not diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-49.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-49.C new file mode 100644 index 00000000000..5fd3b650386 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-49.C @@ -0,0 +1,54 @@ +// PR c++/66647 +// { dg-do compile { target c++11 } } + +template <typename _Tp> struct A +{ + static constexpr _Tp value = 1; +}; +template <typename> class B +{ +public: + template <typename> struct rebind + { + }; +}; + +template <typename _Alloc, typename _Tp> class C +{ + template <typename _Alloc2, typename _Tp2> + static A<int> _S_chk (typename _Alloc2::template rebind<_Tp2> *); + +public: + using __type = decltype (_S_chk<_Alloc, _Tp> (0)); +}; + +template <typename _Alloc, typename _Tp, int = C<_Alloc, _Tp>::__type::value> +struct D; +template <typename _Alloc, typename _Tp> struct D<_Alloc, _Tp, 1> +{ + typedef typename _Alloc::template rebind<_Tp> __type; +}; +template <typename _Alloc> struct F +{ + template <typename _Tp> using rebind_alloc = typename D<_Alloc, _Tp>::__type; +}; +template <typename _Alloc> struct __alloc_traits +{ + template <typename> struct rebind + { + typedef typename F<_Alloc>::template rebind_alloc<int> other; + }; +}; +template <typename _Alloc> struct G +{ + typename __alloc_traits<_Alloc>::template rebind<int>::other _Tp_alloc_type; +}; +template <typename _Tp, typename _Alloc = B<_Tp> > class vector : G<_Alloc> +{ +}; + +template <int> using tfuncptr = void(); +template <int d> struct H +{ + vector<tfuncptr<d> > funcs; +}; |