diff options
author | Jason Merrill <jason@redhat.com> | 2015-01-06 15:44:51 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-01-06 15:44:51 -0500 |
commit | c6a38536f205e0723600d54bce3aaf05ec107161 (patch) | |
tree | 9ed27cf87e9517222e7cafa154708e9602f9f7b5 | |
parent | b433d944ab6d308ea3f85c7537e64b99bc27bed5 (diff) | |
download | gcc-c6a38536f205e0723600d54bce3aaf05ec107161.zip gcc-c6a38536f205e0723600d54bce3aaf05ec107161.tar.gz gcc-c6a38536f205e0723600d54bce3aaf05ec107161.tar.bz2 |
re PR c++/64455 (A constexpr variable template can't be used with enable_if)
PR c++/64455
* pt.c (type_dependent_expression_p): Handle variable templates.
* constexpr.c (potential_constant_expression_1): Use it.
From-SVN: r219268
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 2 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ21.C | 25 |
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 604b518..e5e54ea 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2015-01-06 Jason Merrill <jason@redhat.com> + PR c++/64455 + * pt.c (type_dependent_expression_p): Handle variable templates. + * constexpr.c (potential_constant_expression_1): Use it. + PR c++/64487 * semantics.c (finish_offsetof): Handle templates here. * parser.c (cp_parser_builtin_offsetof): Not here. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index ee796df..4da263e 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3882,7 +3882,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t)) || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t)) && !var_in_constexpr_fn (t) - && !dependent_type_p (TREE_TYPE (t))) + && !type_dependent_expression_p (t)) { if (flags & tf_error) non_const_var_error (t); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 15645b9..de2f6a4 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -21369,6 +21369,14 @@ type_dependent_expression_p (tree expression) && DECL_INITIAL (expression)) return true; + /* A variable template specialization is type-dependent if it has any + dependent template arguments. */ + if (VAR_P (expression) + && DECL_LANG_SPECIFIC (expression) + && DECL_TEMPLATE_INFO (expression) + && variable_template_p (DECL_TI_TEMPLATE (expression))) + return any_dependent_template_arguments_p (DECL_TI_ARGS (expression)); + if (TREE_TYPE (expression) == unknown_type_node) { if (TREE_CODE (expression) == ADDR_EXPR) diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ21.C b/gcc/testsuite/g++.dg/cpp1y/var-templ21.C new file mode 100644 index 0000000..a7b0899 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ21.C @@ -0,0 +1,25 @@ +// PR c++/64455 +// { dg-do compile { target c++14 } } + +template<typename Type> +constexpr bool IsType = true; + +template <bool b, class T> struct Test +{ +}; + +template <class T> +struct Test<true, T> +{ + typedef T type; +}; + +template<class T> +struct X { + typedef typename Test<IsType<T>,T>::type type; +}; + +int main() +{ + X<int>::type t; +} |