re PR c++/7478 (internal compiler error on static_cast inside template)
authorMark Mitchell <mark@codesourcery.com>
Thu, 17 Oct 2002 00:17:59 +0000 (00:17 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 17 Oct 2002 00:17:59 +0000 (00:17 +0000)
PR c++/7478
* cvt.c (convert_to_reference): Allow references as the incoming
type.

PR c++/7478
* g++.dg/template/ref1.C: New test.

From-SVN: r58230

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

index 07b8732d9332f21772b412ed25106dbf13a08111..80132effe86ddc3e8f0276e0d4af9bbb57ee045c 100644 (file)
@@ -1,3 +1,9 @@
+2002-10-16  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/7478
+       * cvt.c (convert_to_reference): Allow references as the incoming
+       type.
+
 2002-10-16  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/7524
index 6905a049e45be9365a4564b147977f5085b9b6d8..7e31045a4854cf6cbd737a44ba6b79429aae1e8a 100644 (file)
@@ -473,12 +473,13 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
      tree decl;
 {
   register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
-  register tree intype = TREE_TYPE (expr);
+  register tree intype;
   tree rval = NULL_TREE;
   tree rval_as_conversion = NULL_TREE;
   int i;
 
-  if (TREE_CODE (type) == FUNCTION_TYPE && intype == unknown_type_node)
+  if (TREE_CODE (type) == FUNCTION_TYPE 
+      && TREE_TYPE (expr) == unknown_type_node)
     {
       expr = instantiate_type (type, expr, 
                               (flags & LOOKUP_COMPLAIN)
@@ -488,6 +489,11 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
 
       intype = TREE_TYPE (expr);
     }
+  else
+    {
+      expr = convert_from_reference (expr);
+      intype = TREE_TYPE (expr);
+    }
 
   my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364);
 
index 06461f7ac9556c4537c98e6cbc0bb906b1c4658f..3f3cee43c787f3bd0bf10f6b789c15fee23d7e77 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-16  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/7478
+       * g++.dg/template/ref1.C: New test.
+
 2002-10-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * gcc.c-torture/execute/20020720-1.x: Don't XFAIL for mips.
diff --git a/gcc/testsuite/g++.dg/template/ref1.C b/gcc/testsuite/g++.dg/template/ref1.C
new file mode 100644 (file)
index 0000000..3f133d4
--- /dev/null
@@ -0,0 +1,3 @@
+class a {} a1;
+template <a & p> class b { public: b() { static_cast <a &> (p); }; };
+int main() { b <a1> b1; };