aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-01-18 16:05:12 -0500
committerJason Merrill <jason@gcc.gnu.org>2017-01-18 16:05:12 -0500
commit8b1346a80ab539a680eb7d010a1de5f18c53a9d5 (patch)
tree72684e3337feb472dad772d8b129d16f1e244246
parent0edd264dfc29db3c30641771d46634b4ef3ffe10 (diff)
downloadgcc-8b1346a80ab539a680eb7d010a1de5f18c53a9d5.zip
gcc-8b1346a80ab539a680eb7d010a1de5f18c53a9d5.tar.gz
gcc-8b1346a80ab539a680eb7d010a1de5f18c53a9d5.tar.bz2
PR c++/68666 - member variable template-id
* typeck.c (finish_class_member_access_expr): Handle variable template-id. * pt.c (lookup_and_finish_template_variable): No longer static. * cp-tree.h: Declare it. From-SVN: r244599
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/cp/typeck.c5
-rw-r--r--gcc/testsuite/g++.dg/concepts/var-templ3.C12
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ55.C12
6 files changed, 38 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 11dfbad..f8377e2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2017-01-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/68666 - member variable template-id
+ * typeck.c (finish_class_member_access_expr): Handle variable
+ template-id.
+ * pt.c (lookup_and_finish_template_variable): No longer static.
+ * cp-tree.h: Declare it.
+
2017-01-18 Nathan Sidwell <nathan@acm.org>
PR c++/78488
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 98e4cbd..9c44367 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -6449,6 +6449,7 @@ extern cp_expr perform_koenig_lookup (cp_expr, vec<tree, va_gc> *,
tsubst_flags_t);
extern tree finish_call_expr (tree, vec<tree, va_gc> **, bool,
bool, tsubst_flags_t);
+extern tree lookup_and_finish_template_variable (tree, tree, tsubst_flags_t = tf_warning_or_error);
extern tree finish_template_variable (tree, tsubst_flags_t = tf_warning_or_error);
extern cp_expr finish_increment_expr (cp_expr, enum tree_code);
extern tree finish_this_expr (void);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 6fd03a5..c679133 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9035,7 +9035,7 @@ finish_template_variable (tree var, tsubst_flags_t complain)
/* Construct a TEMPLATE_ID_EXPR for the given variable template TEMPL having
TARGS template args, and instantiate it if it's not dependent. */
-static tree
+tree
lookup_and_finish_template_variable (tree templ, tree targs,
tsubst_flags_t complain)
{
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index b84f8bee..579c580 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -2875,7 +2875,10 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
tree templ = member;
if (BASELINK_P (templ))
- templ = lookup_template_function (templ, template_args);
+ member = lookup_template_function (templ, template_args);
+ else if (variable_template_p (templ))
+ member = (lookup_and_finish_template_variable
+ (templ, template_args, complain));
else
{
if (complain & tf_error)
diff --git a/gcc/testsuite/g++.dg/concepts/var-templ3.C b/gcc/testsuite/g++.dg/concepts/var-templ3.C
new file mode 100644
index 0000000..b882b08
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/var-templ3.C
@@ -0,0 +1,12 @@
+// PR c++/68666
+// { dg-options "-std=c++1z -fconcepts" }
+
+struct A {
+ template <class>
+ static constexpr bool val = true;
+};
+
+template <class T>
+concept bool C = A::val<T>;
+
+C{T} struct B {};
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ55.C b/gcc/testsuite/g++.dg/cpp1y/var-templ55.C
new file mode 100644
index 0000000..0840df3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ55.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++14 } }
+
+template <class T> struct A {
+ template <class U> static const U x = 1;
+ static const int y = 2;
+};
+
+int main() {
+ A<int> a;
+ int y = a.y; // OK
+ int x = a.x<int>; // ???
+}