summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-06 04:09:55 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-06 04:09:55 +0000
commitf9db1089610be3e886e7c6f4716363b062cc512c (patch)
tree99ef89771b3831d138a68893b3a8a348f0b53df8
parent3af0bf60169cf209d84ace9482603d1ebbe6d0d1 (diff)
downloadgcc-f9db1089610be3e886e7c6f4716363b062cc512c.tar.gz
PR c++/65195
PR c++/66619 * semantics.c (finish_id_expression): Call convert_from_reference for variable template. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@226656 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c1
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ37.C23
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ40.C9
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 059438a1b0a..72bd6f8fb15 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2015-08-05 Jason Merrill <jason@redhat.com>
+ PR c++/65195
+ PR c++/66619
+ * semantics.c (finish_id_expression): Call convert_from_reference
+ for variable template.
+
PR c++/66336
* pt.c (find_parameter_packs_r): Handle variable templates.
(variable_template_specialization_p): New.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 82ef6425ded..d6b80039c24 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3580,6 +3580,7 @@ finish_id_expression (tree id_expression,
{
decl = finish_template_variable (decl);
mark_used (decl);
+ decl = convert_from_reference (decl);
}
else if (scope)
{
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ37.C b/gcc/testsuite/g++.dg/cpp1y/var-templ37.C
new file mode 100644
index 00000000000..11021a3f5bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ37.C
@@ -0,0 +1,23 @@
+// PR c++/65195
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+T constant {};
+
+template<typename T>
+struct foo {
+ int operator()() const
+ { return 3; }
+};
+
+template<typename T>
+auto& f = constant<foo<T>>;
+
+int main()
+{
+ // fine
+ auto& ref = f<int>; ref();
+
+ // error: f<int> cannot be used as a function
+ f<int>();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ40.C b/gcc/testsuite/g++.dg/cpp1y/var-templ40.C
new file mode 100644
index 00000000000..0a952c48061
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ40.C
@@ -0,0 +1,9 @@
+// PR c++/66619
+// { dg-do compile { target c++14 } }
+
+int y;
+template<class T> T val1 = y;
+auto&& x1 = val1<int&>;
+
+template<class T> T val2 = 0;
+auto&& x2 = val2<int&&>;