OSDN Git Service

PR c++/35075
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Nov 2009 14:40:32 +0000 (14:40 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Nov 2009 14:40:32 +0000 (14:40 +0000)
* pt.c (convert_nontype_argument): Give helpful error about
reference variable argument to reference template parameter.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154151 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/ref5.C [new file with mode: 0644]

index b148d23..d4c44a5 100644 (file)
@@ -1,5 +1,9 @@
 2009-11-13  Jason Merrill  <jason@redhat.com>
 
 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.
        PR c++/21008, DR 515
        * semantics.c (finish_non_static_data_member): Don't check
        derivation in a template.
index 85d9fff..c799368 100644 (file)
@@ -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.  */
         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 "
       if (!DECL_EXTERNAL_LINKAGE_P (expr))
        {
          error ("%qE is not a valid template argument for type %qT "
index 82752b8..e60555a 100644 (file)
@@ -1,5 +1,8 @@
 2009-11-13  Jason Merrill  <jason@redhat.com>
 
 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.
        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 (file)
index 0000000..efefbef
--- /dev/null
@@ -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" }