diff options
author | Jason Merrill <jason@redhat.com> | 2009-11-13 09:40:32 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-11-13 09:40:32 -0500 |
commit | a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6 (patch) | |
tree | 0de9d180e2d9bde4f6f881b0541a92561b41be33 | |
parent | ab11c13ff3e5507db92f789582b6f4e2a70569f3 (diff) | |
download | gcc-a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6.zip gcc-a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6.tar.gz gcc-a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6.tar.bz2 |
re PR c++/35075 (ICE with references in templates)
PR c++/35075
* pt.c (convert_nontype_argument): Give helpful error about
reference variable argument to reference template parameter.
From-SVN: r154151
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ref5.C | 11 |
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b148d23..d4c44a5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-11-13 Jason Merrill <jason@redhat.com> + PR c++/35075 + * pt.c (convert_nontype_argument): Give helpful error about + reference variable argument to reference template parameter. + PR c++/21008, DR 515 * semantics.c (finish_non_static_data_member): Don't check derivation in a template. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 85d9fff..c799368 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4927,6 +4927,27 @@ convert_nontype_argument (tree type, tree expr) shall be one of: [...] -- the address of an object or function with external linkage. */ + if (TREE_CODE (expr) == INDIRECT_REF + && TYPE_REF_OBJ_P (TREE_TYPE (TREE_OPERAND (expr, 0)))) + { + expr = TREE_OPERAND (expr, 0); + if (DECL_P (expr)) + { + error ("%q#D is not a valid template argument for type %qT " + "because a reference variable does not have a constant " + "address", expr, type); + return NULL_TREE; + } + } + + if (!DECL_P (expr)) + { + error ("%qE is not a valid template argument for type %qT " + "because it is not an object with external linkage", + expr, type); + return NULL_TREE; + } + if (!DECL_EXTERNAL_LINKAGE_P (expr)) { error ("%qE is not a valid template argument for type %qT " diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82752b8..e60555a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-11-13 Jason Merrill <jason@redhat.com> + PR c++/35075 + * g++.dg/template/ref5.C: New. + PR c++/21008, DR 515 * g++.dg/template/inherit4.C: New. * g++.dg/lookup/scoped8.C: Adjust. diff --git a/gcc/testsuite/g++.dg/template/ref5.C b/gcc/testsuite/g++.dg/template/ref5.C new file mode 100644 index 0000000..efefbef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref5.C @@ -0,0 +1,11 @@ +// PR c++/35075 + +template<int&> struct A {}; + +template<typename T> struct B +{ + static const T t; + A<t> a; // { dg-error "reference variable" } +}; + +B<int&> b; // { dg-message "instantiated" } |