diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/alias-decl-47.C | 13 |
3 files changed, 26 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d354e07..61c0b18 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-03-10 Jason Merrill <jason@redhat.com> + + PR c++/65333 + DR 1558 + * pt.c (dependent_type_p_r): Check both class and alias template args. + 2015-03-10 Jakub Jelinek <jakub@redhat.com> PR c/65120 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9a00d0d..ea82621 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -20930,7 +20930,13 @@ dependent_type_p_r (tree type) return true; /* ... or any of the template arguments is a dependent type or an expression that is type-dependent or value-dependent. */ - else if (TYPE_TEMPLATE_INFO (type) + else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INFO (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 (alias_template_specialization_p (type) && (any_dependent_template_arguments_p (INNERMOST_TEMPLATE_ARGS (TYPE_TI_ARGS (type))))) return true; diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-47.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-47.C new file mode 100644 index 0000000..71611db --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-47.C @@ -0,0 +1,13 @@ +// PR c++/65333 +// { dg-do compile { target c++11 } } + +template <typename T, T... Values> struct A +{ + using type = int; + template <type... Suffix> using array = A<type, Values..., Suffix...>; + void + m_fn1 () + { + array<>::data; + } +}; |