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 /gcc/cp/pt.c | |
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
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 21 |
1 files changed, 21 insertions, 0 deletions
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 " |