diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9d24958ee49..0889ea6e7fe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-08-13 Andrew Sutton + + * pt.c (lookup_template_variable): Make dependent variable templates + have unknown type. + 2014-08-13 Paolo Carlini * parser.c (cp_parser_elaborated_type_specifier): Handle diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 90b2720ef9c..be16ca8a0c9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7965,13 +7965,22 @@ lookup_template_class (tree d1, tree arglist, tree in_decl, tree context, return ret; } -/* Return a TEMPLATE_ID_EXPR for the given variable template and ARGLIST. */ +/* Return a TEMPLATE_ID_EXPR for the given variable template and ARGLIST. + If the ARGLIST refers to any template parameters, the type of the + expression is the unknown_type_node since the template-id could + refer to an explicit or partial specialization. */ tree lookup_template_variable (tree templ, tree arglist) { - return build2 (TEMPLATE_ID_EXPR, TREE_TYPE (templ), templ, arglist); + tree type; + if (uses_template_parms (arglist)) + type = unknown_type_node; + else + type = TREE_TYPE (templ); + return build2 (TEMPLATE_ID_EXPR, type, templ, arglist); } + struct pair_fn_data { diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ6.C b/gcc/testsuite/g++.dg/cpp1y/var-templ6.C new file mode 100644 index 00000000000..2125d6c9487 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ6.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++1y" } + +template + constexpr bool Class = __is_class(T); + +template + constexpr bool Test = Class; + +struct S { }; + +static_assert(!Test, ""); +static_assert(Test, "");