diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-08-06 04:09:55 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-08-06 04:09:55 +0000 |
commit | f9db1089610be3e886e7c6f4716363b062cc512c (patch) | |
tree | 99ef89771b3831d138a68893b3a8a348f0b53df8 | |
parent | 3af0bf60169cf209d84ace9482603d1ebbe6d0d1 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ37.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ40.C | 9 |
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&&>; |