re PR c++/18949 (trouble with const_cast in templates)
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 14 Dec 2004 15:39:12 +0000 (15:39 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 14 Dec 2004 15:39:12 +0000 (15:39 +0000)
cp:
PR c++/18949
* pt.c (tsubst_copy_and_build): <INDIRECT_REF case> Check that a
REFERENCE_REF_P is dereferencing a reference type.
* typeck.c (build_static_cast): Convert from reference even in a
template.
(build_reinterpret_cast, build_const_cast, build_c_cast): Likewise.
testsuite:
PR c++/18949
* g++.dg/template/cast1.C: New.

From-SVN: r92136

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

index 86610ec2db61517c0a8bcb5b6a4a886fb7d0dddd..1dd91a12f17ecd506fbeadc1150ca82494aa63ed 100644 (file)
@@ -1,3 +1,12 @@
+2004-12-14  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/18949
+       * pt.c (tsubst_copy_and_build): <INDIRECT_REF case> Check that a
+       REFERENCE_REF_P is dereferencing a reference type.
+       * typeck.c (build_static_cast): Convert from reference even in a
+       template.
+       (build_reinterpret_cast, build_const_cast, build_c_cast): Likewise.
+
 2004-12-14  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        * parser.c (cp_parser_uncommitted_to_tentative_parse_p): New function.
index 6e34ba6926cf8a8e31ef3957c1a640ae0bb6cef1..5da280610b42cc864fab79735785685c729921e5 100644 (file)
@@ -8395,8 +8395,11 @@ tsubst_copy_and_build (tree t,
 
        if (REFERENCE_REF_P (t))
          {
-           gcc_assert (TREE_CODE (TREE_TYPE (r)) == REFERENCE_TYPE);
-           r = convert_from_reference (r);
+           /* A type conversion to reference type will be enclosed in
+              such an indirect ref, but the substitution of the cast
+              will have also added such an indirect ref.  */
+           if (TREE_CODE (TREE_TYPE (r)) == REFERENCE_TYPE)
+             r = convert_from_reference (r);
          }
        else
          r = build_x_indirect_ref (r, "unary *");
index 74380d36a92bdcc1fcfa188b4b2498301f60257e..9d347c299d19050aa548a508b39416c7b7b5588d 100644 (file)
@@ -4767,7 +4767,7 @@ build_static_cast (tree type, tree expr)
       expr = build_min (STATIC_CAST_EXPR, type, expr);
       /* We don't know if it will or will not have side effects.  */
       TREE_SIDE_EFFECTS (expr) = 1;
-      return expr;
+      return convert_from_reference (expr);
     }
 
   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
@@ -4983,7 +4983,7 @@ build_reinterpret_cast (tree type, tree expr)
          && type_dependent_expression_p (expr))
        /* There might turn out to be side effects inside expr.  */
        TREE_SIDE_EFFECTS (t) = 1;
-      return t;
+      return convert_from_reference (t);
     }
 
   return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
@@ -5111,7 +5111,7 @@ build_const_cast (tree type, tree expr)
          && type_dependent_expression_p (expr))
        /* There might turn out to be side effects inside expr.  */
        TREE_SIDE_EFFECTS (t) = 1;
-      return t;
+      return convert_from_reference (t);
     }
 
   return build_const_cast_1 (type, expr, /*complain=*/true,
@@ -5137,7 +5137,7 @@ build_c_cast (tree type, tree expr)
                          tree_cons (NULL_TREE, value, NULL_TREE));
       /* We don't know if it will or will not have side effects.  */
       TREE_SIDE_EFFECTS (t) = 1;
-      return t;
+      return convert_from_reference (t);
     }
 
   /* Casts to a (pointer to a) specific ObjC class (or 'id' or
index eaebf8a29ad29da6ab014a894c7179147d06a261..d94cb679d0eb6fa0e3d054f3a90746388625d21b 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-14  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/18949
+       * g++.dg/template/cast1.C: New.
+
 2004-12-13  Richard Henderson  <rth@redhat.com>
 
        * gcc.dg/i386-sse-10.c: Fix typo in options.
diff --git a/gcc/testsuite/g++.dg/template/cast1.C b/gcc/testsuite/g++.dg/template/cast1.C
new file mode 100644 (file)
index 0000000..fca3511
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18949. Forgot to convert from reference.
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A
+{
+    void foo();
+};
+
+template<int> void bar(A& a)
+{
+    const_cast<A&>(a).foo();
+    static_cast<A&>(a).foo();
+    reinterpret_cast<A&>(a).foo();
+    ((A&)a).foo();
+}
+
+template void bar<0>(A& a);