From a38f55dbfdae98511d6e8cf3e6c1cb0e06bb89a6 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 13 Nov 2009 09:40:32 -0500 Subject: [PATCH] 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 +++++++++++++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/ref5.C | 11 +++++++++++ 4 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/ref5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b148d236f35..d4c44a51dab 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 85d9fff7b56..c79936838b2 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 82752b8db0a..e60555a92dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-11-13 Jason Merrill + 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 00000000000..efefbef9c26 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref5.C @@ -0,0 +1,11 @@ +// PR c++/35075 + +template struct A {}; + +template struct B +{ + static const T t; + A a; // { dg-error "reference variable" } +}; + +B b; // { dg-message "instantiated" }