From 4fdfdd4f1bc3ad199abac6876d7228ccd30dc71e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 30 Jul 2015 01:27:34 -0400 Subject: [PATCH] DR 1558 PR c++/67021 DR 1558 PR c++/67021 * pt.c (tsubst_decl) [TYPE_DECL]: Clear TYPE_DEPENDENT_P_VALID. From-SVN: r226381 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 4 ++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C | 24 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0fa0926cd5c..7356dff5ba2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-07-30 Jason Merrill + + DR 1558 + PR c++/67021 + * pt.c (tsubst_decl) [TYPE_DECL]: Clear TYPE_DEPENDENT_P_VALID. + 2015-07-28 Paolo Carlini * call.c (build_op_delete_call, convert_like_real, build_over_call): diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e92fefb416d..6bf3d23f2a7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11570,6 +11570,10 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) { DECL_ORIGINAL_TYPE (r) = NULL_TREE; set_underlying_type (r); + if (TYPE_DECL_ALIAS_P (r) && type != error_mark_node) + /* An alias template specialization can be dependent + even if its underlying type is not. */ + TYPE_DEPENDENT_P_VALID (TREE_TYPE (r)) = false; } layout_decl (r, 0); diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C new file mode 100644 index 00000000000..27340753901 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-52.C @@ -0,0 +1,24 @@ +// PR c++/67021 +// { dg-do compile { target c++11 } } + +template struct Dummy; +template<> struct Dummy {}; + +template +struct all_same { static constexpr bool value = true; }; +template +struct all_same : all_same {}; +template +struct all_same { static constexpr bool value = false; }; + +template +using ValueType = int; + +template +constexpr bool A(I i) { + return all_same, ValueType>::value; +} + +int main() { + static_assert(A(42), ""); +} -- 2.30.2