From a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 13 Nov 2009 09:40:32 -0500 Subject: 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 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'gcc/cp') 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 + 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 " -- cgit v1.1